2014-09-26 2 views
0

Когда я переводил свою трехмерную модель по экрану, движение не выглядит гладким. Он прыгает (не удивительно, поскольку я переводил в 1 раз) в каждый из переведенных мест. Мой вопрос заключается в том, как заставить модель перемещаться по экрану, не показывая этот эффект дрожания/прыжка. Я попытался уменьшить коэффициент перевода, но это, конечно, замедляет движение слишком много. Следующий блок кода на дисплее (GLAutoDrawable Drawable) {} процедура:Движение гладкой модели в OpenGL 3D

for (float x = -8;x < 8; x+=2){ 
    for (float z = -8; z < 8; z+=2){ 

     view2 = rotate(view,(float)20,(float)1,(float)0,0); //rotate 30deg on x 

     //rotate the model. spin on Y. (rotate is a custom func - not using 
     //old glRotate) 
     view2 = rotate(view2,(float)rotAngle,(float)0,(float)1,0); 

     //transX and transY are incremented/decremented by 1 every time 
     //the KeyPressed event is fired. Animator running at 60fps. 
     //translate() is a simple matrix multiplier. This is where 
     //the model gets its new co-ordinates (that it jumps to...) 
     view2 = translate(view2, (float)transX - x, 0, transZ - z); 

     //pass transform to the vertex shader 
     gl.glUniformMatrix4fv(iView, 1, false, view2, 0); 

     //the projection matrix (static) 
     gl.glUniformMatrix4fv(iProj, 1, false, projection, 0); 

     gl.glDrawArrays(GL3.GL_TRIANGLES, 0, 36); //draw 12 triangles (36 vertices). 

    } 
} 

ответ

2

Redraw так быстро, как это возможно; вы должны достичь не менее 40 кадров в секунду, чтобы все казалось плавным; при более низких частотах кадров вам понадобится размытие движения, чтобы скрыть дергание.

Между рамками рисунка измеряет время между те же точки в коде чертежа данного кадра и двигаться в соответствии с этим. Обратите внимание, что

SwapBuffers возвращается почти сразу, независимо от того, включен ли V-Sync или нет. В конечном итоге это будет конец OpenGL.

+0

Но мой аниматор настроен на 60 кадров в секунду. Разве это не достаточно быстро? –

+1

60fps наверняка достаточно быстр. Но то, как вы сформулировали свой комментарий, заставляет меня предположить, что вы используете какой-то таймер для запуска событий перерисовывания. Не используйте таймеры для управления кадрами! Как только кадр будет отображаться, вызовите событие, которое сделает следующий кадр. Пусть V-Sync делает ограничение частоты кадров для вас. – datenwolf

+0

Вы должны скорее измерить прошедшее время между двумя кадрами (и включить v-sync, если вы хотите отображать 60 кадров в секунду) для вычисления перевода. – gouessej

Смежные вопросы