Open GLのアニメーションについて
Posted: 2014年12月09日(火) 14:37
現在、OpenGLによる3次元プログラミングというコロナ社の教科書を使って勉強しています。
ロケットの、円柱の部分、円錐の部分、羽と、噴出口の部分を、y軸回りに全て回転させたいのですが、うまくいきません。。
この状態で実行すると、ロケットの円柱と、円錐の部分の形が崩れてしまいます・・
idel関数等を追加したら、このようにロケットの原型もない形になってしまいました。
また、glRotatef()は各部分の前に差し込めばいいのでしょうか。
教えていただける方いましたら宜しくお願いします。
上のプログラムが、ロケットに①アニメーション設定中のプログラム、下が、②ロケットのプログラムになります。
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#include "myShape.h"
#define KEY_ESC 27
float theta = 0.0;
void display( void )
{
float r;
r = 2.0;
glClear( GL_COLOR_BUFFER_BIT );
glPushMatrix();
glTranslatef( 0.0, 0.0, -20.0 );
glPushMatrix();
glTranslatef( 0.0, 1.0, 0.0 );
glColor3f(1.0, 0.0, 0.0);
myWireCylinder( 1.0, 2.0, 12 );
glTranslatef( 0.0, 1.0, 0.0);
glRotatef( -90.0, 1.0, 0.0, 0.0 );
glColor3f(1.0,0.0,0.0);
glutWireCone( 1.0, 2.0, 12, 3 );
glPopMatrix();
glTranslatef( 0.0, -1.0, 0.0 );
glColor3f(1.0, 0.0, 0.0);
myWireCylinder( 1.0, 2.0, 12 );
glPopMatrix();
glPushMatrix();
glTranslatef(0.0, 0.0, -20.0);
glPushMatrix();
glTranslatef(-1.0, -1.0, 0.0);
glPushMatrix();
glPopMatrix();
glColor3f(1.0, 1.0, 1.0);
glutWireCube(r);
glPopMatrix();
glPushMatrix();
glTranslatef(1.0, -1.0, 0.0);
glutWireCube(r);
glPopMatrix();
glTranslatef(0.0, -2.5, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glutWireCone(0.5, 1.0, 12, 3);
glutSwapBuffers();
}
void idle(void)
{
theta = fmod(theta + 0.5, 360.0);
glutPostRedisplay();
}
void myKbd( unsigned char key, int x, int y )
{
if( key == KEY_ESC ) exit( 0 );
}
void myInit (char *progname)
{
int width = 300, height = 600;
float aspect = (float) width / (float) height;
glutInitWindowPosition(0, 0);
glutInitWindowSize( width, height );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA );
glutCreateWindow(progname);
glClearColor (0.0, 0.0, 0.0, 1.0);
glutKeyboardFunc( myKbd );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, aspect, 1.0, 50.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
myInit(argv[0]);
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return( 0 );
}
①
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#include "myShape.h"
#define KEY_ESC 27
float theta = 0.0;
void display( void )
{
float r;
r = 2.0;
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.0, 0.0, -20.0);
glPushMatrix();
glTranslatef(0.0, 1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
myWireCylinder(1.0, 2.0, 12);
glTranslatef(0.0, 1.0, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glutWireCone(1.0, 2.0, 12, 3);
glPopMatrix();
glTranslatef(0.0, -1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
myWireCylinder(1.0, 2.0, 12);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0, 0.0, -20.0);
glPushMatrix();
glTranslatef(-1.0, -1.0, 0.0);
glPushMatrix();
glPopMatrix();
glColor3f(1.0, 1.0, 1.0);
glutWireCube(r);
glPopMatrix();
glPushMatrix();
glTranslatef(1.0, -1.0, 0.0);
glutWireCube(r);
glPopMatrix();
glTranslatef(0.0, -2.5, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glutWireCone(0.5, 1.0, 12, 3);
glFlush();
}
void myKbd( unsigned char key, int x, int y )
{
if( key == KEY_ESC ) exit( 0 );
}
void myInit (char *progname)
{
int width = 500, height = 500;
float aspect = (float) width / (float) height;
glutInitWindowPosition(0, 0);
glutInitWindowSize( width, height );
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(progname);
glClearColor (0.0, 0.0, 0.0, 1.0);
glutKeyboardFunc( myKbd );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, aspect, 1.0, 50.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
myInit(argv[0]);
glutDisplayFunc(display);
glutMainLoop();
return( 0 );
}
②
ロケットの、円柱の部分、円錐の部分、羽と、噴出口の部分を、y軸回りに全て回転させたいのですが、うまくいきません。。
この状態で実行すると、ロケットの円柱と、円錐の部分の形が崩れてしまいます・・
idel関数等を追加したら、このようにロケットの原型もない形になってしまいました。
また、glRotatef()は各部分の前に差し込めばいいのでしょうか。
教えていただける方いましたら宜しくお願いします。
上のプログラムが、ロケットに①アニメーション設定中のプログラム、下が、②ロケットのプログラムになります。
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#include "myShape.h"
#define KEY_ESC 27
float theta = 0.0;
void display( void )
{
float r;
r = 2.0;
glClear( GL_COLOR_BUFFER_BIT );
glPushMatrix();
glTranslatef( 0.0, 0.0, -20.0 );
glPushMatrix();
glTranslatef( 0.0, 1.0, 0.0 );
glColor3f(1.0, 0.0, 0.0);
myWireCylinder( 1.0, 2.0, 12 );
glTranslatef( 0.0, 1.0, 0.0);
glRotatef( -90.0, 1.0, 0.0, 0.0 );
glColor3f(1.0,0.0,0.0);
glutWireCone( 1.0, 2.0, 12, 3 );
glPopMatrix();
glTranslatef( 0.0, -1.0, 0.0 );
glColor3f(1.0, 0.0, 0.0);
myWireCylinder( 1.0, 2.0, 12 );
glPopMatrix();
glPushMatrix();
glTranslatef(0.0, 0.0, -20.0);
glPushMatrix();
glTranslatef(-1.0, -1.0, 0.0);
glPushMatrix();
glPopMatrix();
glColor3f(1.0, 1.0, 1.0);
glutWireCube(r);
glPopMatrix();
glPushMatrix();
glTranslatef(1.0, -1.0, 0.0);
glutWireCube(r);
glPopMatrix();
glTranslatef(0.0, -2.5, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glutWireCone(0.5, 1.0, 12, 3);
glutSwapBuffers();
}
void idle(void)
{
theta = fmod(theta + 0.5, 360.0);
glutPostRedisplay();
}
void myKbd( unsigned char key, int x, int y )
{
if( key == KEY_ESC ) exit( 0 );
}
void myInit (char *progname)
{
int width = 300, height = 600;
float aspect = (float) width / (float) height;
glutInitWindowPosition(0, 0);
glutInitWindowSize( width, height );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA );
glutCreateWindow(progname);
glClearColor (0.0, 0.0, 0.0, 1.0);
glutKeyboardFunc( myKbd );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, aspect, 1.0, 50.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
myInit(argv[0]);
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return( 0 );
}
①
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <math.h>
#include "myShape.h"
#define KEY_ESC 27
float theta = 0.0;
void display( void )
{
float r;
r = 2.0;
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.0, 0.0, -20.0);
glPushMatrix();
glTranslatef(0.0, 1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
myWireCylinder(1.0, 2.0, 12);
glTranslatef(0.0, 1.0, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glutWireCone(1.0, 2.0, 12, 3);
glPopMatrix();
glTranslatef(0.0, -1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
myWireCylinder(1.0, 2.0, 12);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0, 0.0, -20.0);
glPushMatrix();
glTranslatef(-1.0, -1.0, 0.0);
glPushMatrix();
glPopMatrix();
glColor3f(1.0, 1.0, 1.0);
glutWireCube(r);
glPopMatrix();
glPushMatrix();
glTranslatef(1.0, -1.0, 0.0);
glutWireCube(r);
glPopMatrix();
glTranslatef(0.0, -2.5, 0.0);
glRotatef(-90.0, 1.0, 0.0, 0.0);
glutWireCone(0.5, 1.0, 12, 3);
glFlush();
}
void myKbd( unsigned char key, int x, int y )
{
if( key == KEY_ESC ) exit( 0 );
}
void myInit (char *progname)
{
int width = 500, height = 500;
float aspect = (float) width / (float) height;
glutInitWindowPosition(0, 0);
glutInitWindowSize( width, height );
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(progname);
glClearColor (0.0, 0.0, 0.0, 1.0);
glutKeyboardFunc( myKbd );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, aspect, 1.0, 50.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
myInit(argv[0]);
glutDisplayFunc(display);
glutMainLoop();
return( 0 );
}
②