我正在尝试创建一个简单的场景,我可以在其中四处走动,标准是能够平移并使用 key 四处走动。但是,在我的绘制场景功能中,当我平移场景而不是旋转时,平移无法正常工作,因为整个场景只是围绕我旋转,导致对象穿过我。当我旋转而不是平移场景时,我可以正确平移,但是,我只能向某个方向移动,因此如果我向右平移 90 度,我将向左移动而不是向前移动。无论如何,我可以将这两种效果放在一起吗?
这是我用来绘制 View 的代码:
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
glTranslated(xposition, 0, zposition); //This is where I translate my views
glRotated(yrot, 0, 1, 0); //
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER_ARB, quadVBO);
glNormalPointer(GL_FLOAT, 0, (void*)sizeof(sideArray));
glColorPointer(3, GL_FLOAT, 0, (void*)sizeof(sideArray)+sizeof(normals));
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, sizeof(sideArray)/sizeof(GLfloat)/3);
glPopMatrix();
glFlush();
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
以下是一些说明我现在问题的图片:
旋转然后翻译:
图1
http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.39%20PM.PNG
图2
我可以模仿相机的转动
http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.17.48%20PM.PNG
图3
然而,当我向前走时,它只向一个方向走,而不是我正在看的方向。
http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.30%20PM.PNG
http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.18.39%20PM.PNG
翻译然后旋转:
图1
http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.44%20PM.PNG
图2
我可以自由地四处走动,径直走向我正在看的任何方向。
http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.19.52%20PM.PNG
图3
但是,当我旋转场景时,整个事物都会旋转,这会导致对象穿过我并且不再像我旋转然后平移我的 View 那样在 View 中“平移”。
http://dl.dropbox.com/u/2747708/Screen%20Shot%202012-04-03%20at%2010.20.01%20PM.PNG
最佳答案
你的问题不在于转换的顺序。您应该旋转然后平移。
问题是您在移动时没有考虑旋转。运动公式:
movementX = sin(direction);
movementY = cos(direction);
其中方向是从北顺时针旋转的弧度数,正 X 是东,正 Y 是北。
关于c - 我应该先翻译还是先旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9994346/