Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 28.8.2009
Репутация: нет Всего: нет
|
Только начал обучаться OpenGL. Модифицировал учебный пример, чтобы его можно было вращать по осям Ox и Oy. Первые несколько секунд вращается нормально (угол меняется клавишами). А потом yRot продолжает меняться при нажатии, одноко картика не изменяется. В тоже время по оси Ох ващается нормально. В чем может быть ошибка? | Код | #include <glut.h> #include <math.h>
#define GL_PI 3.1415f
static GLfloat fElect = 0.0f; static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f;
void RenderScene(void) { int n = 256; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -100.0f); glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f); // Ядро glColor3f(1.0f, 0.0f, 0.0f); glutSolidSphere(10.0f, 15.0f, 15.0f); glColor3f(1.0f, 1.0f, 0.0f); // Электрон №1 glPushMatrix(); glRotatef(fElect, 0.0f, 1.0f, 0.0f); glBegin(GL_LINE_LOOP); for (int i = 0; i < n; i++) { double angle = 2*GL_PI*i/n; glVertex3f(90.0*cos(angle), 0.0f, 90.0*sin(angle)); } glEnd(); glTranslatef(90.0f, 0.0f, 0.0f); glutSolidSphere(6.0f, 15.0f, 15.0f); glPopMatrix();
// Электрон №2 glPushMatrix(); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glRotatef(fElect, 0.0f, 1.0f, 0.0f); glBegin(GL_LINE_LOOP); for (int i = 0; i < n; i++) { double angle = 2*GL_PI*i/n; glVertex3f(70.0*cos(angle), 0.0f, 70.0*sin(angle)); } glEnd(); glTranslatef(-70.0f, 0.0f, 0.0f); glutSolidSphere(6.0f, 15.0f, 15.0f); glPopMatrix();
// Электрон №3 glPushMatrix(); glRotatef(360.0f - 45.0f, 0.0f, 0.0f, 1.0f); glRotatef(fElect, 0.0f, 1.0f, 0.0f); glBegin(GL_LINE_LOOP); for (int i = 0; i < n; i++) { double angle = 2*GL_PI*i/n; glVertex3f(60.0*cos(angle), 0.0f, 60.0*sin(angle)); } glEnd(); glTranslatef(0.0f, 0.0f, 60.0f); glutSolidSphere(6.0f, 15.0f, 15.0f);
fElect += 5.0f; if(fElect > 360.0f) fElect = 0.0f; glutSwapBuffers(); }
void SetupRC(void) { glEnable(GL_DEPTH_TEST); glFrontFace(GL_CCW); glEnable(GL_CULL_FACE); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); }
void SpecialKeys(int key, int x, int y) { if(key == GLUT_KEY_UP) xRot -= 5.0f; if(key == GLUT_KEY_DOWN) xRot += 5.0f; if(key == GLUT_KEY_LEFT) yRot -= 5.0f; if(key == GLUT_KEY_RIGHT) yRot += 5.0f; if(xRot > 356.0f) xRot = 0.0f; if(xRot < -1.0f) xRot = 355.0f; if(yRot > 356.0f) yRot = 0.0f; if(yRot < -1.0f) yRot = 355.0f; glutPostRedisplay(); }
void TimerFunc(int value) { glutPostRedisplay(); glutTimerFunc(50, TimerFunc, 1); }
void ChangeSize(int w, int h) { GLfloat nRange = 100.0f; if(h ==0) h = 1; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w <= h) glOrtho(-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange*2.0f, nRange*2.0f); else glOrtho(-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange*2.0f, nRange*2.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("Atom Ordinary"); glutSpecialFunc(SpecialKeys); glutReshapeFunc(ChangeSize); glutDisplayFunc(RenderScene); glutTimerFunc(500, TimerFunc, 1); SetupRC(); glutMainLoop(); return 0; }
|
Это сообщение отредактировал(а) SergeAndK - 28.8.2009, 08:59
|