2012-03-04 121 views
1

当我按下某个键时,需要在一个轴上旋转场景。以下是我如何实现它在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上旋转之前首先执行旋转,因为函数调用中的顺序。我无法正确使用这个功能,因为在我的应用程序中,旋转场景的顺序非常重要。

+0

旋转不可交换。简而言之,这意味着围绕X旋转然后围绕Y旋转与围绕Y旋转Y并不相同。这是一个简单的数学原理,确实引起了很多混淆。每当你在OpenGL中围绕一个轴进行旋转时,坐标系都会改变它的方向。另一方面,翻译不是一个问题 - 首先沿着X,然后沿着Y,然后沿着Z,先翻译Y,然后沿X翻译,然后沿着Z翻译。我们到达空间中的相同点(除非旋转具有同时应用)。 – rbaleksandar 2014-02-27 09:04:31

回答

1

使用glPushMatrix()将矩阵推送到矩阵堆栈并将glPopMatrix()推回到矩阵堆栈。