SMD: Difference between revisions
Solokiller (talk | contribs) m (→Triangles) |
TomEdwards (talk | contribs) (→Vertexanimation: details) |
||
Line 142: | Line 142: | ||
=== Vertexanimation === | === Vertexanimation === | ||
Position of vertices in various morph targets | Position of vertices in various morph targets, for use in [[flex animation]]. While this block uses the same <code>time</code> keyword as <code>[[#Skeleton|skeleton]]</code>, each 'frame' is instead a discrete, static shape. Transitions between them are created on-demand by the engine. | ||
{{ | {{note|A <code>[[#Nodes|nodes]]</code> and a <code>[[#Skeleton|skeleton]]</code> block are needed in each VTA!}} | ||
==== Syntax ==== | ==== Syntax ==== | ||
Line 151: | Line 151: | ||
: Begins the vertex animation block. | : Begins the vertex animation block. | ||
;<code>time <[[int]]></code> | ;<code>time <[[int]]></code> | ||
: Begins a morph target. | : Begins a morph target. The first target must include all vertices on the mesh; all subsequent targets should include only vertices that have changed. | ||
; <code><int|ID> <[[float]]|PosX PosY PosZ> <[[normal]]|NormX NormY NormZ></code> | ; <code><int|ID> <[[float]]|PosX PosY PosZ> <[[normal]]|NormX NormY NormZ></code> | ||
: A vertex. | : A vertex. | ||
:* ID is defined by its position in <code>[[#Triangles|triangles]]</code> | :* ID is defined by its position in <code>[[#Triangles|triangles]]</code> | ||
:* <code>Pos</code> is in world [[unit]]s | :* <code>Pos</code> is in absolute world [[unit]]s | ||
:* <code>Norm</code> is used to smooth the surface of the model ({{TODO|How?}}) | :* <code>Norm</code> is used to smooth the surface of the model ({{TODO|How?}}) | ||
; <code>end</code> | ; <code>end</code> |
Revision as of 11:26, 1 August 2010
The Studiomdl Data file format stores 3D models in ASCII for analysis and compilation by studiomdl. SMD files are usually generated by an SMD export plug-in for a given model editor package.
- The format is carriage return sensitive: each command must be on a separate line. There should also be a single blank line at the end (and only the end) of the file.
- White space is the only delimiter: any combination of tabs and spaces can be used to separate values, and for this reason multiword names should be enclosed in "quotation marks".
- Comments may be lines starting with
#
,//
or;
Types
- Reference / Collision
- A complete snapshot of the model, including one frame of animation to define the default pose. Collision meshes follow the same pattern.
header
nodes
skeleton
triangles
- Animation
- A single skeletal animation.
header
nodes
skeleton
- Vertex
- For flex animation. Usually has extension
.vta
. Precise structure unclear. header
nodes
skeleton
vertexanimation
Data blocks
Here are the components of an SMD file, considered in order:

Header
Simply:
version 1
Nodes
A list of all the bones in the model.

Syntax
nodes
- Starts the node block.
<int|ID> "<string|Bone Name>" <int|Parent ID>
- A bone definition. Unique ID number (does not have to be sequential), name in quote marks and the parent bone's ID. Bones without parents (i.e. children of the world) have a Parent ID of
-1
. end
- Ends the data block.
Example
A root bone with one child:
nodes 0 "root" -1 1 "child" 0 end
Skeleton
Position data for each bone in each animation frame. In a reference SMD there is only one frame, which contains the model's default posture.

Syntax
skeleton
- Begins the skeleton block.
time <int>
- Begins a new frame. Any range of numbers can be used, so long as they increase sequentially.
<int|bone ID> <float|PosX PosY PosZ> <float|RotX RotY RotZ>
- A bone's position relative to its parent (give absolute values in the case of root bones).
Pos
is position in units.Rot
is local Euler angles, given in radians. (90° = 1.570796 rad)
Tip:The first frame must include all bones. After that, those which have not moved relative to their parent since the last frame can be omitted.
end
- Ends the data block.
Example
Bone 1 move two units along the Y axis, then back again:
skeleton time 0 0 0 0 0 1.570796 0 0 1 1 0 0 0 0 0 time 1 1 1 2 0 0 0 0 time 2 1 1 0 0 0 0 0 end
Triangles
A triangle in a model is defined by three vertices. Included in each triangle is its UV co-ordinates and envelope weights.

Syntax
triangles
- Begins the triangle block.
<material>
- Defines the start of a new triangle and the material to apply to it. Anything after a '.' (e.g. a file extension) is ignored. Do not enclose in quotes and do not include a path ($cdmaterials will provide one).
<int|Parent bone> <float|PosX PosY PosZ> <normal|NormX NormY NormZ> <normal|U V> <int|links> <int|Bone ID> <normal|Weight> [...]
- Defines a vertex.
- The final three values are optional: they override
<Parent bone>
to define a series of weightmap links.Bone ID
andWeight
are repeated for each link. If the weights do not add up to 1, any remaining value is placed on<Parent bone>
.Note:For SMDs included with $lod, Studiomdl can determine a vertex's weight links by copying those of the closest reference mesh vertex.
end
- Ends triangle block.
Example
A flat, two-sided square. The left edge envelopes bone 0 and the right edge envelopes bone 1, and the UV map is a simple square projection:
triangles my_material 0 0 0 0 0 0 1 0 1 1 0 1 0 0 -1 0 0 0 1 0 0 1 0 1 1 1 -1 0 0 0 1 1 0 1 1 1 my_material 0 0 0 0 1 0 1 0 1 1 0 1 1 1 -1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 my_material 1 1 -1 0 0 0 1 1 0 1 1 1 0 0 -1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 1 my_material 1 1 0 0 1 0 1 1 1 1 1 1 1 1 -1 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 end
Vertexanimation
Position of vertices in various morph targets, for use in flex animation. While this block uses the same time
keyword as skeleton
, each 'frame' is instead a discrete, static shape. Transitions between them are created on-demand by the engine.
Syntax
vertexanimation
- Begins the vertex animation block.
time <int>
- Begins a morph target. The first target must include all vertices on the mesh; all subsequent targets should include only vertices that have changed.
<int|ID> <float|PosX PosY PosZ> <normal|NormX NormY NormZ>
- A vertex.
end
- Ends the data block.