Autodesk / Autodesk/3dsmax-usd

[EMSUSD-4082] Standalone exporter Skeleton has all identity bind transforms

Open
#46 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
C++
Stars
94
Forks
6
Avg merge
6d 20h
Merged PRs (30d)
1

Description

**Describe the bug**

The following scene is a simple skeleton with three bones. Bones transforms are not identities:

Image

When exported to USD with this script:

```
import tempfile

from pymxs import runtime as rt

export_options = rt.USDExporter.createOptions()

export_options.RootPrimPath = "/MY_OWN_ROOT"

export_options.Meshes = True
export_options.Shapes = False
export_options.Lights = False
export_options.Cameras = False
export_options.Skin = True
export_options.Morpher = True
export_options.Materials = True
export_options.ShadingMode = rt.name("useRegistry") # none, useRegistry
export_options.AllMaterialTargets = rt.name("UsdPreviewSurface")

export_options.UsdStagesAsReferences = False
export_options.HiddenObjects = True
export_options.UseUSDVisibility = False
export_options.AllowNestedGprims = False

export_options.FileFormat = rt.name("ascii") # ascii, binary
export_options.Normals = rt.name("asAttribute") # none, asAttribute, asPrimvar
export_options.MeshFormat = rt.name("polyMesh") # fromScene, polyMesh, triMesh
export_options.TimeMode = rt.name("current")

export_options.SetChannelPrimvarMapping(-2, "displayOpacity") # Vertex Alpha
export_options.SetChannelPrimvarMapping(-1, "LayerWeights") # Vertex Illum
export_options.SetChannelPrimvarMapping(0, "displayColor") # Vertex Color

export_options.StartFrame = float(rt.animationRange.start)
export_options.EndFrame = float(rt.animationRange.end)
export_options.SamplesPerFrame = 1.0

export_options.UpAxis = rt.name("z") # y, z
export_options.BakeObjectOffsetTransform = True
export_options.PreserveEdgeOrientation = True

export_options.BonesPrimName = "MyDefaultBonesPrimName"
export_options.AnimationsPrimName = "MyDefaultBonesPrimName"

export_options.IncludeAllBones = True
export_options.PreserveBoneMeshes = False
export_options.SimplifyBonePaths = True

export_options.UseWorldspaceRoot = False

export_options.UseProgressBar = True

export_options.LogLevel = rt.name("info") # off, info, warn, error

export_options.OpenInUsdview = False

export_options.ChaserNames = rt.Array()
export_options.AllChaserArgs = rt.Dictionary()

with tempfile.NamedTemporaryFile(prefix="maxusd-", suffix=".usda", delete=False) as fp:
path = fp.name

print(path)

rt.USDExporter.ExportFile(
path,
exportOptions=export_options,
contentSource=rt.name("all"), # all, selected, nodeList,
)
```

The exported USD joints have their bind transforms are all set to identity transforms:

Image

**Steps to reproduce**
Steps to reproduce the behavior:
1. Create a Skeleton
2. Export it to USD with the script above
3. The exported bind transforms are all identities

**Expected behavior**

For standalone skeletons, in absence of other skinning information, I think the bind transforms should match the rest transform, in world space.

**Attachments**

[debug-bind-identities.zip](https://github.com/user-attachments/files/30358071/debug-bind-identities.zip)

**Specs (if applicable):**

- OS & version: Windows 11
- 3ds Max version: 2027.2 / 29.2.0.20588
- 3ds USD version: 0.16.2.31

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the standalone skeleton export using the provided pymxs script and the rt.USDExporter.ExportFile entry point. Inspect the exporter’s skeleton bind-transform handling and compare the generated USD joint transforms with the skeleton rest transforms in world space. Done means standalone skeleton exports no longer produce identity bind transforms when the source bones have non-identity transforms.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
computer-graphics
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
50/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.