Проецирование 3D-точки на 2D-пространство экрана с использованием матрицы перспективной камеры - PullRequest
7 голосов
/ 08 сентября 2010

Я пытаюсь спроецировать серию трехмерных точек на экран, используя матрицу перспективной камеры.У меня нет мирового пространства (или я считаю, что это единичная матрица), и в моей камере нет места для камеры (или я считаю, что это единичная матрица), у меня есть матрица 4x4 для моего пространства объектов.

IЯ беру матрицу объектов и умножаю ее на матрицу перспективы камеры, сгенерированную следующим методом:

Matrix4 createPerspectiveMatrix( Float fov, Float aspect, Float near, Float far )
{
    Float fov2 = (fov/2) * (Math.PI/180);
    Float tan = Math.tan(fov2);
    Float f = 1 / tan;

    return new Matrix4 ( 
        f/aspect, 0, 0, 0,
        0, f, 0, 0,
        0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far),
        0, 0, 1, 0 
    );
}

Затем я беру свою точку [x, y, z, 1] и умножаю ее на полученнуюумножение матрицы перспективы и матрицы объектов.

Следующая часть, где я запутался, я почти уверен, что мне нужно получить эти точки в пределах либо -1 и 1, либо 0и 1, и, в случае наличия первого набора значений, я бы умножил точки на ширину и высоту экрана для значений координат x и y экрана соответственно или умножил бы значения на высоту экрана / 2 и ширину /2 и добавьте те же значения к соответствующим точкам.

Любой шаг за шагом рассказывает мне, как этого можно достичь или где я могу бытьчто-то не так с этим было бы очень полезно !!: D

С наилучшими пожеланиями!

PS В примере матрицы идентичности / перевода мой матричный формат в моей модели:

[1, 0, 0, tx,
 0, 1, 0, ty,
 0, 0, 1, tz,
 0, 0, 0, 1 ]

Ответы [ 2 ]

6 голосов
/ 10 сентября 2010

Ваша проблема в том, что вы забыли выполнить перспективное деление.

Перспективное деление означает, что вы делите компонент x, y и z своей точки на его компонент w.Это необходимо для преобразования вашей точки из Однородного 4D пространства в Нормализованная система координат устройства (NDCS), в которой каждый компонент x, y или z находится в диапазоне от -1 до 1, или 0 и1.

После этого преобразования вы можете выполнить преобразование области просмотра (умножить точки на ширину экрана, высоту и т. Д.).

В книге Фоли (Компьютерная графика: хорошее представление об этом конвейере преобразования):Принципы и практика в C), вы можете увидеть это здесь:

http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html

4 голосов
/ 23 сентября 2013

Для таких вопросов, как этот, я бы предложил отличные ресурсы: http://scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/ Это действительно идет в деталях матрицы проекции. Это больше уроков по теме камеры, конструированию лучей камеры и т. Д. Вам нужно будет немного покопаться.

...