2016-09-26 3 views
-2

В последнее время я занимаюсь программированием openGL, и он вызывает преобразование базовой матрицы, такое как перевод, вращение и масштабирование. При выполнении вращения возникают некоторые проблемы. Вот мой вопрос.Постоянный угол поворота OpenGL

Теперь я использую переменную rotationDegree и переменную rotationStepSize для управления вращением. Когда флаг поворота на

//inside paintGL function 
if(rotationFlag is on) 
    rotationDegree += rotationStepSize 
    if(rotationDegree > 360.0f) 
     rotationDegree -= 360.0f 

Вот странное дело, Так как я определяю rotationStepSize быть очень маленьким, вращение начинается очень медленно, но со временем увеличивается, оно становится все быстрее и быстрее!

я придумал два объяснения этого явления:

  • 360f не диапазон значений для параметра степени в GLM :: вращать
  • Программа начинается медленно, в результате чего paintGL краситься для экрана меньше. Затем, когда программа становится устойчивой (или другой параметр не меняется), mainLoopEvent выполняет все быстрее и быстрее, заставляя paintGL рисоваться больше.

Кто-нибудь знает, как решить эту проблему? Я googled об использовании glutget (GL_TIME_ELAPSED), но на моей машине эта функция сообщает «glutget: missing ENUM handle», что указывает на то, что мой файл переполнения не завершен, я думаю?

Так кто-нибудь знает, как исправить проблему перечисления или как обойти это, чтобы создать сцену, где у меня есть объект, вращающийся с постоянной скоростью?

Большое спасибо!

+0

только ставку, но есть вы используете 'glLoadIdentity' или любой другой метод сброса матрицы? если нет, то вы вращаете уже повернутую матрицу, означающую, что приращение шага - это скорость. – Spektre

+0

Извините, я не был в курсе деталей вопроса. Я использую новый openGL, способный программировать конвейер. Каждый раз, когда я буду переводить объект обратно в начало координат, поверните его на степень, указанную в rotationDegree, и переведите объект обратно в исходное положение. Все они помещаются внутри одной матрицы, и затем я передам эту матрицу modelToWorld в вершинный шейдер. –

+0

точка остается проверить, является ли матрица единицей (или в определенном начальном состоянии) перед каждым фреймом ... – Spektre

ответ

1

В соответствии с freeglut_state.c существует функция glutGet.

int FGAPIENTRY glutGet(GLenum eWhat) 
{ 
#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE 
    int returnValue ; 
    GLboolean boolValue ; 
#endif 

    switch (eWhat) 
    { 
     case GLUT_INIT_STATE: 
     return fgState.Initialised; 

     case GLUT_ELAPSED_TIME: 
     return fgElapsedTime(); 
    } 

Я не использую freeglut, но посмотрите на docmentation, может быть, вы должны попробовать GLUT_ELAPSED_TIME вместо GL_TIME_ELAPSED?

И вычислить DeltaTime так:

int preTime= 0; 
while(...) 
{ 
    int currentTime= glutGet(GLUT_ELAPSED_TIME); 
    int deltaTime = currentTime- preTime; 
    preTime = currentTime; 

    //... pass the deltaTime to whatever you want... 
} 
Смежные вопросы