|
|
四员数可以用来表示一个绕轴的旋转变换。
它的几何意义我这么描述:给定一个轴向量 v,一个绕它旋转的角度alpha
那么四员数的表示这个变换就是 [ sin(alpha/2) * v, w ] w 是标量
w = cos( alpha/2)
最近看见微软写的CD3DArcBall类中,它没有用我上面的四员数构造方法,他直接就是从两个不共线的矢量叉乘计算出旋转轴作为四员数的矢量部分,点乘得到的余玄值作为标量部分
我的问题是:微软写的四员数构造方法是什么原理啊?
我写了个构造四员数的代码如下,大家看看有什么问题没有。
// 四元数表示一个绕轴旋转变换
// 两个向量叉乘得到的向量的长度是 sin( angle )
// q = ( s*x, s*y, s*z, c);
// s = sin( angle / 2 );
// c = cos( angle / 2 );
// 我们现在有了旋转轴 , 转换为四元数的矢量部分需要乘以 ( sin( angle / 2 ) / sin( angle ) )
// 现在我们计算一个( sin( angle / 2 ) / sin( angle ) )稳定的公式
// 半角公式有 sin( angle / 2 ) = sqrt( ( 1 - cos( angle ) ) / 2 )
// sin( angle )^2 + cos( angle )^2 = 1
// 变换:
// sin( angle / 2 ) / sin( angle )
// = sqrt( ( 1 - cos( angle ) ) / 2 ) / sqrt( 1 - cos( angle )^2 )
// = 1 / sqrt( 2 * ( 1 + cos( angle ) ) -----ok! 矢量部分
// 半角公式:
// c = cos( angle / 2 ) = sqrt( 1 + cos( angle ) / 2 )
// = sqrt( 2 * ( 1 + cos( angle ) ) / 2 -----ok! 夹角部分
// 把 c 变换位 sqrt( 2 * ( 1 + cos( angle ) ) / 2
// 是为了减少一次sqrt运算, 使用上一次运算的结果 |
|