Проблема 3D-проекции: значение Z не лежит в [1, -1] после деления перспективы - PullRequest
5 голосов
/ 04 мая 2011

Я пытаюсь сделать простую перспективную проекцию в процессе растеризации 3D-точки. Здесь представлены все матрицы и другая информация. Все матрицы являются основными рядами. Система координат - правша.

Камера находится в [0,0, -1], а точка в [0,0,0] (w = 1 для матричных операций)

Матрица просмотра модели (обратная матрица кулачка, т.е. tx = 0; ty = 0; tz = 1):

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

Матрица перспективы:

[f/aspect,0,0,0]
0,f,0,0
0,0,-(near+far)/(near-far),2*far*near/(near-far)
0,0,1,0]

аспект равен 1, так как область просмотра является квадратной. Дальний = 100 и Ближний = 0,1 f = 1 / tan (fovDegress * M_PI / 360);

Результирующая матрица:

1.94445, 0,        0,        0
0,       1.944445, 0,        0
0,       0,        1.020202, -2.020202
0,       0,        1,        0

Теперь я применяю матрицу представления модели, а затем матрицу проекции к вектору точек, а затем получаю новую точку Pv = {x, y, z, w} Тогда я получаю нормализованные координаты x '= x / w; у '= у / ш; и z '= z / w; x 'и y' всегда лежат между [-1,1], пока точка находится в усечённой области. Но то же самое не относится к z '. Когда точка приближается к камере, значения z 'увеличиваются экспоненциально. Когда точка находится на [0,0,0] z ', значение равно -1.

Теперь мне нужно обрезать несколько строк, поэтому мне нужно, чтобы значение z 'находилось между [1, -1]. Мне интересно, что не так с моей процедурой. Спасибо.

1 Ответ

3 голосов
/ 04 мая 2011

Что вы испытываете, так это нелинейность перспективного картирования глубины.С матрицей проекции усеченного конуса она следует закону 1 / x с расстоянием от точки обзора.

РЕДАКТИРОВАТЬ:

Просто дважды проверь свои матрицы: Вы неправильно поняли матрицу усеченного конуса.Правильная матрица усечений

f/aspect, 0,                      0,                     0
0,        f,                      0,                     0
0,        0, -(far+near)/(far-near), 2*far*near/(far-near)
0,        0,                      1,                     0

Тем не менее, если вы приблизитесь к началу координат, вы все равно столкнетесь с делением на ноль.Просто поместите вектор (0,0,0,1) через эту вещь, что приводит к (x = 0, y = 0, z = 2 * far * near / (far-near), w = 0) в пространстве клипа,И тогда однородное деление {x, y, z} / (w = 0) ← взрывается.

...