四元数数学轮换?

sho*_*osh 8 opengl 3d graphics rotation quaternions

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

Aln*_*tak 17

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

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

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

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

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


Ste*_*ini 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  
Run Code Online (Sandbox Code Playgroud)

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

   ( 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 )
Run Code Online (Sandbox Code Playgroud)

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