Я пытаюсь сделать простую перспективную проекцию в процессе растеризации 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]. Мне интересно, что не так с моей процедурой. Спасибо.