netlib.narod.ru< Назад | Оглавление | Далее >

Преобразования объектов

Преобразования — это важный инструмент для манипуляций с объектами. Они позволяют вам позиционировать, ориентировать, деформировать и применять другие типы преобразований к объектам. Из всех различных типов преобразований наиболее часто используются перемещение, вращение и масштабирование.

Для помощи в обработке преобразований объектов вы создадите класс с именем Transformation. Этот класс хранит перемещение, вращение и масштабирование объекта и создает матрицу, содержащую комбинацию всех этих преобразований, как показано в приведенном ниже коде:

// Перемещение
Vector3 translate;

// Вращение вокруг мировых осей (X, Y, Z)
Vector3 rotate;

// Масштаб по осям X, Y, Z
Vector3 scale;

bool needUpdate;

// Хранит комбинацию преобразований
Matrix matrix;

public Vector3 Translate
{
    get { return translate; }
    set { translate = value; needUpdate = true; }
}

public Vector3 Rotate
{
    get { return rotate; }
    set { rotate = value; needUpdate = true; }
}

public Vector3 Scale
{
    get { return scale; }
    set { scale = value; needUpdate = true; }
}

public Matrix Matrix
{
    get
    {
        if (needUpdate)
        {
            // Вычисляем итоговую матрицу
            // (Масштаб * Вращение * Перемещение)
            matrix = Matrix.CreateScale(scale) *
                   Matrix.CreateRotationY(MathHelper.ToRadians(rotate.Y)) *
                   Matrix.CreateRotationX(MathHelper.ToRadians(rotate.X)) *
                   Matrix.CreateRotationZ(MathHelper.ToRadians(rotate.Z)) *
                   Matrix.CreateTranslation(translate);
            needUpdate = false;
        }
        return matrix;
    }
}

В классе Transformation преобразования перемещения, вращения и масштабирования хранятся в объектах XNA Vector3 с именами translate, rotate и scale соответственно, и вы можете устанавливать и получать их через свойства. Атрибут matrix хранит комбинацию преобразований перемещения, вращения и масштабирования в объекте XNA Matrix, и вы можете использовать его для применения этих преобразований к объекту. Вы можете устанавливать и получать атрибут matrix через свойство Matrix, и он будет заново вычисляться всякий раз, когда обновлены преобразования перемещения, вращения или масштабирования.

Вы используете методы CreateTranslate, CreateRotation и CreateScale класса Matrix XNA, чтобы сгенерировать матрицы, используемые для перемещения, вращения и масштабирования объекта. Обратите внимание, что матрица преобразования объекта вычисляется путем комбинирования матриц масштабирования, вращения и перемещения в указанном порядке. Поскольку произведение матриц некоммутативно, порядок, в котором вы комбинируете преобразования, очень важен. Правильный порядок преобразования объекта таков: сперва масштабирование, затем вращение, и в конце перемещение.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz