【问题标题】:Rotate an object around it's local z-axis until it's local x axis falls into a specific plane围绕其局部 z 轴旋转对象,直到其局部 x 轴落入特定平面
【发布时间】:2018-02-16 08:12:27
【问题描述】:

我在 3D 空间中工作(Blender、Python)。

我有一个任意旋转的对象。我需要旋转它,所以局部 x 轴垂直于给定轴(想象一个平面,x 轴可以是任何东西,只要它是该平面的方向向量)。现在我需要围绕它的局部 z 轴旋转对象(冻结另外 2 个),直到局部 x 轴与平面对齐。

现在我近似然后使用一个while循环,围绕局部z旋转少量直到它适合,但我确信有一个数学解决方案。解决方案不需要是 python,数学描述应该可以正常工作。

【问题讨论】:

    标签: 3d rotation


    【解决方案1】:

    将对象的旋转(3x3 矩阵)设为R,将世界框架中的平面(单位)法线设为n'。要计算对象局部帧n 中的变换法线,请将R 的倒数(= 转置)应用于n'。在本地框架中工作更方便:

    w 是“所需的”X 轴。它与n ^ z平行反平行,其中^交叉产品。由于有两种解决方案(w-w),我们将在本例中选择正面的。

    在我们做任何其他事情之前,我们需要检查n 是否与z 共线。如果是,那么x 轴已经在平面上(此外,w 的解将有无限多),我们可以直接返回。我们通过计算nz点积 来做到这一点。如果这接近 1 或 -1(在某些 EPSILON 范围内,具体取决于您的浮点格式),那么它们是共线的。

    一旦我们有了w,我们就可以将问题简化为二维:

    要获得角度θ(绕局部Z轴旋转),归一化 w,并取w和@的点积的反余弦987654348@.

    但是,我们还需要知道旋转的方向(从与 Z 方向相反的方向查看时,顺时针或逆时针)。然而这很简单 - 如果 w.Y > 0 则逆时针旋转,否则顺时针旋转(更改 θ 的符号)。

    最后我们可以计算要应用的旋转矩阵,

    后乘与原始旋转矩阵:R_new = R * S,我们就完成了。

    【讨论】:

    • 非常感谢这个详细而正确的回答,问题解决了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2016-10-06
    • 2018-05-20
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多