Studiomdl Data

From Valve Developer Community

Jump to: navigation, search
SMD has been superseded by the DMX model format.

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.

Aside from Source and GoldSrc, SMD is known to be used by Sauerbraten and third party tools for The Sims and Mount & Blade.

General notes

  • X is north in SMD. Elsewhere in Source it is east.
  • The format is carriage return sensitive: Linux-based text editors should use CR or CRLF line terminators instead of just LF. 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".
    Bug:Avoid using tab. Its presence can crash studiomdl in very large SMDs.
  • Stand-alone line comments start with // (double foreslash)
  • Emd-line comments start with # (hashtag) or ; (semicolon)

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
A flex animation library. Usually has extension .vta.
header
nodes
skeleton (a "time <n>" header for each flex shape; no position data required)
vertexanimation

Data blocks

Here are the components of an SMD file, considered in order:

Tip:Unless otherwise noted all integer values begin at 0 and all floating point values are limited to six decimal places.

Header

Simply:

version 1

Nodes

A list of all the bones in the model.

Note:Bones without attached vertices will not be compiled.

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.
Note:Studiomdl matches bones across SMDs by name. IDs are internal to each file.
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.

Note:There can only be one animation in each SMD.

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).
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.

Note:Source's triangles are one-sided. The active face is the one around which the vertices can be traced clockwise.

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.
  • Pos is in world units
  • Norm is used to smooth the surface of the model (To do: How?)
  • U and V are the vertex's UV map co-ordinates
The final three values are optional: they override <Parent bone> to define a series of weightmap links. Bone ID and Weight 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.

Note:A nodes and a skeleton block are needed in each VTA. The skeleton block needs only contain a "time <n>" header for each flex shape.

Syntax

vertexanimation
Begins the vertex animation block.
time <int>
Begins a morph target. The first target must include all vertices on the mesh in their reference positions; subsequent targets should include only vertices that differ from the reference.
<int|ID> <float|PosX PosY PosZ> <normal|NormX NormY NormZ>
A vertex.
  • ID is the position of the equivalent reference vertex in the triangles block
  • Pos is in absolute world units
  • Norm defines the direction from which the vertex receives the most light
end
Ends the data block.
Personal tools
Namespaces
Variants
Actions