I’m working on an importer and exporter for the Studiomdl Data format. It’s all going very well except for bones.

Here are the problems:

- SMD bones are 1D points with euler rotation, relative to their parent
- Blender bones have a head and a tail, relative to the whole armature
- SMD bones point down the Z axis
- Blender bones point down the Y axis
- SMD is right-handed
- Blender is left-handed

This is a solvable problem, I just don’t have the skills to succeed. Can anyone help me?

My current theory on the process required for export is:

- Convert bone vector to euler
- Convert euler to matrix
- Multiply euler by inverse parent matrix, write euler
- Multiply matrix by parent’s equivalents
- Subtract parent head from bone head
- Multiply location by inverse matrix, write location

And for import:

- Convert euler to matrix
- Convert location to matrix
- Combine matrices
- Head location = location * parent matrix
- Tail rotation = location + ([0,0,1] * parent matrix)

The offending functions are readFrames() and writeFrames(), if you want to have a poke. There are a bunch of SMDs available here for import, but unless you already have the Half-Life Model Viewer the only way to test export is going to be with the Alien Swarm SDK, which is about 2GB…