Я пытаюсь понять систему координат OpenGL. Однако некоторые учебные пособия говорят, что система координат по умолчанию левая (см. http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx), а другие говорят, что она правая (см. http://www.falloutsoftware.com/tutorials/gl/gl0.htm). Что правильно? Я понимаю, что мы можем преобразовать один в другой путем зеркального отображения, но я хотел бы знать координаты по умолчанию.
Система координат OpenGL левая или правая?
Ответ 1
Система координат правая. Первая статья кажется неправильной.
Ответ 2
Здесь есть некоторая путаница.
OpenGL прав в пространстве объектов и в мировом пространстве.
Но в пространстве окна (ака экранное пространство) мы внезапно оказываемся в руке.
Как это произошло?
Путь, который мы получаем от правого до левого, - это отрицательная z масштабирующая запись в glOrtho
или glFrustum
проекционных матриц. Масштабирование z на -1 (оставив x и y такими, какими они были) влияет на изменение ручности системы координат.
Для glFrustum,
далеки и близки должны быть положительными, далеко друг от друга. Скажем далеко = 1000 и около = 1. Тогда C = - (1001)/(999) = -1,002.
Подробнее см. здесь.
С орфографической точки зрения glOrtho генерирует такую матрицу:
Здесь слева, справа, снизу и сверху находятся только координаты для вертикальных, вертикальных, нижних горизонтальных, горизонтальных плоскостей отсечения слева и справа.
рядом и far, однако задаются по-разному. Параметр near определяется как
- Рядом: расстояние до ближайшей плоскости отсечения глубины. Это расстояние отрицательно, если плоскость должна находиться за зрителем.
и далеко:
- zFar расстояние до более широкой плоскости отсечения глубины. Это расстояние отрицательно, если плоскость должна находиться за зрителем.
Здесь мы имеем типичный канонический объем обзора
Так как множитель z (-2/(дальний)), знак минус эффективно масштабирует z на -1. Это означает, что "z" поворачивается влево во время преобразования просмотра, без ведома большинства людей, поскольку они просто работают в OpenGL как "правая" система координат.
Итак, если вы вызываете
glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,
Затем NEAR PLANE на 10 единиц впереди вас. Где ты? Почему, в начале координат, с осью x справа от вас, ось y на верхней части головы, а ваш нос указывает вниз на отрицательную ось z (что по умолчанию "По умолчанию камера находится в начале координат, указывает отрицательную ось z и имеет верхний вектор (0, 1, 0)." ). Таким образом, ближняя плоскость находится в точке z = -10. Далекая плоскость 10 единиц позади вас, при z = + 10.
Ответ 3
По умолчанию координата нормализованного устройства левая.
glDepthRange по умолчанию [0, 1] (рядом, далеко) делает ось оси + z на экране, а с + x вправо и + y вверх - левая система.
Изменение диапазона глубины до [1, 0] сделает систему правшей.
Процитировав предыдущий ответ от Nicol: (промах - это моя работа, поясняемая ниже)
Я удивлен, что никто не упоминал ничего: OpenGL работает и в левой системе координат. По крайней мере, это происходит, когда вы работаете с шейдерами и используете диапазон глубины по умолчанию.
Как только вы выбрасываете конвейер с фиксированной функцией, вы напрямую работаете с "клип-пространством". Спецификация OpenGL определяет пространство клипов как однородную систему координат 4D. Когда вы выполняете преобразования через нормализованные координаты устройства и вплоть до окна, вы найдете это.
Окно пространства находится в пространстве пикселей окна. Происхождение находится в нижнем левом углу, при этом + Y идет вверх и + X идет вправо. Это очень похоже на правую систему координат. Но как насчет Z?
Диапазон глубины по умолчанию (glDepthRange) устанавливает значение Z ближе к 0, а дальнее значение Z - один. Таким образом, + Z будет прочь от зрителя.
Это левая система координат. Да, вы можете
изменить глубинный тест с GL_LESS на GL_GREATER иизменить glDepthRange с [0, 1] на [1, 0]. Но состояние OpenGL по умолчанию должно работать в левой системе координат. И ни одно из преобразований, необходимых для того, чтобы попасть в оконное пространство из пространства клипов, отрицает Z. Таким образом, пространство клипов, вывод шейдера вершины (или геометрии) является левым пространством (kinda). Это 4D однородное пространство, поэтому это трудно прикрепить к руке).В контуре фиксированной функции стандартные матрицы проекций (создаваемые glOrtho, glFrustum и т.п.) превращаются из правого пространства в левое. Они переворачивают значение Z; просто проверьте матрицы, которые они генерируют. В пространстве глаза + Z перемещается к зрителю; в пространстве постпроекции он уходит.
Я подозреваю, что Microsoft (и GLide) просто не удосужились выполнить отрицание в своих проекционных матрицах.
Я ударил одну часть, так как она отклонилась от моих находок.
Либо изменение DepthRange, либо DepthFunc и использование ClearDepth (0) работает, но при использовании обоих они отменяют друг друга обратно в левую систему.
Ответ 4
ТОЛЬКО НДЦ
Вы должны только заметить, что OpenGL знает только NDC!, и это левая система координат.
Независимо от того, какую систему координат вы используете - левую или правую систему координат оси - все они должны быть отражены в NDC. Если хотите, вы можете полностью обрабатывать мировое пространство как левостороннюю систему координат.
Почему мы обычно используем правую систему координат в мировом пространстве?
Я думаю, что это обычный. Это просто так. Может быть, это просто хочет отличить от DirectX.
Ответ 5
Книга "Руководство по программированию WebGl" Куити Мацуды проводит почти десять страниц на "WebGl/OpenGl: Left или Right Handed?"
Согласно книге:
-
На практике большинство людей используют правую систему
-
OpenGl фактически представляет собой левую систему внутри
-
Внутренне, глубже это не так. В самом низу OpenGl не интересует z-значение. Порядок, в котором вы рисуете объекты, определяет то, что нарисовано сверху (сначала нарисуйте треугольник, затем квадрат, квадрат переопределяет треугольник).
Я не полностью согласен с "это ни", но это, вероятно, философский вопрос.
Ответ 6
Opengl определенно левша. Вы видите много руководств, указывающих на противоположное, потому что они отрицают значение z в матрице проекции. Когда конечные вершины вычисляются внутри вершинного шейдера, он преобразует вершины, которые вы передаете с клиентской стороны (правая координата) в левую сторону, а вершины затем передаются в шейдер и шейдер геометрии. Если вы используете правую систему координат на стороне клиента, Opengl не заботится. Он знает только нормализованную систему координат, которая левая.
Изменить: если вы мне не доверяете, просто экспериментируйте в своем вершинном шейдере, добавив матрицу перевода, и вы можете легко увидеть, является ли Opengl левым или нет.