OpenGL - 使用gluLookAt在立方体周围旋转非常快速

时间:2013-02-02 20:16:43

标签: opengl rotation glulookat

我正在尝试使用gluLookAt移动以原点为中心的立方体,而不是直接在对象上执行R * T转换。起初,我不知道如何解决这个问题。然后我意识到(在圆形坐标中实现一半解决方案之后)我应该尝试使用球面坐标系表示。我能够写一些代码来做到这一点,但我(相机的“眼睛”)在立方体周围快速旋转。另外,我注意到我移动的位置也更接近立方体,而不是保持恒定的半径。当我使用Rotate * Translate方法时,它以更合适的速率旋转并具有相同的距离。

我的旋转方法是使用球面坐标,但我不确定这是否正确。我根据the Wikipedia page上的图表计算了两个角度。我计算当前点的大小(distX,distY,distZ)。我们最初在XY平面中观察负Z平面)。我还给出了两个角度,一个用于指定围绕x轴的旋转角度,另一个用于指定y轴。这五个值是根据鼠标点击的方式计算的。

我根据某些trig计算theta和phi,然后最终计算新位置。这些公式可以在之前的链接中找到。最后一步是将其插入gluLookAt。再一次,在运行这个程序时,我能够围绕立方体旋转,但它非常快并且也可以翻译相机。我做错了什么?

如果您想引用我的代码,我会在下面列出。引用'y'和'up'的部分是我尝试计算绕Z轴的旋转。我可以用最好的方式描述旋转,如果你看一个物体,想象自己是相机,并左右倾斜你的头。我没有把它包含在我对gluLookAt的调用中,因为我无法使用它。

编辑:它现在以正确的速率旋转,但它不会完全旋转。通过这个,我的意思是在旋转时,“眼睛”以一个角度朝向立方体移动,但随后将旋转回去,撤消旋转。但这会循环,因此眼睛所采用的路径看起来类似于弯曲的无限符号。

void sceneTransformation(){
glLoadIdentity( );
    //Using the R*T approach. Works flawlessly
//glTranslatef(-distX, distY, -distZ);
//glRotatef( anglex, 1.0, 0.0, 0.0 );
//glRotatef( angley, 0.0, 1.0, 0.0 );

GLdouble radx = anglex*PI/180.;
GLdouble rady = angley*PI/180.;

GLdouble l = sqrt(pow(distX, 2) + pow(distY, 2) + pow(distZ, 2));
GLdouble phi = atan(distY/distZ) + radx;
GLdouble theta = acos(distZ/l) + radx;


GLdouble deltaZ = l*sin(theta)*cos(phi);
GLdouble deltaY = l*sin(theta)*sin(phi);
GLdouble deltaX = l*cos(theta);


GLdouble ytheta = atan(distX/distY); 
GLdouble y = sqrt(pow(distX,2) + pow(distY, 2));
GLdouble yangle = PI/2.-ytheta-rady;

GLdouble up_y = y*sin(yangle);
GLdouble up_x = y*cos(yangle);

gluLookAt((distX - deltaX), (distY - deltaY), (distZ - deltaZ), 0, 0, 0, 0,1,0);
}

3 个答案:

答案 0 :(得分:2)

数学函数如sin()cos()和朋友期望以弧度输入,而不是度数。看起来你正在假设学位,所以你的旋转速度比预期快57.3倍(确切地说:360 /(2 * pi))。

答案 1 :(得分:0)

您需要以移动时间为基础,这意味着将旋转角度与开始的最后一帧和当前帧之间的差值相乘。

angle += 90 * timeDelta; // Rotate by 90 degree each second

答案 2 :(得分:0)

您的问题有一个很好的解决方案。采取一些调查,但我认为它将满足您的需求。 Quaternions

Some code for it

适合将矢量转换为旋转和向后