# HOWTO: Maya and 3ds Max exports for Muse Engine (Engine 32 RC)

This page is for artists who work in **Autodesk Maya** or **3ds Max** and want to bring a **scene** (it becomes the level you walk around in) or a **rigged, animated character** (it becomes the enemies) into Muse Engine.

The short version:

| | Scene (level) | Character (enemies) |
|---|---|---|
| Format | FBX 2014 to 2020, binary (or glTF binary `.glb`); any FBX 2011+ (7.x) loads | FBX 2014 to 2020, binary (or `.glb`) |
| Units / up axis | keep your scene's own (cm + Y-up in Maya, Z-up in Max are fine) | the same |
| Must include | geometry, materials, **Embed Media** | geometry, **Skins**, **Bake Animation**, **Embed Media** |
| Names that matter | `PlayerStart`, `UCX_…`, `…_col`, `…nocol…` | take names *Idle, Walk, Run, Shoot, Death* |
| Limits | about 300k triangles is comfortable; 1.5M vertices max | 60 skinned bones, 4 weights per vertex, about 100k triangles |

After loading, press **Tab** and open **Model check**. It lists what the engine found in your file (units, up axis, bones, takes with fps and length, triangles, colliders, textures) and every problem it spotted, **each with the fix**. The table at the end of this page explains every warning.

> FBX is an Autodesk format; Muse Engine reads it with its own FBX reader (no third-party library). glTF is an open Khronos standard. Nothing here needs an Autodesk plug-in beyond the FBX exporter that ships with Maya and 3ds Max.

---

## 1. Units and up axis: leave them alone

Muse Engine reads `UnitScaleFactor` and `UpAxis` from the FBX and converts everything to **metres, Y-up** itself.

- **Maya:** the default working units are centimetres and Y-up. Both are fine. Z-up scenes are fine too.
- **3ds Max:** Z-up is fine. Any system unit (cm, m, inches) is fine as long as it is written to the file.
- **In the FBX export dialog:** under *Advanced Options › Units*, keep **Automatic** ticked. Under *Axis Conversion*, keep your scene's up axis (Y or Z). Do not rescale by hand.
- **glTF / GLB** is always metres and Y-up by definition.

If a model still comes in at the wrong size or lying on its side, Model check says **"No unit information in the file"** or **"No up-axis information"**. Pick *Units* and *Up* by hand in the panel, next to the load button. The choice is saved in your setup file.

## 2. Exporting a scene (becomes the level)

**Maya:** *File › Export All* (or *Export Selection*), file type **FBX export**.
**3ds Max:** *File › Export › Export* (or *Export Selected*), type **Autodesk (*.FBX)**.

In the FBX export options:
- *Geometry*: **Smoothing Groups** on. *Triangulate* is optional (the engine triangulates anyway).
- *Animation*: off for static scenes.
- *Cameras / Lights*: off. They are ignored.
- *Embed Media*: **on**. Textures travel inside the FBX. Otherwise select the texture files together with the FBX when you load it.
- *FBX File Format*: **Binary**, version **FBX 2014** to **FBX 2020**. FBX 2010 and older (FBX 6.x) are rejected with the message **Old FBX 6.x: re-export as FBX 2011+ or GLB** (see *Old FBX 6.1 files* below).

### Names that change how objects behave

Name objects (or their parent group) like this in the Outliner / Scene Explorer:

| Name | Effect in the engine |
|---|---|
| `PlayerStart` (also `spawn`, `SpawnPoint`) | where the player starts. **Maya:** a locator or empty group. **3ds Max:** a Dummy or Point helper. It is snapped onto the floor below it. |
| `UCX_…`, `…_col`, `col_…` | **collision only**: invisible, but you collide with it. Use simple boxes around detailed meshes. Unreal-style `UCX_` names work as they are. |
| `…nocol…` (for example `fence_nocol`) | visible, **no collision**. Use it for detail meshes, wires and hanging signs. |
| `grass…`, `foliage…`, `plant…`, `bush…`, `flower…`, `decal…`, `leaf…` (small objects) | visible, no collision |

Everything else becomes **floor** (surfaces facing up, slopes up to about 45°) or **wall** (everything else). Model check shows the collider triangle count and how many are walkable. **"No walkable floor found"** almost always means a wrong up axis, or floors named `_nocol`.

### Heavy scenes

- Up to about **300,000 triangles** runs well on most PCs. Model check warns above that and flags an error above 1,000,000.
- **Parts:** every mesh × material is one draw part. The engine batches parts that share a material and texture, and skips parts outside the view. Combining meshes by material before export still helps.
- For dense geometry, add a few `UCX_` boxes and mark the detail `nocol`. Collision on millions of triangles is slow to build.
- Reduce polygons with **Maya:** *Mesh › Reduce*, **3ds Max:** *ProOptimizer* modifier.

### Old FBX 6.1 files (3ds Max / Maya 2006 to 2010)
3ds Max 2006 to 2010 and Maya of the same years write **FBX 6.1** (file version 6100, binary or ASCII). Engine 32 reads **FBX 7.x only** (FBX 2011 and later), so an FBX 6.1 file stops with:

> **Old FBX 6.x: re-export as FBX 2011+ or GLB.** *name*.fbx is FBX 6.1 (version 6100, binary / ASCII, written by 3ds Max / Maya 2010 or earlier) …

What to do:
- **3ds Max / Maya 2011 or later:** open the scene and export again with *FBX File Format › Version* **FBX 2014/2015** (or later) and *Type* **Binary**.
- **Only the old .fbx file, no newer Max:** open it in **Blender** (2.79 reads FBX 6.x ASCII files) and export **FBX 7.4** or **glTF Binary (.glb)**.
The test pack's `fbx6/` folder has a small FBX 6.1 prop set (ASCII and binary) so you can see the message.

## 3. Exporting a rigged character (becomes the enemies)

### Rig and skin
- **Export from the bind pose.** **Maya:** *Skin › Go to Bind Pose*. **3ds Max:** Skin modifier with *Always Deform* on, character in its reference pose.
- Stand the character on the **origin**, facing **+Z in Maya** or **−Y (the Front view) in 3ds Max**. Both arrive facing +Z. If one comes in turned, set *Faces* in the panel.
- **4 weights per vertex.** **Maya:** *Skin › Bind Skin* options, **Max Influences: 4** with *Maintain max influences* on. **3ds Max:** Skin modifier › *Advanced Parameters* › **Bone Affect Limit: 4**.
- One skinned character per file. Props parented to bones (a rifle on the hand) follow the bone.

### The 60-bone limit
The engine skins on the GPU with **up to 60 bones** (fewer on some old GPUs). Rigs with more bones still load. The smallest leaf bones (finger tips, toe ends, twist and helper bones, Max *Nub* bones) are **merged into their parents**, while the head, neck, spine, hips, arms and legs are always kept. Model check lists every bone and marks the merged ones.

To avoid merging, skip finger and twist joints on export, or keep helper bones unskinned.
- **HumanIK (Maya):** the full HIK skeleton with fingers is over 60 bones; the finger ends get merged, which is usually invisible in-game.
- **Biped (3ds Max):** use 1–2 finger links or none, and no ponytail or extra spine links, to stay under 60. Biped names work as they are: `Bip001 Pelvis` is the hips, `Bip001 Head` carries the **head hitbox** (not `Bip001 HeadNub`), `Bip001 L Foot` / `Bip001 R Foot` are the feet, and the `…Nub` and `Bip001 Footsteps` bones are the first to be merged. The test pack's `swat-biped-max.fbx` (79 Biped-named bones, 5 takes named `Idle_Rifle`, `Walk`, `Run_Rifle`, `Fire_Rifle`, `Death_KnockDown`) loads with all five takes mapped and 20 bones merged; Model check shows **BONES_OVER_LIMIT** with the merged names.
- **CAT (3ds Max):** limit the digits the same way.

Namespaces such as `Character1:` or `mixamorig:` are fine.

### Animation: bake it, one take per action
- Tick **Bake Animation** in the FBX exporter (*Animation › Bake Animation*, step 1, your full range). **30 fps** is typical; 24, 25 and 60 are fine too. Model check shows the key rate of every take and warns below 15 fps or at odd rates.
- **Deformations:** *Skins* on (*Blend Shapes* / *Morphs* are ignored).
- **Several takes in one FBX** are all read. Name them so the engine maps them automatically. Namespaces and prefixes such as `Character1:Reference|Walking` or `Take 001` are ignored:

  | Role | Names that match |
  |---|---|
  | idle | idle, stand, breathe, rest |
  | walk | walk, stroll |
  | run | run, jog, sprint |
  | shoot | shoot, fire, attack |
  | death | death, die, dead, dying |

  - **Maya:** define clips in the *Game Exporter* (*File › Game Exporter › Animation Clips*) or the Time Editor.
  - **3ds Max:** use the FBX exporter's take options or the Motion Mixer.
  - Exporter versions differ, so load the file and check the **Takes** table in Model check. It lists every take that arrived, with its fps, frames and length.
- Anything the matcher can't place appears in the **clip picker** under the character slot. Pick a clip for any role there (or *none*). Your picks are saved in your setup file.

### Root motion
Many mocap and Max *Biped* walk takes move the whole character forward. The hips, or a root bone above them, travel several metres per cycle. In a game that makes the character **slide away from its own hitbox** and snap back when the loop restarts.

**Strip root motion** (on by default, in the character section of the panel):
- finds the moving root bone (the hips or the first moving bone above them);
- measures how far each take travels (the Model check *root motion* column, in metres);
- removes only the **forward drift**, keeping the hip sway and bob. The engine moves the character itself.

Untick it to play the raw takes. For the cleanest result, export **in-place** walks and runs:
- **Maya:** zero the root/hips translation on X/Z before baking.
- **3ds Max / Biped:** use *In Place Mode*.

### Textures
- **Embed Media** in the FBX, or select the texture files together with the FBX when you load it.
- **PNG or JPEG** textures are the safest. Model check lists every texture it could not find (**"texture(s) not found"**); those materials fall back to their base colour.
- **Big textures:** the engine uploads every texture at **at most 1024 px per side** (resized to a power of two, with mipmaps). 4K maps (4096 px) still load, but each one costs about 64 MB while decoding and slows loading, for no visible gain. Model check warns with **LARGE_TEXTURES** above 2048 px, and **TEXTURE_MEMORY** when all textures together need more than 256 MB. **3ds Max:** resize the bitmaps (or *Render to Texture* at 1024 / 2048) before exporting; **Maya:** resize the file textures.
- For `.gltf` (text) files, select the `.bin` and images together with the `.gltf`, or export a single **glTF Binary (.glb)** instead.

## 4. Loading, and sharing a setup with a colleague

- **Drag and drop** files onto the game view. The **left half** loads a **scene**, the **right half** loads a **character**. Drop the `.fbx` / `.gltf` together with its `.bin` and textures.
- **Tab › Setup › Save setup (.json)** writes one small file with the scene, the character, units / up / faces, clip picks, the look and every toggle.
- **Load setup…** (or dropping the `.json` on the game view) restores it:
  - Models that were loaded **from a URL** load again by themselves.
  - Models loaded **from your disk** can't be read back by the browser. Drop the `.json` **together with** those model files and they are matched by file name.
- Loading shows a progress bar (download, parse, textures, build). Errors say what is wrong and what to do.

Common error messages:

| Message | What to do |
|---|---|
| `.obj / .blend / .max / .ma / .mb files are not supported` | Export FBX (binary 2014–2020) or glTF binary (.glb) |
| `Old FBX 6.x: re-export as FBX 2011+ or GLB` | The file is FBX 6.1 or older (3ds Max / Maya 2010 and earlier). Re-export as FBX 2014–2020 binary, or as .glb |
| `Damaged or truncated .glb` / `looks damaged or truncated` | The export or copy did not finish. Export again |
| `Missing x.bin next to model.gltf` | Select the .bin (and textures) together with the .gltf, or use .glb |
| `Draco-compressed glTF is not supported` | Export without Draco mesh compression |
| `too heavy` | Reduce polygons, or split the scene |

## 5. Model check warnings

| Code | Meaning | Fix |
|---|---|---|
| NO_SKIN | the "character" has no skinned mesh / skeleton, so it is drawn as a static model with no animation | export with *Skins* / *Deformations* on, mesh bound to the skeleton |
| BONES_OVER_LIMIT | more than 60 bones; minor leaf bones were merged (they are listed) | skip finger / twist / helper bones, or accept the merge |
| NO_CLIPS | skinned, but no takes | tick *Bake Animation* and include the takes |
| ROOT_MOTION | takes move the character forward (metres shown). *Note* level when stripped, *warning* when not | keep **Strip root motion** on, or export in-place takes |
| UNMAPPED_ROLES | no clip found for idle / walk / run / shoot / death | rename the takes, or pick clips in the clip picker |
| LOW_FPS / ODD_FPS | takes keyed below 15 fps, or at an unusual rate | bake every frame at 24 / 25 / 30 / 60 fps |
| ODD_SIZE | a character under 0.5 m or over 3 m tall, or a scene under 2 m or over 5 km across | set *Units* in the panel, or export with unit metadata |
| NO_UNITS_INFO / NO_UP_INFO | the file has no unit / up-axis data, so the engine guessed | FBX: keep *Units: Automatic* and set the up axis on export |
| MISSING_TEXTURES | texture files not found (listed) | *Embed Media*, or select the textures together with the model |
| HEAVY_MESH | many triangles for WebGL1 | *Mesh › Reduce* (Maya) / *ProOptimizer* (Max) |
| MANY_PARTS | over 400 mesh × material parts | combine meshes that share a material |
| NO_FLOOR | no walkable floor: you would fall | check the up axis / units, and that floors aren't named `_nocol` |
| NO_SPAWN | no `PlayerStart`, so the player spawns on the nearest open floor | add a locator / Dummy named `PlayerStart` |
| LARGE_TEXTURES | textures over 2048 px (for example 4K maps); the engine shrinks every texture to 1024 px anyway | export 1024 or 2048 px maps |
| TEXTURE_MEMORY | all textures together need more than 256 MB while loading | fewer or smaller textures, or one shared atlas |
| NPOT_TEXTURES | *note*: textures that are not a power of two (for example 1000 × 600) are resized on upload and may blur slightly | use 512, 1024 or 2048 px sizes |

## 6. Try it with the test pack

`assets/testpack/muse-engine-32-testpack-cc0.zip` (also linked in the panel and the sidebar) contains:
- a small test level, as FBX (Z-up, cm, Autodesk-style, with a `PlayerStart`) and GLB;
- an animated test character, as FBX (Z-up, cm, `Character1:` namespace, 11 takes baked at 30 fps) and GLB;
- the same character with **3ds Max Biped bone names** (`swat-biped-max.fbx`, FBX 7.4, 79 bones, 5 takes);
- `fbx6/`: a small prop set as **FBX 6.1** (ASCII and binary, inches, like 3ds Max 2008), to see the *Old FBX 6.x* message.

All of it is **CC0** (Kenney and Quaternius; see `LICENSE-TESTPACK.md` inside). Load them, then compare the Model check results with your own exports.

Models you load stay under their own licence. Loading a model does not relicense it; you are responsible for having the rights to use it.

