Skip to content

[EMSUSD-2544] Animation Rotation Mismatch After USD to Maya Data Conversion #4226

@liang256

Description

@liang256

Describe the bug
When importing a SkelAnimation using Maya’s native USD plugin and converting the skeleton to Maya data via “Duplicate as Maya Data” (or similar operation), the resulting joint rotations during the animation do not match the original USD animation. The pose at the start and end frames is correct, but the interpolated poses in-between deviate from the expected result.

In the recording, the white geometry represents the original USD data, while the gray one is the duplicated ArmRig converted to Maya data, which shows the twisted animation.

rotation_mismatch.mov

Steps to reproduce

  1. In Maya, go to Create → Universal Scene Description (USD) → Stage from File… and select the attached arm_rig_anim.usda file.
  2. Right-click on the SkelRoot or Skeleton node and choose “Duplicate as Maya Data”.
  3. Scrub the timeline between frame 1 and 24.
  4. Observe the joint rotations in Maya.

Expected behavior
The animation in Maya should match the SkelAnimation stored in the USD file. The rotation interpolation, especially between frames, should remain consistent.

Attachments
arm_rig_anim.usda – A minimal SkelAnimation example using quaternion rotations that clearly demonstrates the mismatch between USD and Maya animation playback.

#usda 1.0
(
    defaultPrim = "ArmRig"
    startTimeCode = 1
    endTimeCode = 24
    upAxis = "Y"
    metersPerUnit = 0.01
)

def SkelRoot "ArmRig" (
    kind = "component"
    prepend apiSchemas = ["SkelBindingAPI"]
)
{
    def Skeleton "Skeleton" (
        prepend apiSchemas = ["SkelBindingAPI"]
    )
    {
        uniform token[] joints = ["Shoulder", "Shoulder/Elbow", "Shoulder/Elbow/Hand"]

        uniform matrix4d[] bindTransforms = [
            ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)),
            ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,2,1)),
            ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,4,1))
        ]

        uniform matrix4d[] restTransforms = [
            ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)),
            ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,2,1)),
            ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,2,1))
        ]

        def SkelAnimation "Anim"
        {
            uniform token[] joints = ["Shoulder", "Shoulder/Elbow"]

            float3[] translations = [(0, 0, 0), (0, 0, 2)]
            quatf[] rotations.timeSamples = {
                1:  [(1, 0, 0, 0), (1, 0, 0, 0)],
                24: [(0, 0, 1, 0), (0.7071, 0.7071, 0, 0)]
            }
            half3[] scales = [(1,1,1), (1,1,1)]
        }

        rel skel:animationSource = </ArmRig/Skeleton/Anim>
    }

    def Mesh "ArmMesh" (
        prepend apiSchemas = ["SkelBindingAPI"]
    )
    {
        rel skel:skeleton = </ArmRig/Skeleton>

        point3f[] points = [
            (0.5, -0.5, 4), (-0.5, -0.5, 4), (0.5, 0.5, 4), (-0.5, 0.5, 4),
            (-0.5, -0.5, 0), (0.5, -0.5, 0), (-0.5, 0.5, 0), (0.5, 0.5, 0),
            (-0.5, 0.5, 2), (0.5, 0.5, 2), (0.5, -0.5, 2), (-0.5, -0.5, 2)
        ]

        int[] faceVertexCounts = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4]
        int[] faceVertexIndices = [
            2, 3, 1, 0,
            6, 7, 5, 4,
            8, 9, 7, 6,
            3, 2, 9, 8,
            10, 11, 4, 5,
            0, 1, 11, 10,
            7, 9, 10, 5,
            9, 2, 0, 10,
            3, 8, 11, 1,
            8, 6, 4, 11
        ]

        int[] primvars:skel:jointIndices = [
            2, 2, 2, 2,
            0, 0, 0, 0,
            1, 1, 1, 1
        ] (
            interpolation = "vertex"
            elementSize = 1
        )

        float[] primvars:skel:jointWeights = [
            1, 1, 1, 1,
            1, 1, 1, 1,
            1, 1, 1, 1
        ] (
            interpolation = "vertex"
            elementSize = 1
        )

        matrix4d primvars:skel:geomBindTransform = ((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1))
    }
}

Specs

  • OS & version: macOS Sonoma 14.5
  • Maya version: Maya 2025.3

Additional context

  • Applying Euler filters within Maya can smooth the result.
  • Ensuring correct quaternion to Euler conversion (and interpolation) may be the core fix.
  • This issue affects the accuracy of round-tripping animation data between DCCs.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions