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/?a=commitdiff_plain;h=be787bc40ba0bb9c7bb622b6172f24b8b8119ec6;p=libs%2Fgl.git 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)