Система координат D3D11

Некоторые из моего старого кода закончились кучей неприятных хаков, чтобы заставить вещи работать «правильно», с точки зрения перемещения объектов вокруг и камеры, таких как необходимость взять «std :: sin (-yaw)» вместо «std :: sin (yaw)» при реализации уравнений, найденных где-то в Интернете, и тому подобное, и во многих случаях это просто приводит к путанице и ошибкам.

  1. Работая с D3D11 и DirectXMath (например, левые координаты и мажор строки?), Какова именно предполагаемая система координат, например, при условии, что камера находится в исходном положении и смотрит вдоль желтого вектора на изображении без поворота, правильны ли метки ?.

    введите описание изображения здесь

    И затем, учитывая это, и камеру, описанную (x, y, z) и pitch (мышь / элемент управления по оси y), yaw (мышь / элемент управления по оси x), и предполагая, что нет другого способа, которым я должен был бы заниматься даже то, что…

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

  3. Какое уравнение для получения вектора, на который смотрит камера (ток умножает вектор (0,0,1) на матрицу из 2).

  4. … и «верхний» и «правый» векторы (поскольку, даже если не использовать функцию матричного представления lookat, выборка усеченного конуса должна знать их). Снова в настоящее время умножаем на матрицу из 2.
  5. Вычислите правильные скаляры и компоненты шага и рыскания от вектора направления (например, для револьверной головки с отдельными соединениями тангажа / рыскания).

РЕДАКТИРОВАТЬ: Образцы кода:

//Moving a floating object with only yaw forwards (moveX,moveY,moveZ).
//Negative yaw seems wrong?
auto c = std::cosf(-yaw);
auto s = std::sinf(-yaw);
pos.x += moveX * c - moveZ * s;
pos.y += moveY;
pos.z += moveX * s + moveZ * c;

//Gets the vector the camera is looking along
//This time yaw is positive, but pitch is negative?
float c = std::cos(-pitch);
Vector3F facing(
c * std::sinf(yaw),
std::sinf(-pitch),
c * std::cosf(yaw));

//Creating the view transform matrix, everything is negative
XMMATRIX xmviewrot;
xmviewrot = XMMatrixRotationY(-yaw);
xmviewrot*= XMMatrixRotationX(-pitch);
XMMATRIX xmview;
xmview = XMMatrixTranslation(-x, -y, -z);
xmview *= xmviewrot;
XMStoreFloat4x4A(&view, xmview);

//Other vectors needed for frustum culling
XMVECTOR xmup = XMVector3Transform(XMLoadFloat4A(&UP), xmview);
XMVECTOR xmright = XMVector3Transform(XMLoadFloat4A(&RIGHT), xmview);

//Matrix for stuff that is already in world space (e.g. terrain)
XMMATRIX xmviewProj = xmview * xmproj;
//Apparently needs transposing before use on the GPU...
XMStoreFloat4x4A(&constants.transform, XMMatrixTranspose(xmviewProj));

//In the shaders
output.pos = mul(input.pos, transform);

//vertex positions for an upwards facing square with triangle strip
v0 = (x1, y, z1);
v1 = (x1, y, z2);
v2 = (x2, y, z2);
v3 = (x2, y, z1);

Так что, мне кажется, я сделал что-то в корне неправильно, чтобы нуждаться в -yaw и + yaw, -pitch и + pitch в разных местах? И некоторые из тех функций, которые я в конечном итоге выполнял с помощью метода следов и ошибок, чтобы получить правильное значение, в онлайн-примерах не использовались отрицательные значения.

2

Решение

В Direct3D 11 нет системы координат, вы можете использовать все, что захотите. Из записи блога Чака Уолборна на Начало работы с Direct3D 11:

Математика: Поскольку Direct3D 11 не имеет графику с «фиксированной функцией»
конвейер Direct3D 9, выбор графических математических соглашений
(левша против правши, матрица мажора строки и мажора столбца,
и т.д.) полностью зависит от разработчика. DirectXMath может быть использован для
создать оба преобразования «Левосторонняя координата» в стиле Direct3D как
а также преобразования «Правосторонняя координата» в стиле OpenGL с использованием
Соглашение о матрице строк-мажоров, которое может использоваться непосредственно с мажорами строк
шейдеры или транспонированные для использования шейдеров основных столбцов.

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

Вершины (x, y, z, w), входящие в стадию растеризации, предполагаются
в однородном клип-пространстве. В этом координатном пространстве ось X указывает
правильно, Y указывает вверх, а Z указывает от камеры.

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

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

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector