物体移动时屏幕抖动

时间:2013-08-19 21:15:02

标签: visual-c++ opengl shake

你好我正在研究一个项目,我遇到了问题 当我移动主要物体时,屏幕/地面震动。

通常当我用“w”按钮移动时,我不会遇到问题。 但如果我在旋转相机时移动我就会遇到问题。

要看:用鼠标右键给出30度的学位。(不要释放按钮) 并在旋转物体时保持按钮。 你会看到地面上的震动。

我认为问题在于我的looat函数计算。

gluLookAt(sin(rot*PI/180)*(10-fabs(roty)/4) +movex ,3-(roty/2), cos(rot*PI/180)*(10-(fabs(roty)/4)) +movez , -sin(rot*PI/180)*6 + movex, roty, -cos(rot*PI/180)*6 +movez, 0, 1, 0);

这是我的旋转功能。我在这个功能之后画了一切。

void System::rotater(){

if(mouseStates[2][0]==1 && mx!= savex && mx!=mouseStates[2][1]){
    rot += (mx-mouseStates[2][1]) * 90 / glutGet(GLUT_WINDOW_WIDTH)/2;
    if(rot>360)rot-=360;
    if(rot<0)rot= 360+rot;

}


glRotatef(rot,0,1,0);
}

最后我的移动选项在这里:

if(a==87 || a==119){
movex -= sin(rot*PI/180)/3;
movez -= cos(rot*PI/180)/3;
}

1 个答案:

答案 0 :(得分:0)

我发现在绘制场景之前(或物理引擎导致它:P),屏幕抖动问题通常与处理事件,更新对象和相机的顺序有关。如果帧率很高,您可能不会注意到小的瑕疵。您可能需要添加Sleep / usleep以帮助揭示这些问题。例如,如果您的相机位置基于相机旋转,但在处理鼠标事件之前更新位置,则相机位置/旋转可能是一帧不同步。

这是在非常独立的阶段处理输入,移动和渲染的一个很好的理由。

你的lookAt功能确实看起来相当复杂。 lookAt非常有用,当你想要一个可以看到东西的相机时,但在这种情况下,你是在一个相机位置之后的相机之后。通过在绘制场景之前手动构建逆变换以定位摄像机对象,这更容易实现。例如,如果您想向左移动,请将其他所有内容正确翻译(因此反向)...

glLoadIdentity();
glRotatef(camera.rotX, 1.0f, 0.0f, 0.0f);
glRotatef(camera.rotY, 0.0f, 1.0f, 0.0f);
glRotatef(camera.rotZ, 0.0f, 0.0f, 1.0f);
glTranslatef(-camera.posX, -camera.posY, -camera.posZ);