#c #opengl #glut #freeglut
#c #opengl #перенасыщение #freeglut
Вопрос:
у меня странная ситуация, когда функция отображения вызывается при нажатии мыши или клавиши, даже если я не установил обратный вызов мыши или обратный вызов клавиши, также все переменные остаются постоянными, но объект всегда перемещается независимо от того, какое событие произошло
итак, есть две проблемы:
- почему функция отображения вызывается при событии, даже если нет ни одной из предустановленных функций обратного вызова?
- почему мой объект или cam перемещается, даже если переменные не меняются?
float camX = 0, camY = 2, camZ = 20;
float camXdest = 0, camYdest = 0, camZdest = 0;
float camUpx = 0, camUpy = 1, camUpz = 0;
float JbaseOffest = -15;
float JoffestDegree[3] = { JbaseOffest,0,0 };
float JrotateAxis = 2, JrotateDegree = 0;
float Jsize = 1;
void Reshape(int width, int hieght) {
glViewport(0, 0, width, hieght);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float ratio = width / hieght;
gluPerspective(40, ratio, 0, 50);
}
void Rotate(float degree, int axis) {
if (axis == 0)
glRotatef(degree, 1, 0, 0);
else if (axis == 1)
glRotatef(degree, 0, 1, 0);
else if (axis == 2)
glRotatef(degree, 0, 0, 1);
}
void DrawJ(float dx = 0, float dy = 0, float dz = 0, float rotateDegree = 0, float rotateAxis = 0, float sizeCoefficient = 1) {
glPushMatrix();
//draw head of J
float size = 0.5 * sizeCoefficient;
glTranslatef(dx, dy size * 4, dz);
glTranslatef(-size * 3, 0, 0);
Rotate(rotateDegree, rotateAxis);
int i = 0;
for (; i < 6; i ) {
glutSolidCube(size);
glTranslatef(size, 0, 0);
}
//draw body of J
glTranslatef(-7 * size / 2, 0, 0);
i = 0;
for (; i < 6; i ) {
glutSolidCube(size);
glTranslatef(0, -size, 0);
}
glPopMatrix();
}
void Display() {
glClear(GL_COLOR_BUFFER_BIT);
gluLookAt(camX, camY, camZ, camXdest, camYdest, camZdest, camUpx, camUpy, camUpz);
DrawJ(JoffestDegree[0], JoffestDegree[1], JoffestDegree[2], JrotateDegree, JrotateAxis, Jsize);
//DrawS(SoffestDegree[0], SoffestDegree[1], SoffestDegree[2], SrotateDegree, SrotateAxis, Ssize);
//DrawM(MoffestDegree[0], MoffestDegree[1], MoffestDegree[2], MrotateDegree, MrotateAxis, Msize);
glutSwapBuffers();
}
int main(int argc, char** argv) {
glutInit(amp;argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
glutCreateWindow("Main");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
//glutKeyboardFunc(CallBackKeyEvent);
glutMainLoop();
}
Комментарии:
1. Где ваша
Display
функция? ВыglutPostRedisplay
где-нибудь вызываете?2. извините, я сократил код до post. добавить отображение . glutPostRedisplay вызывается при CallbackKeyEvent , но, как вы видите, он никогда не используется
3. Смотрите
glutDisplayFunc
— «Когда ПЕРЕНАСЫЩЕНИЕ определяет, что нормальная плоскость для окна должна быть повторно отображена, вызывается обратный вызов отображения для окна.» . Когда окно получает уведомление о том, что отображение должно быть перерисовано, вызывается обратный вызов отображения. Следовательно, это зависит от ОС, когдаDisplay
вызывается. Он может быть вызван в любое время. Вы не можете это контролировать.