8

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

4

3 回答 3

17

解决方案应该非常简单,并且不需要四分位数。

从 Normal1 到 Normal2 的旋转轴必须与两者正交,因此只需取它们的向量 cross-product

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

结果向量和角度是所需的参数glRotate()- 无需自己计算实际的旋转矩阵。

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

于 2009-04-18T22:48:55.577 回答
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 )

要找到你需要做的旋转,你可以计算当前向量和目标向量之间的叉积。您将获得正交向量(这将是您创建四元数的旋转向量),并且该向量的长度是您必须补偿的角度的正弦值,以便起始向量和目标向量重叠。

于 2009-04-18T22:39:18.343 回答
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)
于 2009-04-18T22:21:03.707 回答