我正在尝试使用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);
}
我明白你在说什么。我将所有“anglex”和“angley”变量分别改为“radx”和“rady”。我仍然很快旋转魔方。 – soplu
@soplu:你的'up_y'和'up_x'仍然被计算为角度。 – sheu
我错过了,但现在它已修复。但是,当我打电话给gluLookAT时,我不会使用up_y或up_x。 – soplu