как вычислить орто-параметры для сохранения исходного размера вида объекта / положения камеры?
При ортографической проекции 3-мерная сцена является параллельной проекцией в 2-мерное окно просмотра.
Это означает, что объекты, которые проецируются в окне просмотра, всегда имеют одинаковый размер, независимо от их глубины (расстояния до камеры).
Перспективная проекция описывает отображение из трехмерных точек в мире, так как онивидны из камеры-обскуры в двухмерные точки видового экрана.
Это означает, что объект, проецируемый на видовой экран, уменьшается по глубине.
Если вы переключаете перспективу формы только на ортогональную проекциюобъекты в 1 плоскости, которая является плоской (параллельной) с viepwort, kkp его глубина.Обратите внимание, что плоскость является двухмерной и не имеет «глубины».Это приводит к тому, что двухмерный объект никогда не может «выглядеть» одинаково при переключении проекции.Но двумерный рекламный щит может сохранять размер.
Соотношение глубины и размера при проекции в перспективе является линейным и может быть рассчитано.Это зависит только от угла обзора поля:
float ratio_size_per_depth = atan(glm::radians(fov / 2.0f) * 2.0f;
Если вы хотите настроить ортографическую проекцию, которая сохраняет размер для определенного расстояния (глубины), то сначала вам нужно определить глубину:
например, расстояние до целевой точки:
auto distance = glm::length(mTarget - mEye);
проекция может быть настроена следующим образом:
float aspect = width / height
float size_y = ratio_size_per_depth * Z;
float size_x = ratio_size_per_depth * Z * aspect;
glm::mat4 orthProject = glm::ortho( -size_x, size_x, -size_y, size_y, 0.0f, 2.0f*distance );
как реализовать увеличениеслучай орто-проекции?
Масштабирование XY компонентов ортографической проекции:
glm::mat4 orthProject = glm::ortho( -size_x, size_x, -size_y, size_y, 0.0f, 2.0f*distance );
float orthScale = 2.0f;
orthProject = glm::scale(orthProject, glm::vec3(orthScale, orthScale, 1.0f));
Установить значение для orthScale
, которое составляет > 1,0 дляувеличение и значение <1,0 </em> для уменьшения.