0

您好,我正在做一个项目,当我移动主要对象时出现屏幕/地面抖动问题。

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

看:用鼠标右键给出像 30 的度数。(不要释放按钮)并在旋转对象时保持 w 按钮。你会看到地面的震动。

我认为问题在于我的 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;
}
4

1 回答 1

0

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

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

您的 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);
于 2013-08-20T08:58:26.440 回答