Какое значение должно быть Z для деления перспективы? - PullRequest
0 голосов
/ 25 апреля 2020

Итак, я пытаюсь понять основы перспективного проектирования для трехмерной графики, и я застреваю. Сейчас я стараюсь избегать матриц, чтобы облегчить понимание. Это то, что я придумал до сих пор:

Сначала я представляю, что у меня есть точка с экранными (пиксельными) координатами 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 собирается в итоге разделить эти нормализованные значения на него. Я знаю, что соотношение сторон, вероятно, нужно ввести в уравнение, но не уверен, как.

...