Преобразовать координату вершины в «тот же» координата экрана

Я использую Direct3D для рисования вершин из буфера вершин в формате вершин FVF_XYZ,

Я хочу реализовать функциональность рисования линий сейчас. При рисовании линии в трехмерном пространстве я проецирую конечные точки в двухмерное пространство экрана и использую свою функцию для рисования линии из двухмерного пространства. Моя проблема с этой функцией.

Мой буфер вершин содержит две вершины с координатами (0,0,0) а также (1,0,0), Я планирую преобразовать эту основную линию в мою последнюю строку с базовой математикой и преобразованиями.

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

Из моего понимания я должен в конечном итоге и экран координат (0,0) при настройке мира, вид и матрица проекции идентичности, но (0,0,0) затем заканчивается в центре экрана.

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

1

Решение

Во-первых, стоит отметить, что в проекционном пространстве (-1, 1, z, w) преобразуется в (0,0) и (1, -1, z, w) в (1, 1).

Итак, работая на основе того, что вы хотите преобразовать данную вершину в ее проекционное пространство, это просто вопрос следующего:

T' = W * V * P

(Где W — мировая матрица, V — матрица вида, а P — матрица проекции).

Теперь вы можете умножить любую однородную координату (то есть x, y, z, 1) на пространство проекции.

Теперь, если вы хотите выполнить деление перспективы, это просто вопрос деления на w. т.е.

x' = x / w;
y' = y / w;
z' = z / w;
w' = w / w; // or 1

Теперь у вас есть набор координат, где координаты x, y находятся в диапазоне от -1, -1 до (1, 1). Таким образом, если вы хотите преобразовать их в пространство 0 -> 1, вы предлагаете сделать следующее:

x'' = (x'  + 1) / 2;
y'' = (-y' + 1) / 2;

Теперь у вас есть ваши координаты в пространстве, где 0, 0 вверху слева и 0, 1 внизу справа. Все, что находится за пределами этого диапазона, находится за пределами экрана.

Также стоит отметить, что значение z ‘, которое вы имеете после деления перспективы, может быть помещено в Z-буфер. Если значение Z меньше 0 (или оно больше, чем я не могу вспомнить на макушке моей головы), то оно обрезается лицевой плоскостью и больше / меньше +/- 1 выходит за дальнюю плоскость отсечения.

Надеюсь, это поможет.

1

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

Других решений пока нет …

По вопросам рекламы [email protected]