One scene. One structure. Every asset.

Scene Hierarchy

Outliner structure and in-scene node naming for every asset type.
ASSET scope
Section07
Asset Types9
Version

Section 6 governs file names. This section governs node names and the DAG hierarchy inside a scene. Both use the same vocabulary — asset type codes and department codes from §6.5 — so there is one dictionary on this show, not two. Applies to every asset scene in Maya. The principles carry to Houdini and UE5 where relevant.

7.0.1 — The Ten Rules

Ground Rules#

These ten rules apply to every node in every asset scene. Memorise them before opening a scene. The only exception is the top node itself: it is named TYPE_AssetName by rule 01, so it carries neither a type suffix (rule 04) nor the asset-name prefix (rule 05). QC exempts the root from those two rules and from nothing else.
01

Exactly one top node

A single root in the outliner, named TYPE_AssetName. Nothing else at world level except Maya defaults. Example: CHR_Scion, VHC_Skiff, BLD_SanctumTower.
02

Top node pivot at world origin

Pivot sits at the base of the asset — XZ centre, Y minimum — and at world origin (0, 0, 0). Every published asset lands at the same predictable position.
03

Real-world scale, centimetres

All assets are authored at real-world scale in centimetres. Transforms are frozen on everything published. A character standing 175 cm tall must measure 175 units in Maya.
04

Every node carries a type suffix

No bare names, ever. A mesh ends in _geo. A group ends in _grp. A joint ends in _jnt. See the Suffix Dictionary for the full set.
05

Every node carries the asset name as prefix

Scion_head_geo, not head_geo. This is not optional — see "Why the Asset Prefix" for the two independent reasons this rule cannot be relaxed.
06

Node names follow §6.1

Lowercase tokens, _ as separator, PascalCase for the asset name. The asset name is Scion (capital S), the part token is lowercase: Scion_head_geo.
07

Sides are prefixes on the part token

l_, r_, c_ for left, right, centre. Placed after the asset name and before the part: Skiff_l_thruster_geo. Never before the asset name, never after the part.
08

Only meshes carry _geo

Groups carry _grp. A mesh named Scion_head_geo is a leaf node, not a container. One exception: the asset's top-level geometry group is <Asset>_geo_grp and is required. Any other group ending _geo_grp stutters and is a QC warning — Scion_l_arm_geo_grp should be Scion_l_arm_grp.
09

Geometry is a sibling of the rig

Never parent geometry under the rig group. Skinned geometry parented inside a rig hierarchy double-transforms through the skinCluster. The hierarchy prevents this structurally.
10

Nothing published carries namespace, duplicate, or history

Published assets must have zero namespaces, zero duplicate node names, and zero construction history. QC blocks publish on any of these three conditions.
7.0.2 — The Mandatory Prefix

Why the Asset Prefix#

Two independent reasons, either one sufficient to make this rule mandatory. A third reason (tool wildcard collision) is in the Reserved Names section.
Node name anatomy — every production node
Scion_head_geo
ScionAsset name prefix — makes this node globally unique across every referenced asset
headPart token — what this node represents, in camelCase for compounds
geoType suffix — the Maya node type. Mesh = geo, group = grp, joint = jnt
Correct vs incorrect
Scion_head_geo
Correct — globally unique, asset name prefix present
head_geo
Wrong — bare name collides when Rhea is also referenced
A

Namespace-free referencing

§7.1 mandates namespace-free referencing. Without namespaces, two referenced assets that both contain head_geo collide in the same scene. The prefix keeps them apart: Scion_head_geo and Rhea_head_geo are unambiguous.
B

FBX export strips namespaces

UE5 is where all assets land. Even if namespaced referencing were used, Scion:head_geo and Rhea:head_geo both arrive in Unreal as head_geo. The namespace does not survive the FBX round-trip; the prefix does.
7.0.3 — CHR / CRT
Asset Scope

Character & Creature#

Applies to CHR (humanoid heroes and supporting cast) and CRT (non-humanoid creatures). The hierarchy is the same for both types. The split that matters most is geo as a sibling of the rig — never a child of it.
CHR_Scion                       ← single top node, pivot at world origin, base of asset (REQUIRED)
├── Scion_geo_grp               ← EXPORTS to UE5 (together with the skeleton) (REQUIRED · exports: fbx)
│   ├── Scion_body_grp          ← main body; required once the asset has >1 mesh (conditional)
│   │   ├── Scion_head_grp
│   │   ├── Scion_torso_grp
│   │   ├── Scion_arms_grp
│   │   └── Scion_legs_grp
│   ├── Scion_cloth_grp         ← garments, separable for CFX
│   │   ├── Scion_upper_grp
│   │   ├── Scion_lower_grp
│   │   └── Scion_outer_grp     ← coats, capes
│   ├── Scion_acc_grp           ← accessories, jewellery, gear
│   │   ├── Scion_accHead_grp   ← renamed from _head_grp — collided with the body group
│   │   ├── Scion_accHands_grp
│   │   ├── Scion_accFeet_grp
│   │   └── Scion_gear_grp
│   └── Scion_hair_grp          ← mesh/card hair only — XGen lives in the groom group
├── Scion_rig_grp               ← NEVER exports to UE5 (container only)
│   ├── Scion_skeleton_grp      ← EXCEPTION: joints DO export alongside geo_grp (REQUIRED · exports: fbx)
│   ├── Scion_ctrl_grp          ← animation controls, does not export (REQUIRED)
│   ├── Scion_systems_grp       ← ikHandles, constraints, utility nodes — suffix rule exempt
│   └── Scion_deform_grp        ← lattices, wraps, blendshape targets — suffix rule exempt
├── Scion_grm_grp               ← grooming — EXPORTS via Alembic, not FBX (exports: abc)
│   ├── Scion_desc_grp          ← XGen descriptions (_desc)
│   └── Scion_guides_grp        ← guides, density and region maps
├── Scion_cfx_grp               ← sim setups, colliders — EXPORTS via Alembic (exports: abc)
├── Scion_prx_grp               ← animator stand-in — sibling of geo, never inside it
└── Scion_util_grp              ← refs, scale figure — never rendered, never exported
Concrete node name examples — CHR_Scion
CHR_Scion
Root — the one and only top-level node
Scion_l_eye_geo
Left eye mesh — side prefix between asset name and part
Scion_l_upperArm_jnt
Left upper arm joint — camelCase compound part
Scion_l_wrist_ctrl
Left wrist animation control
Scion_l_arm_geo_grp
Wrong — a PART group stutters. Only the asset top-level group is _geo_grp

Why geo is a sibling of the rig, not a child

Skinned geometry parented under the rig hierarchy double-transforms through the skinCluster. It is the most common rigging failure there is, and this hierarchy prevents it structurally rather than by discipline. Scion_geo_grp and Scion_rig_grp must always be siblings directly under the root.

CC5 / Auto-Setup caveat

Characters largely arrive from Character Creator 5 via Auto-Setup, which imposes its own internal structure. The hierarchy above is what Maya cleanup conforms the asset to — it is not what CC5 hands you. Confirm against a real CC5 export before assuming a one-to-one match, and report drift to the VFX Supervisor rather than inventing a local variant.
7.0.4 — VHC / BLD / PRO / WPN
Asset Scope

Hard Surface#

Same skeleton as CHR/CRT, but simpler. The key split for hard-surface assets is what moves versus what does not. Drop any group that does not apply to the specific asset.
VHC_Skiff                       ← single top node, pivot at world origin, base of asset (REQUIRED)
├── Skiff_geo_grp               ← EXPORTS to UE5 (together with the skeleton) (REQUIRED · exports: fbx)
│   ├── Skiff_body_grp          ← main body; required once the asset has >1 mesh (conditional)
│   │   ├── Skiff_shell_grp     ← outer skin
│   │   ├── Skiff_frame_grp     ← chassis / structure
│   │   └── Skiff_detail_grp    ← greebles, small fixtures
│   ├── Skiff_moving_grp        ← *** NOT FROZEN — pivots stay on the axle/hinge ***
│   │   ├── Skiff_wheels_grp    ← pivot at the axle centre
│   │   ├── Skiff_doors_grp     ← pivot on the hinge line
│   │   └── Skiff_mech_grp
│   ├── Skiff_int_grp           ← interior, separable for cutaways
│   │   ├── Skiff_cockpit_grp
│   │   └── Skiff_fixtures_grp
│   ├── Skiff_mod_grp           ← modular kit pieces destined for UE5 instancing
│   │   ├── Skiff_walls_grp
│   │   ├── Skiff_floors_grp
│   │   └── Skiff_roof_grp
│   └── Skiff_dressing_grp      ← set dressing bolted onto the shell
├── Skiff_rig_grp               ← NEVER exports to UE5 (container only)
├── Skiff_prx_grp               ← animator stand-in — sibling of geo, never inside it
└── Skiff_util_grp              ← refs, scale figure — never rendered, never exported
Variations by type
BLD_SanctumTower
BLD root — replace moving_grp with mod_grp + dressing_grp for modular pieces
SanctumTower_mod_grp
BLD — modular repeating pieces destined for UE5 instancing
PRO_ContainerA
PRO with no moving parts — needs only geo_grp and util_grp
ContainerA_body_geo
Single static mesh inside a minimal PRO hierarchy
WPN_HeroSword
WPN — weapons usually need rig + per-shot anim, so rig_grp is typically present
7.0.5 — grm
Defined — Not Active

Grooming#

The grm department is defined and canonical but is not in use at this time. The convention is documented here so the first groom task on the show has a structure to land in rather than inventing one under deadline. Confirm with the VFX Supervisor before starting any groom work.

Status: defined-but-dormant

No groom tasks are currently open on Thresholds. The folder grm/ exists under every CHR and CRT asset folder. Do not open tasks in it, and do not populate Scion_grm_grp in a published scene, without VFX Supervisor sign-off.
Scion_grm_grp                    ← child of CHR_Scion, sibling of geo_grp and rig_grp
├── Scion_hairMain_desc          ← XGen description, suffix _desc
├── Scion_brows_desc
├── Scion_lashes_desc
└── Scion_grm_util_grp           ← guides, density maps, region maps

XGen naming rules

XGen descriptions take the _desc suffix. XGen collections take _col. Groom geometry that is rendered as mesh (card hair, painted strands) rather than as splines is not a groom node — it is Scion_hair_grp under Scion_geo_grp (see Character & Creature above).
7.0.6 — ENV
Asset Scope

Environment#

Environments have a different shape because worlds are assembled rather than modelled, and Gaussian Splats are not meshes. The splat group and lighting group are unique to ENV — no other asset type carries them at this level.
ENV_RustGorge                         ← single top node, pivot at world origin, base of asset (REQUIRED)
├── RustGorge_splat_grp               ← Gaussian Splat PLY placement nulls
├── RustGorge_geo_grp                 ← EXPORTS to UE5 (together with the skeleton) (conditional · exports: fbx)
│   ├── RustGorge_hero_grp            ← close to camera, full detail
│   │   ├── RustGorge_terrain_grp
│   │   └── RustGorge_structures_grp
│   ├── RustGorge_mid_grp             ← mid-distance, reduced detail
│   ├── RustGorge_bg_grp
│   └── RustGorge_scatter_grp
├── RustGorge_set_grp
│   ├── RustGorge_props_grp
│   └── RustGorge_veg_grp
├── RustGorge_lgt_grp                 ← environment lighting — groups mirror the AOV split
└── RustGorge_util_grp                ← refs, scale figure — never rendered, never exported
Environment node examples across the ten worlds
ENV_RustGorge
Root — matches the Drive asset name exactly
RustGorge_cliffFace_geo
Hero mesh inside hero_grp — camelCase compound part name
ENV_BurialSea
Second environment root — name matches Drive slug burialSea/ PascalCase
BurialSea_waterSurface_geo
Hero mesh for the Burial Sea environment

Scale rule — environments must match character scale exactly

All environment assets are authored at real-world scale in centimetres, identical to characters. A mismatch discovered downstream costs the entire environment department a re-export pass. When in doubt, drop a scale reference figure into RustGorge_util_grp and compare against CHR_Scion before publishing.
7.0.7 — Collision Risk
DANGER

Reserved Names#

The following names are permanently off-limits for any production node on this show. Using any of them will break the PXLtools TurnTable for every artist running it — not just yours.
Why this breaks things

Wildcard collision in the TurnTable

The PXLtools TurnTable performs unqualified wildcard lookups: cmds.ls("*:mainModel_grp"), cmds.ls("*:cloth_geo"), cmds.ls("*:main_CAM"). A production node carrying any reserved name collides across namespaces and breaks the TurnTable for everyone. This is also the third reason the asset name prefix is mandatory: Scion_cloth_geo cannot collide; cloth_geo will. The reserved list below is exhaustive — it matches the reserved array in THS.convention.json.
RESERVED — do not use any of these names on any production node:

TT_SCENE_grp    _TT_setup_grp   mainModel_grp   charts_grp      macbeth_grp
refBall_grp     scaleMove_GRP   shaderBall_grp  ENV_grp         utilities_grp
rotations_grp   sizeRef_grp     CAM_grp         lights_grp      asset_ROT
lights_ROT      main_CAM        chart_CAM       aiSkyDome_HDRI  aiSwitchHDRI
cloth_geo       liquid_geo      TT_userRigs_grp

Reserved prefix — any name beginning with this prefix is off-limits:

TT_loc_*
Also off-limits — these already exist in the TurnTable

Do not rebuild what the TurnTable provides

The TurnTable already provides a Macbeth ColorChart, the reference balls (Chrome, Grey, White), a shader ball, and scale references. Do not build your own versions of these in your asset scene, and do not name yours after them. The lookdev rule ("validated against MacBeth ColorChart, Chrome Ball, Grey Ball, White Ball") refers specifically to the ones in the shipped TurnTable scene.
Correct names vs reserved collision
Scion_cloth_grp
Correct — asset prefix prevents wildcard collision
cloth_geo
RESERVED — wildcard match breaks TurnTable immediately
Scion_key_cam
Correct — production camera with asset prefix
main_CAM
RESERVED — TurnTable looks for exactly this name
7.0.8 — Shading Network
Asset Scope

Materials & Textures#

Material, shading-group, and texture-node naming is already enforced in code by the PXLtools PBR Material Manager and duplicated in the GLB Manager. The Bible adopts the tool convention rather than competing with it. Map tokens are the same set used for texture files on disk (§6.5a) — one vocabulary end to end.
Node type Pattern Concrete example — Scion body
Material {asset}_{part}_MAT Scion_body_MAT
Shading group {asset}_{part}_MAT_SG Scion_body_MAT_SG
Texture file node {asset}_{part}_{MAP}_tex Scion_body_DIFF_tex
place2dTexture {asset}_{part}_place2d Scion_body_place2d

Uppercase exception: _MAT and _SG

These two suffixes are deliberately uppercase, against the lowercase-tokens rule in §6.1 rule 6. They ship this way from the PXLtools PBR Material Manager and from the GLB Manager. Changing them means editing two tools to match a document. Until that tool update happens, _MAT and _SG stay uppercase. Every other suffix on this show is lowercase.

ORM — Packed AO · Roughness · Metallic

ORM is a single RGB image carrying three greyscale maps in its channels. It is a games convention, not a VFX one — but it is valid on Thresholds for two reasons: the show renders in Unreal, where packed maps are the native efficiency, and suppliers (notably Basam's texture sets) deliver this way.
ChannelContainsNotes
R Ambient Occlusion (AO) In Maya: drive into AO slot if the look calls for it, or ignore. Never into a colour input.
G Roughness (RGH) Wire G directly to the roughness / specularRoughness input at the shader.
B Metallic (MTL) Wire B directly to the metalness input at the shader.

ORM handling rules

Accept ORM. Do not demand a repack from a supplier who delivers it, and do not repack separate maps into ORM without a reason. In Maya, an ORM map must be decomposed at the shader: R ignored or driven into an AO slot, G to roughness, B to metalness. Never plug an ORM straight into a colour input. Set the file node to raw / non-colour — ORM is data, not colour. An sRGB transform on it silently corrupts all three channels. If both ORM and separate RGH/MTL exist for the same asset, the separate maps win and the ORM is redundant.
Material node examples — Scion
Scion_skin_MAT
Skin material — uppercase _MAT is the deliberate exception
Scion_skin_MAT_SG
Corresponding shading group
Scion_skin_DIFF_tex
Base colour file node — map token in uppercase, node suffix _tex in lowercase
Scion_skin_ORM_tex
Packed ORM file node — must be set to raw/non-colour, then decomposed
Tool Gap

PBR Material Manager — ORM not yet handled

The PXLtools PBR Material Manager does not currently handle ORM. It needs an ORM flag that creates the file node as raw and auto-wires G to roughness and B to metalness. Until then this is a manual shader connection. Tracked in PXLtools. The workaround is to create the file node manually, set colour space to raw, and hand-connect the individual channels.
Tool Gap

Token divergence — PBR Material Manager vs canonical set

PXLtools_PBR_Material_v1_5_6.py ships a MAP_SUFFIX list containing OPC, TRANS, SPC and SHEEN, and is missing AO, ORM, HGT, THICK, CAV and MASK#. The canonical set is §6.5a, enforced by PXLflow/src/constants.js TEXTURE_MAP_TOKENS. Where the tool disagrees with §6.5a, §6.5a wins — the tool is the thing that needs updating. Tracked in PXLtools.
7.0.9 — Reference

Suffix Dictionary#

The complete list of node type suffixes for Maya. Every node must end in one of these. Two entries (_MAT and _SG) are uppercase by deliberate tool convention — all others are lowercase.
Suffix

Node Type Suffixes

_geo
Renderable mesh
Any polygon mesh that renders. Leaf nodes only — never a container. Example: Scion_head_geo
_grp
Group / null
Any transform node used as a container or organisational group. Example: Scion_body_grp
_jnt
Joint
Skeleton joint. Example: Scion_l_upperArm_jnt
_ctrl
Animation control
NURBS curve used as an animator's control handle. Does not export. Example: Scion_l_wrist_ctrl
_loc
Locator
Maya locator. Used for pivot references, aim targets, attach points. Example: Skiff_thrustPoint_loc
_prx
Proxy / stand-in
Low-resolution stand-in mesh for layout and instancing. Never rendered in production shots. Example: Skiff_body_prx
_cam
Camera
Maya camera node. Example: Scion_key_cam
_crv
NURBS curve (non-control)
NURBS curve that is not an animation control — motion path, reference curve, guide. Example: Scion_motionPath_crv
_lgt
Light
Any Maya light node. Example: key_lgt, fill_lgt
_set
Selection set
Maya objectSet. Example: Scion_face_set
_desc
XGen description
XGen description node (groom). Example: Scion_hairMain_desc
_col
XGen collection
XGen palette / collection that groups multiple descriptions. Example: Scion_head_col
_MAT
Material
Uppercase exception
Arnold / surface shader node. Uppercase by tool convention. Example: Scion_body_MAT
_SG
Shading group
Uppercase exception
Maya shadingEngine node. Uppercase by tool convention. Example: Scion_body_MAT_SG

The two uppercase exceptions and why they exist

_grp is lowercase — the general rule. Two in-house exceptions exist and are not to be copied or extended: the TurnTable's scaleMove_GRP and the GLB Manager's <Asset>_GRP import root. These are legacy artifacts. Do not add new uppercase suffix variants.
7.0.10 — lgt

Lighting Setups#

Shot lighting uses the same naming vocabulary as everything else. The critical constraint is that light groups must mirror the AOV split exactly — this is not cosmetic and missing it means manual reconstruction per shot.
SEQ010_sh0010_lgt_grp            ← shot light rig root, matches shot naming convention
├── char_lgt_grp                 ← ALL lights that contribute to the char AOV
│   ├── key_lgt
│   ├── fill_lgt
│   └── rim_lgt
├── env_lgt_grp                  ← ALL lights that contribute to the env AOV
│   ├── sky_lgt
│   └── bounce_lgt
└── fx_lgt_grp                   ← ALL lights that contribute to the fx AOV
    └── prac_window_lgt
Individual light name examples
key_lgt
Key light — role-based name, suffix _lgt
fill_lgt
Fill light
rim_lgt
Rim / back light
l_bounce_lgt
Left-side bounce light — side prefix on the role token
prac_window_lgt
Practical window source — compound role name

Light groups must mirror the AOV split exactly

The required AOV passes are char, env, and fx (see §7.2). Light groups on every shot must be named char_lgt_grp, env_lgt_grp, and fx_lgt_grp — and every light must live inside the group that matches the pass it contributes to. If the light groups do not match the AOV structure, the pass separation has to be rebuilt by hand for every shot at composite time. This is not a naming preference; it is the mechanism by which the comp receives isolatable passes.
7.0.11 — Maya to Unreal

UE5 Export Contract#

Unreal requires a single root and — for skeletal meshes — only joints and bound mesh in the FBX. The hierarchy in §7.0.3–7.0.4 is designed so that the correct export selection is always a single group, not a manual cleanup pass.
Static mesh Export <Asset>_geo_grp SM_<Asset> in Unreal
Skeletal mesh Export <Asset>_geo_grp + <Asset>_skeleton_grp together SK_<Asset> in Unreal
NEVER export _ctrl · _crv · _loc · _systems_grp · _deform_grp · _util_grp · _prx_grp
Resulting Unreal asset names — using §7.2 naming
SM_Skiff_Body
Static mesh from Skiff body group — Unreal PascalCase descriptor
SK_Scion
Skeletal mesh — geo_grp + skeleton_grp exported together
SKEL_Scion
Skeleton asset created by Unreal on import from the joint hierarchy

Why the hierarchy makes this one click

Controllers, IK handles, and constraints must not be in the FBX export selection. If geometry were parented under the rig (violating rule 09), a clean export would require manually picking individual meshes. With the §7.0.3 hierarchy, selecting Scion_geo_grp and Scion_skeleton_grp gives exactly the right content — nothing more.

For the full Unreal naming convention (prefixes, content folder structure, texture naming, level and sequence names) see Unreal Conventions.
7.0.12 — Known Gap

GLB Import Gap#

The PXLtools GLB Manager produces a scene that does not conform to this hierarchy. Its output is a starting point, not a compliant published asset. Manual cleanup is required before publishing.
GLB OUT

What the GLB Manager produces

Root named <Asset>_GRP (uppercase, no type prefix)

Flat meshes named <Asset>, <Asset>_1, <Asset>_2… (no _geo suffix, no sub-groups)

Transforms not frozen
TARGET

What publish requires

Root named TYPE_AssetName (e.g. CHR_Rhea)

Meshes named <Asset>_<part>_geo inside a _geo_grp / _util_grp structure

All transforms frozen
Before and after — GLB import cleanup for CHR_Rhea
Rhea_GRP
GLB Manager output root — wrong case, no type prefix, not compliant
CHR_Rhea
Correct root after rename — type prefix + PascalCase asset name
Rhea_1
GLB Manager mesh — no suffix, part identity unknown
Rhea_torso_geo
Correct mesh name after cleanup — asset prefix, part token, _geo suffix

Cleanup steps — in order, before publishing

  1. Rename the root from <Asset>_GRP to TYPE_AssetName (e.g. CHR_Rhea).
  2. Rename all meshes from <Asset> / <Asset>_N to <Asset>_<part>_geo. The PXLtools Batch Renamer automates this step once parts are identified.
  3. Build the group structure: <Asset>_geo_grp, <Asset>_body_grp, and additional groups per §7.0.3–7.0.6 as applicable.
  4. Freeze all transforms.
  5. Confirm pivot is at world origin, at the base of the asset.
Candidate Fix

Flagged to VFX Supervisor for automation

This cleanup sequence is a strong candidate for automation in the GLB Manager: rename root to TYPE_AssetName, add _geo suffix to all flat meshes, auto-build the _geo_grp / _util_grp structure, and freeze transforms on import. Until that tool update is confirmed, the manual steps above are mandatory before publish.