Объем просмотра определяет, сколько мира вы на самом деле видите, каждый объект снаружи объем просмотра не виден, и все внутри потенциально является видимым (если оно не скрытообъект перед ним).
Форма объема просмотра определяется типом проекции, которую вы используете.
Существует 2 типа проекций: ортографическая и перспективная проекции.
Ортография не учитывает расстояние от зрителя (не естественно, но полезно для программного обеспечения САПР и т. Д.) И перспективные проекции, которые учитывают расстояние от зрителя и, следовательно, объекты, которые находятся дальше, кажутся меньше.
В ортографической проекции объем просмотра представляет собой куб, а в проекции перспектива объем просмотра имеет форму усеченного конуса (ближняя плоскость отсечения меньше, чем дальняя плоскость отсечения).
В любом случае содержимое тома просмотра «проецируется» на ближнюю вырезанную пластинуne.
Конечно, этот процесс немного сложнее, чем простое умножение projection_matrix с каждой вершиной в объеме представления;но в основном это объясняется почти в каждой книге, связанной с OpenGL.
форма объема просмотра до некоторой степени моделирует свойства камеры ... насколько широко вы видите, как далеко вы видите и т. д.
Красная книга хорошо объясняет это в отдельной главе просмотра.
Когда вы говорите о усеченном контуре, вы подразумеваете, что вы используете перспективную проекцию.
Для построенияfrustum вам нужно 8 точек, и вы, как правило, захотите построить симметричный frustum, который упрощает матрицу проекции.
Вместо того, чтобы указывать 8 точек вручную, вы будете использовать вспомогательные методы, такие как gluPerspective (fovy, aspect_ratio, near, far) , который использует "более интуитивные" параметры для построения усеченного конуса;в основном это оболочка для glFrustum, которая вычисляет для вас 8 баллов, а затем вызывает вместо вас glFrustum.
Для OpenGL 3.0 и выше вы предоставите собственную реализацию gluPerspective, вы можете просто погуглить код.
Только помните, что проекция делает 3D 2D.
Что касается просмотра, OpenGL использует правую систему координат (ось x направлена влево, ось y направлена вверх, а ось z направлена наружу экрана).;DirectX использует левостороннюю систему координат.
Помните, что в трехмерном пространстве у вас есть только 2 ориентации системы координат (левая и правая).
Разница заключается в ориентации zось;если вы направите ось z внутрь, это система для левой руки или если вы направите точку z наружу, это будет система для правой руки .
Любое другое направление дляОсь z не сделает ось z перпендикулярной осям x и y, и поэтому у вас не будет системы координат.
Рукопожатие определяет такие вещи, как, в каком направлении происходит положительное вращение и т. д.
Ваша камера расположена в начале координат (0,0,0) и по умолчанию направлена вниз по оси -z ;и так будет до тех пор, пока вы не примените какое-либо преобразование.
Положение вашего взгляда строится вокруг направления просмотра, а ближняя плоскость отсечения расположена в точке z = - около камеры, которая расположенаизначально в начале координат.
Когда вы указываете около и далеко в качестве положительных значений для glFrustum, вы не указали их z расположение, простотак получается, что ближняя плоскость отсечения расположена в z = -near из-за ориентации камеры по умолчанию вдоль отрицательной оси z и потому, что камера изначально находится в исходном положении (0,0,0), а вашаближняя плоскость отсечения всегда вблизи вдали от положения глаз зрителя или положения камеры.
И всякий раз, когда вы меняете вид (изменяете положение камеры, меняете ориентацию камеры или и то, и другое), ваше усеченное кольцо все равно будет «оборачиваться вокруг нового направления просмотра», а ближняя плоскость отсечения будет по-прежнему «близко» от нового положения камеры. .
Надеюсь, вы поняли концепцию.
Frustum определяет, сколько.
Независимо от того, где стоит камера и укажите.