OpenGL - 使用 gluLookAt 绕立方体旋转速度非常快

标签 opengl rotation glulookat

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

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

我根据一些三角函数计算 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);
}

最佳答案

诸如sin()cos()之类的数学函数以及其他函数期望以弧度而不是度数为单位输入。看起来您正在假设度数,因此您的旋转速度比预期快大约 57.3 倍(确切地说:360/(2 * pi))。

关于OpenGL - 使用 gluLookAt 绕立方体旋转速度非常快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14666067/

相关文章:

opengl - 在 OpenGL 中绘制圆所需的边数

c++ - 围绕一个公共(public)点旋转四条线

opengl - OpenGL中如何确定视线平面的法向量?

java - Java中的OpenGL,手动创建gluLookAt矩阵

Jquery 动画旋转不起作用

c++ - OpenGL 相机 - 在使用 SetCursorPos(x,y) 时移动相机而不使其快速返回;?

c++ - 如何将欧拉角转换为前、上、右 vector

c++ - 模型减慢游戏速度 - opengl

opengl - LibGDX 中的清屏

python - 考虑到 OpenCV 在使用 WarpAffine 旋转时会向图像添加黑色边框,如何旋转坐标?