Algorithm and reasoning behind a CAD-like approach to defining 3D animation sequences.
Traditional animation tools use keyframes with absolute timestamps. Change one keyframe's timing and you must manually adjust everything that follows. The parametric sequencer instead uses declarative, constraint-based definitions—similar to CAD, where you define relationships (e.g. "this hole is concentric with that cylinder") rather than raw coordinates.
Why this matters for assembly animations:
The sequencer converts a declarative scene definition into a flat, time-resolved keyframe stream. You define what should happen and when relative to what; the reconciliation algorithm figures out when in absolute time and produces interpolated state for any playback time.
Models are reusable 3D assets (e.g. main-body, m3x8-shcs screw). Each model can have multiple LODs and positional markers (insert points, attachment locations). Models are defined in Blender and exported via a headless script—markers are EMPTY objects in Blender, exported with location and rotation.
SceneObjects are instances in a scene that reference a model. Each SceneObject has position, markers, and animation nodes. SceneObjects are defined in the sequencer editor, not in Blender. One model can be used by many SceneObjects (e.g. multiple screws, each an instance of the same model).
Reconciliation converts a declarative scene (nodes with relative timing and positioning) into a flat keyframe stream that can be sampled at any time.
currentTime, walk keyframes and interpolate between previous and target state. Models start at default state (opacity 0); each keyframe applies its target values over its duration. Position/opacity use linear interpolation; rotation uses SLERP.Relative timing and marker-based positioning are completely independent. One governs when keyframes occur; the other governs where objects are positioned.
Nodes can depend on other nodes for when they start (e.g. "start 0.5s after node1 ends"). Dependencies are resolved in topological order. This is purely about the temporal ordering of keyframes on the timeline.
Marker-based positioning answers: where is this object, relative to another object? It does not create a scene-graph hierarchy. Each keyframe can independently choose: position at a marker on object X, or position absolutely. That allows:
The goal: a reliable way to position objects relative to each other while being able to separate and combine them over time—without baking a real parent-child hierarchy into the scene. The "hierarchy" is per-keyframe, not structural.
All animated values are interpolated within each keyframe's duration. The result is continuous state for any playback time.