Когда я переводил свою трехмерную модель по экрану, движение не выглядит гладким. Он прыгает (не удивительно, поскольку я переводил в 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).
}
}
Но мой аниматор настроен на 60 кадров в секунду. Разве это не достаточно быстро? –
60fps наверняка достаточно быстр. Но то, как вы сформулировали свой комментарий, заставляет меня предположить, что вы используете какой-то таймер для запуска событий перерисовывания. Не используйте таймеры для управления кадрами! Как только кадр будет отображаться, вызовите событие, которое сделает следующий кадр. Пусть V-Sync делает ограничение частоты кадров для вас. – datenwolf
Вы должны скорее измерить прошедшее время между двумя кадрами (и включить v-sync, если вы хотите отображать 60 кадров в секунду) для вычисления перевода. – gouessej