Итак, я пытаюсь понять основы перспективного проектирования для трехмерной графики, и я застреваю. Сейчас я стараюсь избегать матриц, чтобы облегчить понимание. Это то, что я придумал до сих пор:
Сначала я представляю, что у меня есть точка с экранными (пиксельными) координатами x: 200, y: 600, z: 400
. Величина z в этом контексте представляет расстояние в пикселях от плоскости проекции или монитора (именно так я думаю об этом). У меня также есть камера, которая, как я говорю, находится в 800 пикселях от плоскости проекции / монитора (на задней стороне плоскости проекции / монитора), так что она действует как фокусное расстояние камеры.
Исходя из моего понимания, сначала я нахожу общее расстояние z точки 200, 600, добавляя ее z к фокусному расстоянию камеры (400 + 800), что дает мне общее расстояние z 1200. Затем если я хочу найти спроецированную точку этих координат, мне просто нужно умножить каждую координату (x & y) на (focal_length / z_distance) или 800/1200, что дает мне спроецированные координаты x: 133, y: 400
.
Теперь Исходя из того, что я понимаю, openGL ожидает, что я отправлю свою точку вниз в пространстве клипов (от -1 до 1), поэтому я не должен отправлять свои значения пикселей как 200, 600. Мне нужно было бы нормализовать мои координаты x и y к этому -1 к 1 пробелу в первую очередь. Поэтому я нормализую свои значения x & y следующим образом:
xNorm = (x / (width/2)) - 1;
yNorm = (y / (height/2)) - 1;
Это дает мне нормализованные значения x: -.6875, y: -.0625
. В чем я не уверен, так это в том, каким должен быть мой Z, если openGL собирается в итоге разделить эти нормализованные значения на него. Я знаю, что соотношение сторон, вероятно, нужно ввести в уравнение, но не уверен, как.