在opengl中旋转物体
问题描述:
当我按下某个键时,需要在一个轴上旋转场景。以下是我如何实现它在opengl中旋转物体
int rotateFlag;
void rotateScene(int x){
if(x)//rotate 45 deg on x axis
glRotatef(45,1,0,0);
else // roatate 45 deg on y axis
glRotatef(45,0,1,0);
}
//this is the function I call in glutDisplayFunc
void drawScene(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//I'm looking at the origin (center of my scene)
gluLookAt (x, y, z, 0,0,0, 0.0, 1.0, 0.0);
rotateScene(rotateFlag);
drawObjects();//draw Objects in Scene
}
我为rotateFlag赋值,当我按左键或向上键时。它只旋转场景一次,因为我的函数rotateScene 总是将glRotatef应用于我应该避免的场景的原始布局。有人知道我如何保存旋转的场景,这样我就可以对其应用我的功能(旋转的场景),并且每次按下箭头键时旋转场景?我希望我明确自己。
我通过增加在X和Y的角度尝试另一种解决方案,因为我按下键
If keypress left
angleX+=45;
else if keypress up
angleY+=45;
和调整我的rotateScene到
void rotateScene(){
glRotatef(angleX,1,0,0);
glRotatef(angleY,0,1,0);
}
当我个人进行旋转一切都在朝好的方向发展但是,当我做Y首先旋转然后我执行旋转X,场景的旋转是不正确的。也许这是因为opengl在Y上旋转之前首先执行旋转,因为函数调用中的顺序。我无法正确使用这个功能,因为在我的应用程序中,旋转场景的顺序非常重要。
答
使用glPushMatrix()
将矩阵推送到矩阵堆栈并将glPopMatrix()
推回到矩阵堆栈。
旋转不可交换。简而言之,这意味着围绕X旋转然后围绕Y旋转与围绕Y旋转Y并不相同。这是一个简单的数学原理,确实引起了很多混淆。每当你在OpenGL中围绕一个轴进行旋转时,坐标系都会改变它的方向。另一方面,翻译不是一个问题 - 首先沿着X,然后沿着Y,然后沿着Z,先翻译Y,然后沿X翻译,然后沿着Z翻译。我们到达空间中的相同点(除非旋转具有同时应用)。 – rbaleksandar 2014-02-27 09:04:31