你好我正在研究一个项目,我遇到了问题 当我移动主要物体时,屏幕/地面震动。
通常当我用“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;
}
答案 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);