Vereinfachen Sie die Erstellung der Transformation matrix durch die Ketten operationen

Contents
[ ]

Angenommen, es gibt eine TransformBuilder-InstanzTbUnd Ketten operationen:

C#

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

var 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)

.RotateEulerDegree(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(Axis.ZAxis, Axis.YAxis, Axis.XAxis)

.Matrix;



public enum ComposeOrder

{

   /// <summary>

   /// Append the new transform to the chain

   /// </summary>

   Append,

   /// <summary>

   /// Prepend the new transform to the chain

   /// </summary>

   Prepend

}

Wenn die Kompose-Reihenfolge dieser Instanz Prepend ist, wird die endgültige Matrix von links nach rechts berechnet, was bedeutet, dass die endgültige Transformation matrix diese Aufgaben erledigt:

  1. Ändern Sie die (x, y, z) in (x 1, y, z)
  2. Drehen Sie sich allein mit der Y-Achse mit 180deg ändert die (x, y, z) in (-x, y, -z)
  3. Die Skalierung um 2 ändert die (x, y, z) in (2x, 2y, 2z)
  4. Ändern Sie die (x, y, z) in (z, y, x)

Aber wenn die Zusammensetzung reihenfolge Append ist, wird die Reihenfolge wie folgt umgekehrt:

  1. Ändern Sie die (x, y, z) in (z, y, x)
  2. Die Skalierung um 2 ändert die (x, y, z) in (2x, 2y, 2z)
  3. Drehen Sie sich allein mit der Y-Achse mit 180deg ändert die (x, y, z) in (-x, y, -z)
  4. Ändern Sie die (x, y, z) in (x 1, y, z)

C#

 //use prepend order so the calculation is performed from left to right:

var m = (new TransformBuilder(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)

   .RotateEulerDegree(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(Axis.ZAxis, Axis.YAxis, Axis.XAxis)

   .Matrix;

 //Apply this matrix on a (0, 0, 0) vector, then we get the right result (0, 0, -2)

 var t = m * Vector3.Origin;