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 IMG

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, похоже, не работает по математике вообще.

Другие вопросы по тегам