写在前面的
这篇文章并非原创。
来自国外的一篇博客。链接如下:
http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors
最近在整理一些基础的数学知识。
检索Eigen::Quaternion::fromTwoVector()这个函数的时候发现这个帖子,觉得很有意思。于是翻译了一下。
——————————分割线——————————————
数学简化之美:从两个向量中得到四元数
在这篇文章中我将解释一个广泛使用公式背后的思考过程:找到一个表示两个3D向量之间旋转的四元数。这并不是什么新鲜事物,但希望这些想法对于其他类似的问题有所启发。
笨拙的方法
使用一个旋转轴和旋转角可以很好地将某个旋转可视化。除去退化的情况,这个旋转轴可以通过两个原始向量的叉乘来计算得到:
然后旋转角可以通过合适的叉乘和点乘的属性来得到:
由于 始终在0到 之间,因此我们只关心点积的过程。这为我们提供了一些显而易见的代码来创建四元数(为清楚起见,省去了一些极端的情况,例如 ):
quat quat::fromtwovectors(vec3 u, vec3 v){
float cos_theta = dot(normalize(u), normalize(v)); float angle = acos(cos_theta); vec3 w = normalize(cross(u, v)); return quat::fromaxisangle(angle, w);}
这是笨拙的方法,但是可以工作。
看看隐藏在程序下的
让我们来看看根据一个轴角和旋转角得到四元数的过程中发生了什么: