Rotate a Vector3 by a Rotation Vector3 用“旋转向量”旋转向量

rotate v:

by r:

where θ=||r||



旋转矩阵或者四元数都是“状态/瞬态转换”,你不知道正转反转、转了/要转多少圈,角速度是多少。四元数反求旋转轴与角度(《slerp》),接近0、旋转整周的时候也是有奇点的。

旋转轴+旋转角(Axis-Angle)的方法,维基有很多个,即使提到了R=exp(θK)("e的矩阵次方"),但K的内容总是要把旋转向量归一化成单位向量,θ又是向量长度,又乘回去了。

而实际上直接用旋转向量在接近0的时候可以愉快地级数展开,数值计算甚至不需要除法,更不用平方根,也就是只用θ²即可干活。

R=exp(θK)=I+sinθ·K+(1-cosθ)K²

R=exp([r]×)=exp(r直接转为“叉乘矩阵”干脆就叫C罢)=exp(C)=I+(sinθ/θ)C+((1-cosθ)/θ²)C²

↑=I+C/1!+C²/2!-tC/3!-tC²/4!+t²C/5!+t²C²/6!-t³C/7!-t³C²/8!+……
(t=r·r=θ²=x²+y²+z², C=[0,-z,y
z,0,-x
-y,x,0
], C²=[-y²-z²,xy,xz
xy,-x²-z²,yz
xz,yz,-x²-y²
], C³=-tC)

参见罗德里格斯(Rodrigues's rotation formula)公式(

虽然但是大了还是要平方根然后丢给sincos对π取模(建议手动从头限制旋转角范围,实践上要做到这一步还是备一个单位旋转轴(Versor)和缩放了的旋转角(除以π的,用时取小数后再乘π)比较好(至少不用对不明向量归一化(对我就是看他不爽(((

数学爷爷们倒是早就搞清楚了,四元数分析,李代数,但是本数学渣程序猿去钻通可能要掉几层皮(

cosq?

屁牌实(mei)用数学系列。更新日期:2022-04-05。随时可能更新。以WTFPL协议发布。