Поделиться через


Преобразование мира (Direct3D 9)

В обсуждении трансформации мира представлены основные понятия и приводятся подробные сведения о том, как создать преобразование мира.

Что такое преобразование мира?

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

схема взаимосвязи между мировыми координатами и локальными координатами

Мировое преобразование может включать любое сочетание параллельных переносов, поворотов и масштабирований.

Установка мировой матрицы

Как и в случае с любыми другими преобразованиями, мировое преобразование создается путем с конкатенации ряда матриц в единую матрицу, которая содержит всю сумму их эффектов. В самом простом случае, когда модель находится в мировом начале координат и ее локальные координатные оси ориентированы так же, как мировое пространство, мировая матрица представляет собой единичную матрицу. Чаще, однако, мировая матрица представляет собой сочетание параллельного переноса в мировое пространство и, возможно, одного или нескольких поворотов для придания модели необходимой ориентации.

В следующем примере из вымышленного класса трехмерной модели, написанного на языке C++, используются вспомогательные функции, включенные в служебную библиотеку D3DX, для создания матрицы мира, которая включает три поворота для ориентации модели и перевод для перемещения ее относительно ее положения в мировом пространстве.

/*
 * For the purposes of this example, the following variables
 * are assumed to be valid and initialized.
 *
 * The m_xPos, m_yPos, m_zPos variables contain the model's
 * location in world coordinates.
 *
 * The m_fPitch, m_fYaw, and m_fRoll variables are floats that 
 * contain the model's orientation in terms of pitch, yaw, and roll
 * angles, in radians.
 */
 
void C3DModel::MakeWorldMatrix( D3DXMATRIX* pMatWorld )
{
    D3DXMATRIX MatTemp;  // Temp matrix for rotations.
    D3DXMATRIX MatRot;   // Final rotation matrix, applied to 
                         // pMatWorld.
 
    // Using the left-to-right order of matrix concatenation,
    // apply the translation to the object's world position
    // before applying the rotations.
    D3DXMatrixTranslation(pMatWorld, m_xPos, m_yPos, m_zPos);
    D3DXMatrixIdentity(&MatRot);

    // Now, apply the orientation variables to the world matrix
    if(m_fPitch || m_fYaw || m_fRoll) {
        // Produce and combine the rotation matrices.
        D3DXMatrixRotationX(&MatTemp, m_fPitch);         // Pitch
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationY(&MatTemp, m_fYaw);           // Yaw
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationZ(&MatTemp, m_fRoll);          // Roll
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
 
        // Apply the rotation matrices to complete the world matrix.
        D3DXMatrixMultiply(pMatWorld, &MatRot, pMatWorld);
    }
}

После подготовки матрицы мира вызовите метод IDirect3Device9::SetTransform , чтобы задать ее, указав макрос D3DTS_WORLD для первого параметра.

Примечание

Direct3D использует установленные вами мировую матрицу и видовую матрицу для конфигурирования нескольких внутренних структур данных. Каждый раз, когда вы устанавливаете новую мировую или видовую матрицу, система пересчитывает соответствующие внутренние структуры. Частая установка этих матриц — например, несколько тысяч раз на кадр — занимает много вычислительного времени. Свести к минимуму количество необходимых вычислений можно путем конкатенации мировой и видовой матриц в мировую-видовую матрицу, задать ее в качестве мировой матрицы, а затем установить видовую матрицу в единичную. Сохраняйте кэшированные копии отдельных мировых и видовых матриц, чтобы вы могли изменять, объединять и сбрасывать мировую матрицу по необходимости. Для ясности в этой документации примеры Direct3D редко используют эту оптимизацию.

 

Преобразования