#art-pipeline
11 items (11 fixes)
Two-stage flow: Blender headless emits Y-up OBJ, then pure Python writes vmats/vmdls and a C# model catalog.
Census tris × instances before decimating; prefer BoxCollider over ModelCollider for decorative props.
bpy.ops.wm.obj_export can reorder face lines across runs on the same mesh — diff the manifest, not the raw OBJ bytes.
Census tris × instances first — silhouette fails before UVs; inject usemtl after scripted OBJ export.
CC0 kits import like any OBJ+vmdl; city kits share colormap.png, nature kits need per-color vmats, and facing is a per-model yaw guess.
RenderMeshFile alone compiles clean with zero physics — ModelCollider needs PhysicsMeshFile/PhysicsHullFile in the vmdl.
Blender +X becomes world −Y after OBJ import; yaw +90° faces +X — and Blender +Y rotation tips the +X edge down.
CapsuleCollider and ModelCollider ignore WorldScale; BoxCollider follows it — bake scale into import_scale instead.
1 m = 39.37 engine units — design in SI, convert once at the engine boundary, and audit every consumer.
Scenes never load raw OBJ/GLB — always wrap with a .vmdl and remap materials under both bare and .vmat names.
AI mesh generators (Tripo, Meshy, Rodin) deliver textured OBJ+vmdl — but modeldoc32 headers, ~1m normalize, corrupt textures, bare texture paths, and missing colliders will ERROR the asset until patched.