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

При использовании перспективной проекции изменение 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
);
0
TomShar 26 Ноя 2016 в 01:46

3 ответа

Лучший ответ

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

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

enter image description here

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

enter image description here

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

enter image description here

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

1
Nico Schertler 25 Ноя 2016 в 22:59

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

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

2
Dietrich Epp 25 Ноя 2016 в 22:53

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

perspective camera

Здесь: (xe, ye, ze) - точка в системе координат глаза. (xp, yp, zp) - проекция этой точки n - расстояние до ближней плоскости t - расстояние до верхней плоскости усеченного конуса

Вы можете видеть, что когда вы приближаетесь к камере, xp и yp будут расти.

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

orthogonal camera

1
Podgorskiy 25 Ноя 2016 в 23:22