Search code examples
math3drotationmayaquaternions

Converting 3D rotation to 2D rotation


I've been trying to figure out the 2D rotation value as seen from orthographic "top" view for a 3D object with XYZ rotation values in Maya. Maybe another way to ask this could be: I want to figure out the 2D rotation of a 3D obj's direction.

Here is a simple image to illustrate my question: Sample image for the question

I've tried methods like getting the twist value of an object using quaternion (script pasted below), to this post I've found: Component of a quaternion rotation around an axis.

If I set the quaternion's X and Z values to zero, this method works half way. I can get the correct 2D rotation even when obj is rotated in both X and Y axis, but when rotated in all 3 axis, the result is wrong.

I am pretty new to all the quaternion and vector calculations, so I've been having difficulty trying to wrap my head around it.

;)

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)

Solution

  • Can you get the (x,y,z) coordinates of the rotated vector? Once you have them use the (x,y) values to find the angle with atan2(y,x).