Подтвердить что ты не робот

Система координат OpenGL левая или правая?

Я пытаюсь понять систему координат OpenGL. Однако некоторые учебные пособия говорят, что система координат по умолчанию левая (см. http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx), а другие говорят, что она правая (см. http://www.falloutsoftware.com/tutorials/gl/gl0.htm). Что правильно? Я понимаю, что мы можем преобразовать один в другой путем зеркального отображения, но я хотел бы знать координаты по умолчанию.

4b9b3361

Ответ 1

Система координат правая. Первая статья кажется неправильной.

Ответ 2

Здесь есть некоторая путаница.

enter image description here

OpenGL прав в пространстве объектов и в мировом пространстве.

Но в пространстве окна (ака экранное пространство) мы внезапно оказываемся в руке.

Как это произошло?

Путь, который мы получаем от правого до левого, - это отрицательная z масштабирующая запись в glOrtho или glFrustum проекционных матриц. Масштабирование z на -1 (оставив x и y такими, какими они были) влияет на изменение ручности системы координат.

Для glFrustum,

enter image description hereenter image description here

далеки и близки должны быть положительными, далеко друг от друга. Скажем далеко = 1000 и около = 1. Тогда C = - (1001)/(999) = -1,002.

Подробнее см. здесь.

С орфографической точки зрения glOrtho генерирует такую ​​матрицу:

enter image description here

Здесь слева, справа, снизу и сверху находятся только координаты для вертикальных, вертикальных, нижних горизонтальных, горизонтальных плоскостей отсечения слева и справа.

рядом и far, однако задаются по-разному. Параметр near определяется как

  • Рядом: расстояние до ближайшей плоскости отсечения глубины. Это расстояние отрицательно, если плоскость должна находиться за зрителем.

и далеко:

  • zFar расстояние до более широкой плоскости отсечения глубины. Это расстояние отрицательно, если плоскость должна находиться за зрителем.

Здесь мы имеем типичный канонический объем обзора

canonical

Так как множитель 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 левым или нет.