我在3D空间工作(Blender,Python)。
我有一个任意旋转的对象。我需要旋转它,因此局部x轴垂直于给定的轴(想象一个平面,x轴可以是任何东西,只要它是该平面的方向矢量)。现在我需要围绕它的局部z轴旋转对象 (冻结另外两个)直到局部x轴与平面对齐。
现在我近似然后使用while循环,在局部z周围旋转一小部分直到它适合,但我确定有一个数学解决方案。解决方案不需要是python,数学描述应该可以正常工作。
答案 0 :(得分:0)
将对象的旋转(3x3矩阵)设为R
,将世界帧中的平面(单位)法线设为n'
。要计算对象的本地帧n
中的变换法线,请将R
(=转置)的倒数应用于n'
。在本地框架中工作更方便:
w
是“所需的”X轴。它是 parallel 或反并行到n ^ z
,其中^
是交叉产品。由于有两种解决方案(w
和-w
),因此我们将在此实例中选择正解。
在我们做其他事情之前,我们需要检查n
是否与z
共线。如果是,则x
轴已经在平面中(此外,w
会有无限多的解),我们可以立即返回。我们通过计算n
和z
的点积来实现此目的。如果这接近于1或-1(在某些EPSILON
内,取决于您的浮点格式),那么它们是共线的。
一旦我们有w
,我们就可以将问题减少到2D:
要获得角度θ
(围绕局部Z轴旋转),标准化 w
,并取{的点积的反余弦值{1}}和w
。
但是,我们还需要知道旋转的方向(在与Z相反的方向观察时顺时针或逆时针)。但这很简单 - 如果x
然后逆时针旋转,则顺时针旋转(更改w.Y > 0
的符号)。
最后,我们可以计算要应用的旋转矩阵,
使用原始旋转矩阵 后乘:θ
,我们就完成了。