4
$\begingroup$

I'm writing a custom exporter from Blender that will work with DirectX. I am using as a guideline the DirectX exporter found in Blender 2.76. The Blender export script for DirectX uses the following conversion matrix:

code:

# SystemMatrix converts from right-handed, z-up to the target coordinate system
self.SystemMatrix = Matrix()

if self.Config.CoordinateSystem == 'LEFT_HANDED':
    self.SystemMatrix *= Matrix.Scale(-1, 4, Vector((0, 0, 1)))

if self.Config.UpAxis == 'Y':
    self.SystemMatrix *= Matrix.Rotation(radians(-90), 4, 'X')

matrix:

1, 0, 0, 0
0, 0, 1, 0
0, 1, 0, 0
0, 0, 0, 1

I want to write the components of this matrix so I decompose the matrix like so:

loc, rot, sca = self.SystemMatrix.decompose()

now I convert the rotation from quaternion to euler like so:

eul = rot.to_euler('XYZ')

write components ...

The problem is that when I try to recompose the matrix in my DirectX graphics application I get the wrong matrix...

code to recompose matrix:

Matrix m = Matrix.Scaling(sca.x, sca.y, sca.z) * Matrix.RotationYawPitchRoll(eul.x, eul.y, eul.z)
* Matrix.Translation(loc.x, loc.y, loc.z)

result:

0, 0, 1, 0
0, 1, 0, 0
1, 0, 0, 0
0, 0, 0, 1
$\endgroup$
1
$\begingroup$

In your engine you need to compose the matrix m like this:

Matrix m = Matrix.Translation(loc.x, loc.y, loc.z) * Matrix.RotationYawPitchRoll(eul.x, eul.y, eul.z) * Matrix.Scaling(sca.x, sca.y, sca.z)

# matrix_world = matLoc * matRot * matScale
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.