将 3D 旋转转换为 2D 旋转

Converting 3D rotation to 2D rotation

我一直在尝试计算从 Maya 中具有 XYZ 旋转值的 3D 对象的正交“顶部”视图看到的 2D 旋转值。也许另一种问这个问题的方式是:我想弄清楚 3D obj 方向的 2D 旋转。

这是一张简单的图片来说明我的问题:

我已经尝试过使用四元数(脚本粘贴在下面)等方法获取对象的扭曲值,为此 post 我发现:Component of a quaternion rotation around an axis.

如果我将四元数的 X 和 Z 值设置为零,则此方法会半途而废。即使 obj 在 X 轴和 Y 轴上旋转,我也可以获得正确的 2D 旋转,但是当在所有 3 轴上旋转时,结果是错误的。

我对所有四元数和矢量计算都很陌生,所以我一直难以理解它。

;)

def quaternionTwist(q, axisVec):
    axisVec.normalize()

    # Get the plane the axisVec is a normal of
    orthonormal1, orthonormal2 = findOrthonormals(axisVec)

    transformed = rotateByQuaternion(orthonormal1, q)

    # Project transformed vector onto plane
    flattened = transformed - ((transformed * axisVec) * axisVec)
    flattened.normalize()

    # Get angle between original vector and projected transform to get angle around normal
    angle = math.acos(orthonormal1 * flattened)

    return math.degrees(angle)

q = getMQuaternion(obj)
# Zero out X and Y since we are only interested in Y axis.
q.x = 0
q.z = 0
up = om2.MVector.kYaxisVector
angle = quaternionTwist(q, up)

我不熟悉您正在使用的框架,但如果它看起来像那样,我想您就差不多了。在调用 quaternionTwist().

之前不要将四元数的 X 和 Z 分量归零

四元数 q1 = (x,y,z,w)q2 = (0, y, 0, w) 不代表绕 y 轴的相同旋转,特别是因为 q2 以这种方式编写变得不规范,所以你真正比较是 (x,y,z,w)(0, y/|q2|, 0, w/|q2|) 其中 |q2| = sqrt(y^2 + w^2).

你能得到旋转矢量的(x,y,z)坐标吗?一旦你有了它们,就可以使用 (x,y) 值找到 atan2(y,x).

的角度

这是使用 的 Maya 工作代码:

matrix = dagPath.inclusiveMatrix() #OpenMaya dagPath for an object
axis = om2.MVector.kZaxisVector
v = (axis * matrix).normal()
angle = math.atan2(v.x, v.z) #2D angle on XZ plane