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


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

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

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

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

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

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

Настройка матрицы мира

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

В следующем примере из вымышленного класса трехмерной модели, написанного на языке 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);
    }
}

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

Заметка

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

 

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