Понимание того, как аргументы glm :: ortho () влияют на местоположение вершины после проекции

После поиска по многим страницам, документации по GLM, учебным пособиям и т. Д., Я все еще смущен некоторыми вещами.

Я пытаюсь понять, почему мне нужно применить следующие преобразования, чтобы получить изображение размером 800×600 (в полноэкранном квадрате, предположим, что для этого минимального примера экран пользователя имеет размер 800×600), чтобы рисовать поверх всего. Предположим, я рисую только треугольники 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] на оси x отображается на [-1.0, 1.0] NDC, или что [0, 800] отображается на него? (Я предполагаю, что любой ответ здесь применим к оси Y). Тогда документация просто говорит Creates a matrix for an orthographic parallel viewing volume.

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

Аргументы три и четыре здесь:

                              _____________
|  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);
  • Теперь я предполагаю, что на этот третий вопрос ответят два вышеупомянутых вопроса, но я пытаюсь выяснить, почему из-за этого мой первый фрагмент кода требует, чтобы я перевернул все на оси х, чтобы работать … что я признаю, что я просто возился с этим, и это сработало. Я полагаю, что мне нужно вращение на 180 градусов, чтобы развернуть плоскость, так что она находится на стороне -z … так что мне остается только вычислить масштаб 1,0 — 1,0, 1,0.

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

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

РЕДАКТИРОВАТЬ 2: Как случайный вопрос, так как я всегда рисую свою плоскость в z = 1.0, я должен ограничить мою ортогональную проекцию около / далеко плоскости, чтобы быть настолько близким к 1.0 насколько возможно (например: 0.99, 1.01) по любой причине? Предположим, что больше ничего не нарисовано или будет нарисовано.

3

Решение

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

Как ортогональные границы отображаются в пространстве НДЦ?

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

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

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

Почему вы должны повернуть квад на 180 ° и отразить его?

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]