OpenGL 3D-трансформация: соотношение z-аспект
Я делаю трехмерную перспективную проекцию в OpenGL (webgl), делаю это сам с униформ-матрицами. Все работает нормально, но у меня соотношение сторон 3:2 (600px x 400px), и это искажает всю визуализацию геометрии.
В 2D я исправлял это в матрице модели, деля x и y на 1 / width и 1 / height соответственно.
Теперь у меня также есть z, о котором нужно беспокоиться, и я совершенно не понимаю, как / где преобразовать z, чтобы не искажать соотношение сторон 3: 2.
Матрица моделей, похоже, не дает никакой возможности сделать это, и я не знаю, где и что делать в матрице проекций.
Изменить: матрица проекции:
@_pMatrix = [
1, 0.0, 0.0, 0.0,
0.0, 1, 0.0, 0.0,
0.0, 0.0, -(f + n) / (f - n), -1,
0.0, 0.0, -2.0 * n * f / (f - n), 0.0
]
Основной порядок колонн
Изменить 2: странные искажения на n < 1
1 ответ
Вы скучаете по *left*, *right*, *top*, *bottom*
в вашей матрице проекции.
2*n
----- 0 0 0
r-l
2*n
0 ----- 0 0
t-b
r+l t+b -(f+n)
----- ----- ------ -1
r-l t-b f-n
-2*f*n 0
0 0 ------
f-n
Если вы определите (r-l)/(t-b) = 3/2
таким образом, чтобы объем просмотра соответствовал размеру вашей модели, тогда вы должны быть установлены.
Вот несколько слайдов, описывающих различные матрицы проекций и как они получены: http://www.cs.unm.edu/~angel/CS433/LECTURES/CS433_17.pdf
Они принадлежат Эдварду Энджелу, автору интерактивной компьютерной графики, где я получил эту матрицу. К сожалению, Красная книга OpenGL, похоже, не работает по математике вообще.