🛡️ TA Archive

Generic 3DO Animation Rules

Core rule

Animation must be driven by the pair:

COB piece operation + 3DO parent hierarchy

The COB supplies the operation, axis, target, speed, waits, and runtime parameters. The 3DO supplies the piece origins and parent/child relationships.

Transform law

For each piece, recursively evaluate:

world(piece) = world(parent)
              × translation(piece offset + local move)
              × local rotation

A rotation belongs to the piece pivot and transforms the complete descendant subtree. Ancestors remain fixed. A MOVE belongs to the piece’s local axis and moves only that piece’s subtree.

Examples:

turret / Y rotation → turret + all descendants
sleeve / X rotation → sleeve + barrel + flare
barrel / Z move    → barrel + flare only

Never rotate already-composed world matrices independently for each child. That leaves descendants behind or rotates them around their own origins.

Runtime inputs

If COB contains:

turn turret to y-axis heading speed <5>;
turn sleeve to x-axis (0-pitch) speed <2>;

heading and pitch are runtime inputs, not fixed angles to invent in the renderer. A generic preview must either provide explicit inspection values or reproduce the game state that supplies them.

Diagnostic method

Before trusting an unknown unit:

  1. Parse its 3DO tree and list piece origins and parents.
  2. Disassemble its COB and list MOVE/TURN/SPIN axes and targets.
  3. Draw each operation axis from the transformed piece pivot.
  4. Apply one operation at a time to a neutral pose.
  5. Verify that only the correct descendant subtree moves.
  6. Add waits/sleeps and runtime input values.
  7. Render the complete animation with a fixed camera envelope.

Changing camera yaw must happen after model-space animation transforms. Otherwise a correct local axis can appear to be the wrong screen axis.

Effects and auxiliary pieces

Effects such as flare are ordinary 3DO child pieces. They inherit every ancestor transform. They must not be separately positioned merely because they are visually small.

Signature convention

The COB/script coordinate frame is rotated 180° about Y relative to the 3DO file frame. Verified on ARMANNI, ARMBRTHA, and ARMEMP:

script +x = 3DO −x
script +z = 3DO −z
script y  = 3DO y (direct)

Every x/z MOVE target takes the inverted sign in the renderer. With that rule ARMEMP’s frames slide outward from the unit centre automatically, ARMANNI’s walls hinge outward, and ARMBRTHA recoils correctly. No per-unit sign tables are needed.

COB number formats

The disassembler prints BAM-converted “deg” values (raw = deg × 65536/360). MOVE distances in that display are raw 3DO units: printed 2610 means 2.9 elmos ≈ 475,000 3DO units, not 2610 units. Preview distance = printed × 65536/360.

Current evidence

The rules were verified on ARMBRTHA and ARMARAD. ARMEMP confirms both the sign convention and the generic phase sequencing (doors → frames spread → covers turn → launch → retrace). ARMEMP hierarchy:

GP → Base → Door1/Door2, Frame1–4, Dummy, Launch
Frame1 → Cover1, Frame3 → Cover2

No unit-specific geometry correction is required when the generic hierarchy, local-axis rules, and sign convention are respected.