From: Mikko Rasa Date: Tue, 4 Jun 2019 10:39:27 +0000 (+0300) Subject: Export world transforms for scene objects X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=be787bc40ba0bb9c7bb622b6172f24b8b8119ec6;hp=94d95c02822b2cff8e5d8254fed7b3058584acf7 Export world transforms for scene objects The location, rotation and scale properties contain transform components relative to the somewhat arbitrary basis matrix. Obtain the values from the world matrix instead. A drawback is that nonuniform or negative scaling can produce inconsistent results. --- diff --git a/blender/io_mspgl/export_scene.py b/blender/io_mspgl/export_scene.py index c66feed7..abdd61b0 100644 --- a/blender/io_mspgl/export_scene.py +++ b/blender/io_mspgl/export_scene.py @@ -110,21 +110,22 @@ class SceneExporter: for o in objs: obj_res = resources[prototypes[o.name].name+".object"] st = scene_res.create_reference_statement("object", obj_res, o.name) - # XXX Parent relationships screw up the location and rotation + ss = Statement("transform") - ss.sub.append(Statement("position", o.location[0], o.location[1], o.location[2])) - if o.rotation_mode=="AXIS_ANGLE": - angle = o.rotation_axis_angle[0] - axis = o.rotation_axis_angle[1:] + + loc = o.matrix_world.to_translation() + ss.sub.append(Statement("position", *tuple(loc))) + + quat = o.matrix_world.to_quaternion() + if o.rotation_mode in ('XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'): + angles = [a*180/math.pi for a in quat.to_euler()] + ss.sub.append(Statement("euler", *angles)); else: - if o.rotation_mode=="QUATERNION": - q = o.rotation_quaternion - else: - q = o.rotation_euler.to_quaternion() - angle = q.angle - axis = q.axis - ss.sub.append(Statement("rotation", angle*180/math.pi, axis[0], axis[1], axis[2])) - ss.sub.append(Statement("scale", o.scale[0], o.scale[1], o.scale[2])) + ss.sub.append(Statement("rotation", quat.angle*180/math.pi, *tuple(quat.axis))) + + scale = o.matrix_world.to_scale() + ss.sub.append(Statement("scale", *tuple(scale))) + st.sub.append(ss) scene_res.statements.append(st)