四元数数学轮换?

时间:2009-04-18 22:02:56

标签: opengl graphics 3d rotation quaternions

我正在我的场景中使用gluDisk()绘制一个平面磁盘。 gluDisk()绘制面向正Z轴的磁盘,但我希望它面对我所拥有的任意正常 显然我需要使用glRotate()来正确地面对磁盘,但旋转应该是什么?我记得这可以用Quaternions计算,但我似乎无法记住数学。

3 个答案:

答案 0 :(得分:17)

解决方案应该非常简单,不应该需要四分之一。

从Normal1到Normal2的旋转轴必须与两者正交,所以只需使用矢量叉积

旋转量很容易来自点积。这个值是| A |。| B | .cos(theta),但由于两个法向量应该归一化,它将给出cos(theta),所以只需取反余弦来得到旋转量。

得到的矢量和角度是glRotate()所需的参数 - 不需要自己计算实际的旋转矩阵。

P.S。不要忘记glRotate()需要以度为单位的角度,但正常的C trig函数以弧度为单位。

答案 1 :(得分:6)

围绕任意轴旋转:给定角度r以弧度为单位向量u = ai + bj + ck或[a,b,c],定义:

q0 = cos(r/2)  
q1 = sin(r/2) a   
q2 = sin(r/2) b  
q3 = sin(r/2) c  

并从这些值构造旋转矩阵:

   ( q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3)           | 2*(q1*q3 + q0*q2)         )
Q =( 2*(q2*q1 + q0*q3)       | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1)         )
   ( 2*(q3*q1 - q0*q2)       | 2*(q3*q2 + q0*q1)           | q0^2 - q1^2 - q2^2 + q3^2 )

要查找需要进行的旋转,可以计算当前矢量和目标矢量之间的叉积。您将获得正交向量(它将是您创建四元数的旋转向量),此向量的长度是您必须补偿的角度的sin,以便开始和目标向量重叠。

答案 2 :(得分:3)

四元数描述围绕轴的旋转。 <w,x,y,z>将围绕轴<x,y,z>旋转一定量,具体取决于w幅度与矢量幅度之间的平衡。

<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1

例如,将其旋转为面向正Y轴,则需要围绕X轴旋转90°。向量为<0, 1, 0>,四元数为<cos 90°, 0, sin 90°, 0> = <0, 0, 1, 0>

要将图形从正Z轴旋转到面向矢量<x,y,z>,您需要找到旋转矢量和旋转角度。要查找旋转轴,您可以获取当前矢量的交叉积,以及您想要的位置。

如果它面向正Z轴,则当前矢量为<0, 0, 1>。如果您希望它面向<x,y,z>,则旋转轴将为<0, 0, 1> x <x, y, z> = <-y, x, 0>,角度将为arctan(sqrt(x^2+y^2),z)。四元数变为

<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)