2016-11-25 2 views
0

Я играл с OpenGL и матричными операциями, и я понимаю концепцию P * V * M, но я не могу понять, почему изменение положения Z камеры не влияет на масштабирование.OpenGL Orthographic Projection

При использовании проекции перспективы, изменение Z камеры оказывает эффект увеличения (как я ожидал).

glm::mat4 Projection = glm::perspective(45.0f, 4.0f/3.0f, 0.1f, 100.0f); 
glm::mat4 View  = glm::lookAt(
          glm::vec3(0,0,3), // changing 3 to 8 will zoom out 
          glm::vec3(0,0,0), 
          glm::vec3(0,1,0) 
         ); 
glm::mat4 Model  = glm::mat4(1.0f); 
gml::mat4 MVP  = Projection * View * Model; 

Однако, когда я использую орто проекцию, изменение 3 до 8 или что-либо он не имеет эффекта уменьшения масштаба. Я знаю, что они очень разные прогнозы, но я ищу объяснения (математика, почему она не работает, будет особенно полезна).

glm::mat4 Projection = glm::ortho(
    0.0f, 
    128.0f, 
    0.0f, 
    72.0f, 
    0.0f, 
    100.0f 
); 

ответ

1

Так работают орфографические проекции. Давайте начнем с точки зрения преобразования:

Вы получаете проекцию объекта, следуя по прямой линии к камере:

enter image description here

Если переместить камеру ближе, то вы увидите, что проектируемая увеличивается площадь:

enter image description here

Ортогональные проекции работают по-разному. Вы получаете проекцию, следуя по прямой линии, которая перпендикулярна плоскости изображения:

enter image description here

И очевидно, что размер расчетной области не зависит от того, насколько далеко камера находится далеко от объекта. Это потому, что проекционные линии всегда будут параллельными и сохраняют размер объекта в двух направлениях плоскости изображения.

+0

Таким образом, способ увеличения ортогональной проекции только путем изменения числа передаваемых в 'GLM :: ortho'? – TomShar

2

Когда вы меняете координату Z от 3 до 8, вы фактически не уменьшаете масштаб, вы просто перемещаете камеру дальше. Вы можете уменьшить масштаб, не перемещая камеру, изменив первый параметр на glm::perspective.

У орфографической камеры нет места (вы можете думать об этом как бесконечно далеко), поэтому невозможно «переместить» орфографическую камеру таким же образом. Вы можете уменьшить масштаб, изменив границы, прошедшие до glm::ortho. Просто передайте большие номера glm::ortho.

1

Посмотрите на то, что происходит, когда вы перемещаете камеру в перспективе:

perspective camera

здесь: (х, вы, г) - точка в глаза системе координат. (Xp, Yp, Zp) - проекция этой точки п - расстояние до плоскости вблизи т - расстояние до верхней плоскости усеченного

Вы можете видеть, что при приближении камеры, хр и YP будет расти.

Наоборот, изменение z положения ортогональной камеры не будет влиять на xp и yp, но все равно будет влиять на zp, таким образом изменит значение в буфере глубины.

orthogonal camera

+0

Итак, способ масштабирования орфографической проекции - это просто изменить числа, переданные в glm :: ortho? – TomShar