2017-02-21 28 views
2

После поиска многих страниц, документации glm, учебников ... и т. Д., Я все еще запутался в некоторых вещах.Понимание того, как аргументы glm :: ortho() влияют на местоположение вершины после проецирования

Я пытаюсь понять, почему мне нужно применить следующие преобразования, чтобы получить мой 800x600 (полноэкранный квадрат, предположим, что экран пользователя составляет 800x600 для этого минимального примера), чтобы обойти все. Предположим, я рисую только треугольники CCW. Все делает хорошо в моем коде, но я должен сделать следующее:

// Vertex data (x/y/z), using EBOs 
    0.0f, 600.0f, 1.0f, 
800.0f, 0.0f, 1.0f, 
    0.0f, 0.0f, 1.0f, 
800.0f, 600.0f, 1.0f 

// Later on... 
glm::mat4 m, v, p; 
m = scale(m, glm::vec3(-1.0, 1.0, 1.0)); 
v = rotate(v, glm::radians(180.0f), glm::vec3(0.0f, 1.0f, 0.0f)); 
p = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, 0.5f, 1.5f); 

(Обратите внимание, что только так как я использовал имена переменных m, v и p не означает, что они на самом деле правильное преобразование для что имя, указанное просто делает то, что я хочу, чтобы это)

Я запутался на следующее:

  • Где орфографической границы? Я предполагаю, что он указывает вниз на отрицательную ось z, но где же находятся границы слева/справа? Означает ли это [-400, 400] на картах по оси х [-1.0, 1.0] NDC или что [0, 800] сопоставляется с ним? (Я предполагаю, что любой ответ здесь относится к оси y). Тогда документация просто говорит Creates a matrix for an orthographic parallel viewing volume.

  • Что произойдет, если вы перевернете следующие третий и четвертый аргументы (я прошу, потому что я вижу, что люди делают это, и я не знаю, является ли это ошибкой/опечаткой или это работает случайно. ., или если он правильно работает независимо):

Args три и четыре здесь:

       _____________ 
          | These two | 
p1 = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, 0.5f, 1.5f); 
p2 = glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.5f, 1.5f); 
  • Теперь я предполагаю, что это третий вопрос будет дан ответ с выше двух, но я tryi ng, чтобы понять, если именно поэтому моя первая часть кода требует от меня перевернуть все по оси x, чтобы работать ..., что я признаю, что я просто возился с ней, и это случилось с работой. Я полагаю, что мне нужно поворот на 180 градусов, чтобы превратить мой самолет, так что он находится на стороне -z, но ... так что мне просто приходится вычислять масштабирование -1.0, 1.0, 1.0.

Код, представленный в этом примере (за вычетом имен переменных), является единственным материалом, который я использую, и рендеринг работает отлично ... это просто моя нехватка знаний о том, почему это работает, что я недоволен.

РЕДАКТИРОВАТЬ: пытался понять это с here, используя изображения и описания на сайте в качестве единственного примера ссылки. Возможно, я пропустил это.

EDIT2: Как случайный вопрос, так как я всегда рисую свою плоскость при z = 1.0, должен ли я ограничить, чтобы моя орфографическая проекция вблизи/дальности была как можно ближе к 1.0 (например: 0,99, 1,01) по любой причине ? Предположите, что больше ничего не будет нарисовано или будет нарисовано.

ответ

2

Вы можете предположить, что видимая область в орфографической проекции является кубом, заданным в пространстве взгляда. Этот куб затем отображается на кубик [-1,1] в координатах NDC, так что все внутри куба видимо, и все снаружи будет отсечено. Как правило, зритель смотрит вдоль отрицательной оси z, а + x - справа, а y - вверх.

Каким образом орфографические границы отображаются в пространстве НДЦ?

Длина стороны куба задается параметрами, переданными в glOrtho. В первом примере параметры для левого и правого являются [0, 800], поэтому пространство от 0 до 800 по оси x отображается на [-1, 1] вдоль оси X NDC. Аналогичная логика происходит вдоль двух других осей (сверху/снизу вдоль y, вблизи/далеко вдоль -z).

Что происходит, когда верхний и нижний параметры меняются?

Перемещение, например, сверху и снизу, эквивалентно отражению сцены вдоль этой оси. Если вы посмотрите на второй диагональный элемент orthographic matrix, это определяется как 2/(top - bottom). При обмене сверху и снизу меняется только знак этого элемента. То же самое также работает для обмена слева с правом или рядом с далеко. Иногда это используется, когда исходным пространством экрана должен быть нижний левый угол вместо верхнего левого.

Зачем вам поворачивать квадроцикл на 180 ° и отражать его?

Как описано выше, значения ближнего и дальнего значения расположены вдоль оси negativ. Значения [0,5, 1,5] вдоль -z означают [-0,5, -1,5] в мировых космических координатах. Так как плоскость определена z = 1.0, она находится за пределами видимой области. Вращая его вокруг начала на 180 градусов, он перемещается на z = -1.0, но теперь вы смотрите на него со спины, а это означает, что удары по задним лицам отбрасываются. Зеркалируя его вдоль x, порядок намотки изменяется, и поэтому задняя и передняя стороны изменены.

Поскольку я всегда рисую свою плоскость при z = 1.0, должен ли я ограничивать, чтобы моя орфографическая проекция вблизи/дальности была как можно ближе к 1.0?

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