Функция отображения ПЕРЕНАСЫЩЕНИЯ вызывается при событии без установки обратного вызова

#c #opengl #glut #freeglut

#c #opengl #перенасыщение #freeglut

Вопрос:

у меня странная ситуация, когда функция отображения вызывается при нажатии мыши или клавиши, даже если я не установил обратный вызов мыши или обратный вызов клавиши, также все переменные остаются постоянными, но объект всегда перемещается независимо от того, какое событие произошло

итак, есть две проблемы:

  1. почему функция отображения вызывается при событии, даже если нет ни одной из предустановленных функций обратного вызова?
  2. почему мой объект или 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 вызывается. Он может быть вызван в любое время. Вы не можете это контролировать.