2013-02-02 58 views
1

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

我的旋转方法是使用球坐标,但我不确定这是否正确。根据位于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); 
} 

回答

2

数学功能,如sin()cos(),和朋友们期待的弧度,不度输入。看起来你正在度假,所以你比预期快了大约57.3倍(正好:360 /(2 * pi))。

+0

我明白你在说什么。我将所有“anglex”和“angley”变量分别改为“radx”和“rady”。我仍然很快旋转魔方。 – soplu

+0

@soplu:你的'up_y'和'up_x'仍然被计算为角度。 – sheu

+0

我错过了,但现在它已修复。但是,当我打电话给gluLookAT时,我不会使用up_y或up_x。 – soplu

0

您需要使您的运动基于时间,这意味着将旋转角度与开始的最后一帧和当前帧之间的增量相乘。

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