Наиболее важным является то, что он преобразует ваши точки (вершины) из пространства трехмерного мира в пространство двухмерного экрана.
Это означает, что после умножения вершины на эту матрицу координаты X и Y находятся на экране (между [-1, 1]), а Z - это глубина. Z используется для буфера глубины и определяет, как далеко вершина (или фрагмент) от вашей камеры около плоскости.
Проекция означает, что вершины, которые находятся ближе к ближней плоскости, находятся дальше от середины экрана -> треугольник, находящийся ближе к камере, кажется больше, чем дальний. И это зависит от вашего поля зрения - вы вводите его в какую-либо функцию createProjectionMatrix или createFrustum. Работает так, что он срезает и масштабирует вашу усеченную камеру и вершины в ней в единичный куб. Значения больше 1 и меньше -1 не отображаются.
Также сохраняет пропорции пикселя, поэтому пиксель может быть квадратным. Это просто. Он просто срезает усечку камеры следующим образом: более широкий экран -> более вертикальный сдвиг и наоборот.
Простой ответ:
он определяет вашу усадьбу камеры и хорош для:
- сделать объекты, которые находятся рядом с вами, больше, чем объекты, которые находятся далеко от вас.
- сохранить пропорции пикселя - всем нравится квадратный пиксель, верно? :)
Этот ответ задолго до факта, но, поскольку я нашел это в Google, возможно, это все равно кому-то поможет. Я просто хочу уточнить, что говорили JasonD и Notabene: намного проще выполнять вычисления отсечения (выясните, что вы должны увидеть, а что нет, из-за того, как вы смотрите, как далеко он находится, и т. Д. .). Вместо того, чтобы проверять, пересекаются ли плоскости на границах области видимости, вы просто сравниваете x, y, z всего с xMax, xMin, yMax, ect. , так как у вас просто есть куб. Это немного сложнее, если вы хотите показать только часть чего-либо, но математика все же лучше с единичным кубом, чем с усеченным конусом.
Пара вещей, которые я нахожу вводящими в заблуждение в других ответах:
- Вы не срезаете боковые стороны усеченного вида, вы как бы деформируете его в куб, используя преобразования однородной матрицы.
- Мы не конвертируем в 2D-экран с этим шагом. Этот шаг не является необходимым для этого. Теоретически мы могли бы выполнить всю нашу работу, не преобразовывая сначала усеченный конус в куб, что было бы более интуитивно, но сложнее в математике - но графика - это все о том, чтобы делать вычисления очень быстро, поскольку для средней игры / чего угодно, в среднем много вычислений в секунду.
Более подробно: это не обязательно единичный куб, в который мы конвертируем, это просто прямоугольный прямоугольник, чтобы наши расчеты выполнялись максимально. На самом деле в классе мы использовали поле, где камера обращена вниз по оси z, z - от 0 до 1, x - от -1 до 1, а y - от -1 до 1. В общем, в математике 1, 0, и -1 - хорошие цифры для упрощения вычислений, я предполагаю, что поэтому мы не идем от -100 до 100 или около того.
TLDR: это облегчает отсечение.
Редактировать: бобобо имеет суть этого. В общем, все треугольники: D.
Источник: Обучение в университете
источник
Я считаю, что это потому, что OpenGL не может делать предположения о том, как изображение должно отображаться (соотношение сторон или разрешение, детали оборудования и т. Д.). Он рендерит и образ в промежуточную форму, которая операционная система или драйвер или любой другой масштабируется до правильного разрешения / размера.
источник
Я отмечаю, что ответ уже принят, но для отсечения обычно полезно преобразовать усеченный вид в куб.
источник
Мне тоже интересно это. Есть несколько вещей, чтобы рассмотреть.
Во-первых, да, все в мире преобразуется в этот единичный куб [-1,1] с центром в начале координат. Если что-то не находится в этом единичном кубе, это не будет отображаться.
Самое приятное в этом то, что вы можете довольно легко отбирать треугольники. (Если все 3 вершины треугольника имеют
x > 1
илиx < -1
тогда этот треугольник можно отбраковать).источник
Я бы порекомендовал проверить урок по матрице перспективной проекции на Scratchapixel
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix
Это ясно объясняет, почему нужно деформировать пространство усеченного вида в единичный куб. Почему? По сути, потому что процесс проецирования трехмерных точек на холст задействован для преобразования их в пространство NDC, которое представляет собой пространство, в котором точки на экране переназначаются в диапазоне [-1,1] (при условии, что экран квадратный). Теперь мы также переназначаем точку Z-координаты в диапазон [0,1] (или иногда [-1,1]), поэтому в итоге вы получите куб. Дело в том, что когда точки содержатся в кубе, их легче обрабатывать, чем когда они определены в усеченном виде (странное пространство, усеченная пирамида). Другая причина заключается в том, что все виды проективного преобразования, которое вы можете себе представить в CG, можно перенести в одно и то же пространство (единичный куб). Таким образом, независимо от того, используете ли вы, например, перспективную или орфографическую проекцию,
Хотя, может быть, вы слишком сосредоточены на том, почему. Единичный куб на самом деле является просто результатом математического процесса, задействованного или используемого для проецирования вершин на экран, а затем переназначения их координат в растровое пространство.
источник