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


Преобразование проекции (Direct3D 9)

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

Матрица проекции обычно является проекцией масштаба и перспективы. Преобразование проекции преобразует вид frustum в фигуру кубоида. Поскольку в ближайшем конце просмотра frustum меньше, чем дальнее конца, это имеет эффект расширения объектов, которые находятся рядом с камерой; Это то, как перспектива применяется к сцене.

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

иллюстрация матрицы проекции

Матрица просмотра преобразует камеру в источник путем перевода в направлении z по - D. Матрица перевода похожа на следующую иллюстрацию.

иллюстрация матрицы перевода

Умножение матрицы перевода на матрицу проекции (T*P) дает составную матрицу проекции, как показано на следующем рисунке.

иллюстрация составной матрицы проекции

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

схема преобразования перспективы изменяет представление frustum в новое пространство координат

В преобразовании перспективы ограничения x-и y-направлений -1 и 1. Ограничения z-направления — 0 для передней плоскости и 1 для задней плоскости.

Эта матрица преобразует и масштабирует объекты на основе указанного расстояния от камеры до близкого отрезка плоскости, но не учитывает поле зрения (fov), а значения z,которые он создает для объектов в расстоянии, могут быть почти идентичными, что затрудняет сравнение глубины. В следующей матрице рассматриваются эти проблемы, и она корректирует вершины для учета пропорций окна просмотра, что делает его хорошим выбором для проекции перспективы.

иллюстрация матрицы для проекции перспективы

В этой матрице Zn — это z-значение близкого отрезка плоскости. Переменные w, h и Q имеют следующие значения. Обратите внимание, что fovw и fovk представляют горизонтальные и вертикальные поля представления в радианах.

уравнения переменной означает

Для приложения для определения коэффициентов масштабирования x и y можно использовать горизонтальные и вертикальные измерения окна просмотра (в пространстве камеры). По мере того как математика работает, следующие два уравнения для w и h используют измерения окна просмотра и эквивалентны предыдущим уравнениям.

уравнения переменных w и h означает

В этих формулах Zn представляет позицию почти обрезки плоскости, а переменные Vw и Vh представляют ширину и высоту окна просмотра в пространстве камеры.

Для приложения C++ эти два измерения соответствуют непосредственно элементам ширины и высоты структуры D3DVIEWPORT9.

Независимо от формулы, которую вы решили использовать, обязательно установите Zn на максимально большое значение, так как z-значения очень близко к камере не сильно различаются. Это делает сравнение глубины с помощью 16-разрядных z-буферов несколько сложно.

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

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

Следующая функция ПроекцииMatrix задает плоскости отсечения переднего и заднего, а также горизонтальное и вертикальное поле угла зрения. Поля представления должны быть меньше, чем радианы pi.

D3DXMATRIX 
ProjectionMatrix(const float near_plane, // Distance to near clipping 
                                         // plane
                 const float far_plane,  // Distance to far clipping 
                                         // plane
                 const float fov_horiz,  // Horizontal field of view 
                                         // angle, in radians
                 const float fov_vert)   // Vertical field of view 
                                         // angle, in radians
{
    float    h, w, Q;

    w = (float)1/tan(fov_horiz*0.5);  // 1/tan(x) == cot(x)
    h = (float)1/tan(fov_vert*0.5);   // 1/tan(x) == cot(x)
    Q = far_plane/(far_plane - near_plane);

    D3DXMATRIX ret;
    ZeroMemory(&ret, sizeof(ret));

    ret(0, 0) = w;
    ret(1, 1) = h;
    ret(2, 2) = Q;
    ret(3, 2) = -Q*near_plane;
    ret(2, 3) = 1;
    return ret;
}   // End of ProjectionMatrix

После создания матрицы задайте его IDirect3DDevice9::SetTransform указание D3DTS_PROJECTION.

Библиотека служебной программы D3DX предоставляет следующие функции, которые помогут вам настроить матрицу проекции.

Матрица проекции с поддержкой W

Direct3D может использовать w-компонент вершины, который был преобразован миром, представлением и матрицами проекции для выполнения вычислений на основе глубины в буфере глубины или эффекты тумана. Вычисления, такие как эти, требуют, чтобы матрица проекции нормализована w была эквивалентна мировому пространству z. Короче говоря, если матрица проекции включает коэффициент (3,4), который не равен 1, необходимо масштабировать все коэффициенты по обратному коэффициенту (3,4), чтобы сделать правильную матрицу. Если вы не предоставляете соответствующую матрицу, эффекты тумана и буферизация глубины не применяются правильно.

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

иллюстрации несоответствующей матрицы проекции и матрицы с туманом относительно глаз

В предыдущих матрицах предполагается, что все переменные являются ненулевой. Дополнительные сведения о тумане относительно глаз см. в Eye-Relative ина основе Z. Сведения о буферизации глубины на основе w см. в буферов глубины (Direct3D 9).

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

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