Simplify the creation of transformation matrix by the chain operations

Contents
[ ]

Suppose, there is a TransformBuilder instance tb, and chain operations:

Python


import aspose.threed as a3d

# Change the (x, y, z) into (x + 1, y, z)

tb = a3d.utilities.TransformBuilder(a3d.utilities.ComposeOrder.APPEND)

a = tb.translate(1, 0, 0)
# Rotate alone with the Y axis with 180 deg will change the (x, y, z) into (-x, y, -z)
.rotate_euler_degree(0, 180, 0)
# Scale by 2 will change the (x, y, z) into (2x, 2y, 2z)
.scale(2)
# change the (x, y, z) into (z, y, x)
.rearrange(a3d.Axis.Z_AXIS, a3d.Axis.Y_AXIS, a3d.Axis.X_AXIS)
.matrix


If the compose order of this instance is Prepend, the final matrix is calculated from the left to right, that means the final transformation matrix will do these tasks:

  1. Change the (x, y, z) into (x + 1, y, z)
  2. Rotate alone with the Y axis with 180deg will change the (x, y, z) into (-x, y, -z)
  3. Scale by 2 will change the (x, y, z) into (2x, 2y, 2z)
  4. Change the (x, y, z) into (z, y, x)

But if the compose order is Append, the order will be reversed like:

  1. Change the (x, y, z) into (z, y, x)
  2. Scale by 2 will change the (x, y, z) into (2x, 2y, 2z)
  3. Rotate alone with the Y axis with 180deg will change the (x, y, z) into (-x, y, -z)
  4. Change the (x, y, z) into (x + 1, y, z)

Python


import aspose.threed as a3d

# use prepend order so the calculation is performed from left to right:
m = (a3d.utilities.TransformBuilder(a3d.utilities.ComposeOrder.PREPEND))
   # Change the (x, y, z) into (x + 1, y, z)
   .translate(1, 0, 0)
   # Rotate alone with the Y axis with 180deg will change the (x, y, z) into (-x, y, -z)
   .rotate_euler_degree(0, 180, 0)
   # Scale by 2 will change the (x, y, z) into (2x, 2y, 2z)
   .scale(2)
   # change the (x, y, z) into (z, y, x)
   .rearrange(a3d.Axis.Z_AXIS, a3d.Axis.Y_AXIS, a3d.Axis.X_AXIS)
   .matrix
# Apply this matrix on a (0, 0, 0) vector, then we get the right result (0, 0, -2)
 t = m * a3d.utilities.Vector3.ORIGIN;