A hundred-millimeter product becomes a hundred meters wide, a left-side opening moves right, or correctly shaped parts land far from their assembly positions. Such failures often occur between generation, authoring, export and viewing rather than in geometry generation itself. This article covers static meshes and their rigid hierarchies under explicit matrix conventions. Skinning, deformation and animation are outside this simplified workflow.
Separate geometry defects from interpretation errors
3D asset representations and delivery checks establish why opening a file is not enough for continued use. Here the focus is its interpretation chain: the same vertex numbers produce different world-space geometry under different units, axes or parent transforms. Locate the error in that chain before asking a generative model to recreate the shape.
Record source file and revision, physical length per unit, axes and handedness, the business meaning of the origin, hierarchy, export settings, destination software version and transforms already baked into vertices. An origin may represent a center, a bottom locating point or an assembly datum. Automatically centering everything is not correct for every delivery.
Use an independent geometric reference: an asymmetric test object with known edge lengths, an offset opening and direction labels checks both size and reflection. A symmetric sphere can still look correct after an axis reversal. Automatic camera framing can make incorrectly scaled models look similarly sized, so a screenshot alone is weak evidence of physical scale.
Align unit declarations, numerical conversion and world space
glTF 2.0 specifies a right-handed, Y-up coordinate system and linear distances in meters.[1] OpenUSD expresses scale through stage-level metersPerUnit, defaulting to 0.01 when unauthored. Its documentation emphasizes fully transformed world-space interpretation and the assembler's responsibility for differently scaled assets.[2] Do not transfer one format's default to another.
Suppose a source mesh has width 100 and its confirmed unit is millimeters. The corresponding width in meters is 0.1. Merely changing metadata to meters without the necessary numerical conversion makes 100 mean a hundred meters. If the exporter already multiplied by 0.001 and the receiver repeats it, the width becomes 0.0001 meters. Trace where each conversion actually occurred.
We recommend recording source unit, target unit, ratio and execution location for each conversion, then checking physical measurements read back in the destination. When scale is unknown, consult design records or known measurements rather than guessing because the object resembles a chair. A generated object without scale evidence can be a proportional asset; automatic resizing does not establish engineering dimensions.
Raw vertices are insufficient. A parent may scale the object while a child adds local translation; global dimensions depend on the composition. Check a known component size and the distance between components, rather than only the largest coordinate in each mesh. Position offsets need a consistent unit convention too.
Do not change axes by merely swapping two components
We use column vectors and write a point conversion as p_target = s × R × p_source + t. Here s is the unit ratio, R changes axis orientation, and t is an offset expressed in target units. This expression applies to points already in source world space; it does not let local vertices bypass their hierarchy. Specify the convention before judging an implementation.
Construct a right-handed Z-up source and a right-handed Y-up destination. Choose the mapping (x, y, z) to (x, z, -y). It sends source up to target up while preserving handedness. How other source directions correspond to the asset's business meaning of front and back still needs agreement. This is not a universal export preset for every application.
Under this convention, a source point (100, 20, 30) millimeters, with s = 0.001 and target offset t = (1, 0, 0) meters, becomes (1.1, 0.03, -0.02) meters. Simply swapping y and z without a sign change produces a negative determinant and introduces reflection. Overall dimensions can remain correct while left and right structure changes.
Test all three basis vectors and an asymmetric feature independently of bounding boxes. With a positive unit ratio and rotation alone, all point-to-point distances should change by the same ratio. Different directional ratios require confirmation that nonuniform scaling is intentional. Do not decide unknown orientation through repeated rotations until the result looks pleasant.
Choose one hierarchy strategy and avoid duplicate transforms
glTF composes local transforms as T × R × S and obtains a node's global transform by multiplying its parent's global transform by its local transform.[1] Mathematical application order is distinct from matrix memory layout. Row-major or column-major storage alone does not identify the multiplication semantics used by code. Test an integration library with known points.
For static delivery, retain the hierarchy and apply a unified conversion at a clearly defined boundary, or apply each object's full source transform to its vertices before converting them and exporting baked geometry. The first preserves component organization; the second may simplify a static viewer. Choose according to the destination and specify whether pivots or independent component operations are still required.
If baked geometry retains the same parent scale or translation, the receiver applies it again. Removing the hierarchy without baking returns parts to local positions. Do not modify vertices and arbitrarily alter every node as well. When changing basis while retaining local matrices, apply consistent basis-change rules rather than replacing a few matrix entries.
Shared meshes require separate attention. Two nodes may reference one mesh with different transforms, so changing shared vertices affects both instances. Instance-specific baking requires separate geometry or a method preserving instancing semantics. Record the file-size cost of replication; baking is not automatically simpler regardless of instance count.
After positions pass, check surface directions
Points, direction vectors and surface normals are different quantities. Points receive translation; direction vectors do not. Under a general invertible linear transform, normals use the inverse transpose of its linear part and are normalized again. Eigen's geometry documentation distinguishes these operations and notes that pure rotations can act directly on normals.[3] Treating a normal as an ordinary direction under nonuniform scaling can produce incorrect lighting.
A zero scale on any axis makes the linear transform singular, invalidating that normal formula and potentially degenerating the geometry. Flag it separately rather than trying to normalize a zero vector. Near-degenerate cases also need numerical-precision checks so unstable results are not exported.
Intentional mirroring is not universally wrong, but record it and handle winding, back-face culling and surface directions according to the destination format and renderer. For display anomalies, inspect duplicate transforms, reflection and normal consistency before enabling double-sided display to conceal the problem. Normal-mapped assets additionally need tangent-space and texture-direction checks; a correct flat color is insufficient.
Inspect the result in the destination with neutral materials, clear side lighting and back-face culling, while checking left and right through asymmetric marks. Lighting tests address surface direction; measurement tools address scale. Passing both does not establish closure, freedom from self-intersections or manufacturing suitability.
Accept the asset through numerical and scene-level checks
First check metadata and provenance: confirmed units, explicit axes and origin, and versioned conversion settings. Second, run deterministic checks on constructed points and basis vectors. The example point should reach the stated target coordinates; a positive scale and rotation should preserve scaled distances; inverse conversion should recover the source within an agreed tolerance. State that tolerance in units and in relation to use, rather than saying only that error is small.
Third, test hierarchy with a static parent-scale and child-translation case, then add two shared-mesh instances. Check world positions and separation. These counterexamples expose missing parent transforms, duplicate baking and unintended edits to every instance. Do not require world-axis-aligned bounding-box dimensions to remain unchanged after rotation: rotation naturally changes them.
Fourth, export and reopen in the actual receiving environment. Measure known dimensions, opening direction, component separation and locating datum, then inspect culling and lighting. Retain the source, conversion rules, destination file and numerical records. When a check fails, locate the first boundary where results differ, fix the conversion configuration and regenerate a candidate instead of overwriting the only original.
The numerical example is a mathematical derivation under stated conventions, not a measured result from an exporter. Engineering CAD, interference checking and manufacturing additionally require their own precision, geometry and process acceptance. Checking the interpretation chain separately eliminates unit and coordinate errors before deciding whether geometry really needs to be rebuilt.
