Упростить создание матрицы преобразования цепными операциями
TransformBuilder
, который упрощает создание матрицы преобразования операциями цепочки.
Предположим, есть экземпляр TransformBuilderТб, И цепные операции:
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
}
Если порядок составления этого экземпляра-Prepend, конечная матрица вычисляется слева направо, что означает, что последняя матрица преобразования выполнит эти задачи:
- Измените (x, y, z) на (x 1, y, z)
- Поворот отдельно с осью Y с 180deg изменит (x, y, z) на (-x, y, -z)
- Масштаб на 2 изменит (x, y, z) на (2x, 2y, 2z)
- Измените (x, y, z) на (z, y, x)
Но если порядок сочинения-Append, порядок будет изменен так:
- Измените (x, y, z) на (z, y, x)
- Масштаб на 2 изменит (x, y, z) на (2x, 2y, 2z)
- Поворот отдельно с осью Y с 180deg изменит (x, y, z) на (-x, y, -z)
- Измените (x, y, z) на (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;
Новые методы в классах Matrix4
и TransformBuilder
являются утилитами для разработчиков для моделирования сцены по программе, поэтому им не нужно вручную создавать матрицу преобразования, это обычно используется опытными разработчиками.
Обычные разработчики могут использовать свойство Transform
класса Node
для изменения трансляции/масштабирования/вращения объекта.
Разработчики также могут назначить матрицу, созданную TransformBuilder
, Node.Transform
.
Более подробную информацию о матрице преобразования можно найти в Википедии Матрица трансформации и Аффинная трансформация