Перспективная проекция в OpenGL
Я смущен перспективной проекцией.
вот сценарий, который меня смущает. Передняя плоскость моего фрустрама в основном расположена на положительной оси z,а задняя плоскость на отрицательной оси и вращается вокруг некоторого угла вдоль оси Z.
мой подход в этом случае был в основном что-то например:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustrum(-xval,+xval,-yval,+yval,-10,+10);
gluLookAt(); // some point lying on this axis of symmetry about the point
glMatrixMode(GL_MODELVIEW);
Итак, в приведенном выше случае, какое поведение я должен ожидать для glFrustum с отрицательным, а также положительным значением для z. т. е. в данном случае от -10 до +10.
3 ответов
конечно. В противном случае вы получите что-то вроде этого
:
вся проекция происходит относительно начала координат 0. близко и далеко определяют расстояние плоскостей отсечения от начала координат. левый и правый определяют угол раскрытия усеченной части вместе с ближней плоскостью. Если вы разместите "рядом" и " далеко плоскость в противоположных направлениях от начала координат, ваше проекционное пространство приобретает форму песочных часов.
glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustrum(-xval,+xval,-yval,+yval,-10,+10); gluLookAt(); // some point lying on this axis of symmetry about the point glMatrixMode(GL_MODELVIEW);
проекция не предназначена для расположения вида. Проекция-это своего рода "объектив" виртуальной камеры. Вы можете использовать его для наклон и сдвиг объектива и ставим "фокусное расстояние". Но он не предназначен для "размещения камеры". Это должно произойти через модельпосмотреть матрица.
Так, в приведенном выше случай какое поведение я должен ожидать для glFrustum с отрицательным, а также положительным значением для z. т. е. в данном случае от -10 до +10.
от дальней до" ближней " плоскости объекты будут становиться больше по мере приближения к 0, поскольку Z=0 они находятся в сингулярности и взрываются бесконечно, а затем, приближаясь к ближней, они станут меньше, но будут инвертированы, т. е. повернуты на 180° вокруг оси Z, а значения глубины будут повернуты вокруг, т. е. сортировка глубины по глубине тестирование будет отбрасывать фрагменты ближе к near чем к 0.
объем представления определяет, сколько мира вы на самом деле видите, каждый объект за пределами объем просмотра не отображается, и все внутри потенциально виден (если не скрыт объектом перед ним).
форма объема представления определяется типом используемой проекции.
существует 2 типа проекций ортографических и перспективных проекций.
Ortographic не принимать расстояние от зрителя в учет (не естественный но полезный для программного обеспечения ЕТК КАД.) и перспективные проекции, которые учитывают расстояние от зрителя и поэтому объекты, которые находятся дальше, кажутся меньше.
на ortographic проекция объем представления представляет собой куб и в перспективы проекция объем вида имеет форму усечения (ближняя плоскость отсечения меньше дальней плоскости отсечения).
в любом случае содержание представления объем "проецируется" на ближнюю плоскость отсечения.
конечно, процесс немного сложнее, чем простое умножение projection_matrix с каждой вершиной в томе представления; но это в основном объясняется почти в каждой книге, связанной с OpenGL.
на посмотреть объем формы в некоторой степени моделирует Свойства камеры...как широко вы видите, как далеко вы видите и т. д.
на Красная книга объясняет это хорошо в выделенном просмотр главы.
говоря о разочаровании, вы подразумеваете, что используете перспективную проекцию.
чтобы построить разочарование, вам нужно 8 точек, и вы обычно хотите построить симметричное разочарование, которое упрощает матрицу проекции.
вместо указания 8 точек непосредственно вручную вы будете использовать вспомогательные методы, такие как gluPerspective (fovy,aspect_ratio,near,far) который использует "более интуитивные" параметры для конструкции frustum; это в основном обертка вокруг glFrustum, которая вычисляет 8 очков для вас, а затем вызывает glFrustum вместо вас.
для OpenGL 3.0 и выше вы предоставите свою собственную реализацию gluPerspective, вы можете просто google код.
просто помните, что проекция делает 3D стать 2D.
Что касается просмотра, OpenGL использует правую систему координат (x axis points left, y axis point up и Z axis point outward экран.); DirectX использует левая система координат.
помните, что в 3D-пространстве у вас есть только 2 ориентации системы координат(левая и правая рука).
разница заключается в ориентации оси z; Если вы сделаете точку оси z внутрь, это левша система или если вы сделаете точку z наружу, это правой рукой
Итак, в приведенном выше случае, какое поведение я должен ожидать для glFrustum с отрицательным, а также положительным значением для z. т. е. в данном случае от -10 до +10.
сломан. Вы должны ожидать, что поведение будет нарушено.
документация вполне понятно:
nearVal, farVal: укажите расстояния до ближних и дальних плоскостей отсечения глубины. как расстояния должны быть положительными.
(курсив)
передача отрицательного числа (или нуля) для этих значений приведет к ухудшению.