我有两个向量作为Python列表和一个角度 . 例如 . :
v = [3,5,0]
axis = [4,4,1]
theta = 1.2 #radian
在围绕轴旋转v向量时获得结果向量的最佳/最简单方法是什么?
对于轴向量指向的观察者,旋转应该是逆时针的 . 这被称为right hand rule
我有两个向量作为Python列表和一个角度 . 例如 . :
v = [3,5,0]
axis = [4,4,1]
theta = 1.2 #radian
在围绕轴旋转v向量时获得结果向量的最佳/最简单方法是什么?
对于轴向量指向的观察者,旋转应该是逆时针的 . 这被称为right hand rule
9 回答
看看http://vpython.org/contents/docs/visual/VisualIntro.html .
它提供了
vector
类,其方法为A.rotate(theta,B)
. 如果您不想在A
上调用该方法,它还提供辅助函数rotate(A,theta,B)
.http://vpython.org/contents/docs/visual/vector.html
使用Euler-Rodrigues formula:
单行,具有numpy / scipy功能 .
我们使用以下内容:
expm
(code here)计算指数的泰勒系列:\sum_{k=0}^{20} \frac{1}{k!} (θ A)^k
,所以它的时间很昂贵,但可读性和安全性 . 如果除了很多向量之外几乎没有旋转,这可能是一个好方法 .我只想提一下,如果需要速度,将unutbu的代码包装在scipy的weave.inline中,并将已经存在的矩阵作为参数传递,使运行时间减少20倍 .
代码(在rotation_matrix_test.py中):
时机:
这是一种使用极快速的四元数的优雅方法;我可以用适当的矢量化numpy数组计算每秒1000万次旋转 . 它依赖于四元数扩展到numpy发现here .
四元数理论:四元数是一个具有一个实数和三个虚数维的数字,通常写为
q = w + xi + yj + zk
,其中'i','j','k'是虚构的维度 . 正如单位复数'c'可以表示c=exp(i * theta)
的所有2d旋转,单位四元数'q'可以表示q=exp(p)
的所有3d旋转,其中'p'是由轴和角度设置的纯虚数四元数 .我们首先将您的轴和角度转换为四元数,其四维由您的旋转轴给出,其大小由弧度的旋转角度的一半给出 . 4个元素向量
(w, x, y, z)
构造如下:首先,对于要旋转的矢量
vector
和旋转轴rot_axis
,构造了4个元素的numpy数组,其中实数分量w = 0 . 然后通过归一化然后乘以所需角度的一半来构造轴角度表示theta
. 请参阅here了解为什么需要一半的角度 .现在使用库创建四元数
v
和qlog
,并通过取指数获得单位旋转四元数q
.最后,通过以下操作计算矢量的旋转 .
现在只需丢弃真实元素,你就可以旋转矢量了!
请注意,如果必须通过许多顺序旋转旋转矢量,此方法特别有效,因为四元数乘积可以计算为q = q1 * q2 * q3 * q4 * ... * qn然后向量仅旋转使用v'= q * v * conj(q)在最后使用'q' .
这种方法只需通过
exp
和log
函数即可在轴角<---> 3d旋转算子之间进行无缝转换(是log(q)
只返回轴角表示!) . 有关四元数乘法等的工作原理的进一步说明,请参阅here我为Python {2,3}创建了一个相当完整的3D数学库 . 它仍然没有使用Cython,但在很大程度上依赖于numpy的效率 . 你可以在这里找到pip:
或者看看我的gitweb http://git.automatics.dyndns.dk/?p=pymath3d.git,现在也在github:https://github.com/mortlind/pymath3d .
安装完成后,您可以在python中创建可以旋转矢量的方向对象,或者成为变换对象的一部分 . 例如 . 下面的代码片段组成一个方向,表示围绕轴[1,2,3]旋转1 rad,将其应用于向量[4,5,6],并打印结果:
输出将是
就使用上面B. M.发布的scipy的oneliner而言,这比我使用它的时间长约4倍 . 但是,它需要安装我的math3d包 .
使用pyquaternion非常简单;安装它,在你的控制台中运行:import pip;pip.main([ '安装', 'pyquaternion'])
安装完成后:
免责声明:我是这个包的作者
虽然旋转的特殊类可以很方便,但在某些情况下,需要旋转矩阵(例如,用于处理scipy中的affine_transform函数等其他库) . 为了避免每个人都实现自己的小矩阵生成函数,存在一个很小的纯python包,它只提供方便的旋转矩阵生成函数 . 该软件包在github(mgen)上,可以通过pip安装:
从自述文件复制的示例用法:
我需要围绕嵌入该模型的三个轴{x,y,z}之一旋转3D模型,这是搜索如何在numpy中执行此操作的最佳结果 . 我使用了以下简单的功能: