Объем обзора определяет, какую часть мира вы на самом деле видите, каждый объект вне объема обзора не виден, и все внутри потенциально видно (если оно не закрыто объектом. перед ним).
Форма объема обзора определяется типом используемой проекции.
Есть 2 типа проекций: ортографические и перспективные.
Ортографические не принимают во внимание расстояние от зрителя (что не естественно, но полезно для программного обеспечения САПР и т. Д.) И перспективные проекции, которые принимают во внимание расстояние от зрителя, и поэтому объекты, которые находятся дальше, кажутся меньше.
В ортографической проекции объем обзора представляет собой куб, а в проекции в перспективе объем обзора имеет форму усеченного конуса (ближняя плоскость отсечения меньше, чем дальняя плоскость отсечения). .
В любом случае содержимое объема обзора «проецируется» на ближайшую плоскость отсечения.
Конечно, этот процесс немного сложнее простого умножения projection_matrix с каждой вершиной в объеме представления; но в основном это объясняется почти во всех книгах, связанных с OpenGL.
Форма объема обзора в некоторой степени моделирует свойства камеры ... насколько широко вы видите, как далеко вы видите и т. Д.
В красной книге это хорошо объясняется в специальной главе о просмотре.
Говоря о пирамиде, вы подразумеваете, что используете перспективную проекцию.
Чтобы построить усеченную пирамиду, вам нужно 8 точек, и вы, как правило, захотите построить симметричную усеченную пирамиду, которая упрощает матрицу проекции.
Вместо того, чтобы указывать 8 точек непосредственно вручную, вы будете использовать вспомогательные методы, такие как gluPerspective (fovy, aspect_ratio, near, far), которые используют «более интуитивные» параметры для построения усеченной пирамиды; По сути, это оболочка вокруг glFrustum, которая вычисляет для вас 8 баллов, а затем вызывает glFrustum вместо вас.
Для OpenGL 3.0 и выше вы предоставите свою собственную реализацию gluPerspective, вы можете просто погуглить код.
Просто помните, что проекция превращает 3D в 2D.
Что касается просмотра, OpenGL использует правостороннюю систему координат (ось x указывает влево, ось y указывает вверх, а ось z указывает за пределы экрана); DirectX использует левостороннюю систему координат.
Помните, что в трехмерном пространстве у вас есть только две ориентации системы координат (левая и правая).
Разница заключается в ориентации оси z; если вы сделаете точку оси z направленной внутрь, это будет левосторонняя система, или если вы сделаете точку z направленной наружу, это будет правосторонняя система.
При любом другом направлении оси z ось z не будет перпендикулярна осям x и y, и поэтому у вас не будет системы координат.
Рукоятка определяет такие вещи, как направление положительного вращения и так далее.
Ваша камера расположена в исходной точке (0,0,0) и по умолчанию обращена вниз по оси -z; и так будет до тех пор, пока вы не примените какое-то преобразование.
Угол обзора построен вокруг направления просмотра, а ближняя плоскость отсечения расположена в точке z = -вблизи камеры, которая изначально расположена в начале координат.
Когда вы указываете near и far в качестве положительных значений для glFrustum, вы не указали их местоположение z, просто так получилось, что рядом находится плоскость отсечения при z = -near из-за ориентации камеры по умолчанию вдоль отрицательной оси z и поскольку камера изначально находится в исходной точке (0,0,0), а ваша ближняя плоскость отсечения всегда <сильная > рядом, вдали от глаз зрителя, иначе говоря, положение камеры.
И всякий раз, когда вы меняете свой вид (меняете положение камеры или меняете ориентацию камеры, или и то, и другое), ваша усеченная пирамида по-прежнему будет «обернута вокруг нового направления обзора», а ближайшая плоскость отсечения по-прежнему будет «близко» от нового положения камеры.
Надеюсь, вы уловили концепцию.
Frustum определяет сколько.
Независимо от того, где камера стоит и на что указывает.
person
Mandark
schedule
28.02.2012
GL_PROJECTION
. Идет вGL_MODELVIEW
. - person Nicol Bolas   schedule 27.02.2012