2013-08-19 73 views
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); 

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

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; 
} 
+5

请不要让人下载并执行未知的二进制文件。如果必须,请通过pastebin或gitourious,github等存储库提供完整的源代码。 **但没有BINARY EXECUTABLES!** – datenwolf

+0

好的,我编辑并添加了完整的源代码。 – nadirg

+0

我认为问题是关于窦余弦函数。 因为我不能看到没有它们的动摇 gluLookAt(movex,3-(roty/2),movez +5,movex,roty,movez,0,1,0); 但我需要他们从后面跟踪物体。 – nadirg

回答

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); 
+0

我在抽签前更新,但结果相同。 我以为当我与很多模特/对象合作时,你所说的相机系统会造成滞后?当我移动时,程序将翻译所有对象。因为程序翻译地球。 – nadirg

+0

这就是摄像头的实现方式。 gluLookAt调用以类似的方式将变换应用于模型视图矩阵 - 移动场景中的所有对象。这并不昂贵,因为所有这些操作都合并到单个4x4模型视图矩阵中,该矩阵用于转换您绘制的任何内容。至于抖动,我只能推测,在没有看到主循环结构的情况下更新和绘制事物的顺序仍然存在问题。 – jozxyqk