Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL-使用gluLookAt围绕立方体旋转旋转非常快_Opengl_Rotation_Glulookat - Fatal编程技术网

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

OpenGL-使用gluLookAt围绕立方体旋转旋转非常快,opengl,rotation,glulookat,Opengl,Rotation,Glulookat,我尝试使用gluLookAt在以原点为中心的立方体周围移动,而不是直接在对象上执行R*T变换。起初,我不知道如何解决这个问题。然后我意识到(在圆坐标系中实现了一半的解决方案之后),我应该尝试使用球坐标系表示法。我能够编写一些代码来实现这一点,但我(相机的“眼睛”)绕着立方体旋转得非常快。另外,我注意到我也在向立方体靠近一点,而不是保持不变的半径。当我使用Rotate*Translate方法时,它会以更合适的速率以相同的距离旋转 我的旋转方法是使用球坐标,但我不确定这是否正确。我根据上面的图表计算

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

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

我根据一些三角计算θ和φ,最后计算新的位置。这些公式可以在前面的链接中找到。最后一步是将其插入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))。

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

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

你的问题有一个很好的解决办法。进行一点调查,但我认为它会满足你的需要。


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

我明白你的意思了。我将所有“anglex”和“angley”变量分别更改为“radx”和“rady”。我仍然很快地绕着立方体旋转。@soplu:your
up\u y
up\u x
仍被计算为角度。我错过了,但现在它被修复了。但是,当我调用gluLookAT时,我不会使用up_y或up_x。