После поиска многих страниц, документации 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) по любой причине ? Предположите, что больше ничего не будет нарисовано или будет нарисовано.