Что ж, необходимо проецировать трехмерный мир на двухмерную поверхность, поскольку ваш экран является двухмерной поверхностью.
3D-графика работает в разных «координатных пространствах», и они преобразуются между ними, чтобы получить финальную сцену.
Представьте себе, например, моделирование города. Вы можете определить нижний левый угол карты как (0, 0), а верхний правый как (1000000, 1000000). Вы также можете сказать, что, как правило, одна точка будет представлять собой фут реального пространства. Это представление мы будем называть мировым пространством.
Чтобы нарисовать свой город, вам нужно импортировать некоторые модели зданий и разместить их в мире. Таким образом, вы получаете свою модель здания, но когда вы создаете эту модель, вам не нужно беспокоиться о размере мира или о том, где он будет - вы, возможно, скажете, что левый нижний угол здания в (0, 0) и его верхний правый в (1, 1). Это представление мы будем называть модельным пространством. Однако в мире здание может быть размещено в (104, 136), и вы можете захотеть, чтобы оно было 1000x1000 пикселей, поэтому вам нужно будет перевести его в (104, 136) и увеличить его до 1000x. Это превращает его из модельного пространства в мировое пространство.
Наконец, Camera Space - это то, как вы перемещаетесь по миру. Если вы думаете об этом, о движении по миру можно подумать двумя способами (по крайней мере): вы движетесь вокруг мира, или мир движется вокруг вас. Поэтому, чтобы облегчить движение, скажем, что камера всегда находится в точке (0, 0), направленной вниз по некоторой оси. Теперь, если вы хотите продвинуться на 10 пикселей вперед, вы просто переместите все назад на 10 пикселей. Если вы хотите вращаться, вместо этого вращайте мир. Итак, чтобы визуализировать здание, сначала мы хотим преобразовать его из модельного пространства в мировое пространство. Теперь, чтобы на самом деле нарисовать его, мы хотим знать, где он находится относительно зрителя, поэтому мы перемещаем его из мирового пространства в пространство камеры.
. , .
Кроме того, если вы хотите понять это очень хорошо, хорошим упражнением является написание трехмерного каркасного рендерера, отдельного от OpenGL. Ваша единственная доступная функция рисования - DrawLine (x1, y1, x2, y2), которая рисует линию на экране от (x1, y1) до (x2, y2).