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

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

6 ответов


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


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

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

здесь левый, право, дно и top просто координаты левой вертикальной, правой вертикальной, нижняя горизонтальная, верхняя горизонтальная обрезка плоскостей (ОТВ).

В возле и далеко самолеты, однако, задаются по-разному. The возлеотрицательная ось z (это значение по умолчанию "по умолчанию камера расположена в начале координат, направлена вниз по отрицательной оси z и имеет вектор вверх (0, 1, 0)."). Поэтому вблизи плоскости при Z=-10. Дальний самолет 10 единиц за вы, при z=+10.


по умолчанию нормализованная координата устройства левша.

glDepthRange по умолчанию [0, 1] (рядом, далеко) делает точку оси +z на экране и с +x справа и +y вверх это левша система.

изменение диапазона глубины на [1, 0] сделает систему правой рукой.

со ссылкой на ответ от Никол: (забастовка-это моя работа, объясненная ниже)

Я никого не удивляю упоминалось что-то: OpenGL работает и в левой системе координат. По крайней мере, это происходит, когда вы работаете с шейдерами и используете диапазон глубины по умолчанию.

Как только вы выбрасываете конвейер с фиксированной функцией, Вы имеете дело непосредственно с "clip-space". Спецификация OpenGL определяет клип-пространство как 4D однородную систему координат. Когда вы следуете преобразованиям через нормализованные координаты устройства и вниз к оконному пространству, вы найдете это.

окне в пространство пикселей окна. Начало координат находится в левом нижнем углу, с +Y вверх и +X вправо. Это очень похоже на систему координат правой руки. А как насчет Зи?

диапазон глубины по умолчанию (glDepthRange) устанавливает значение near Z в 0, а значение far Z в один. Итак, +Z идет до от зрителя.

это левая система координат. Да, можно!--24-->измените тест глубины от GL_LESS к GL_GREATER и измените glDepthRange с [0, 1] на [1, 0]. Но ... --26-->по умолчанию состояние OpenGL должно работать в левша система координат. И ни одно из преобразований, необходимых для доступа к оконному пространству из clip-space, не отрицает Z. Поэтому clip-space, выход шейдера вершины (или геометрии) является левым пространством (своего рода. Это однородное пространство 4D,поэтому трудно определить handedness).

в трубопроводе фиксированной функции, стандартные проекционные матрицы (производимые glOrtho, glFrustum и тому подобное) преобразуются из правостороннего пространства в левша один. Они переворачивают значение Z; просто проверьте матрицы, которые они генерируют. В пространстве глаз +Z движется к зрителю; в пространстве после проекции он удаляется.

Я подозреваю, что Microsoft (и GLide) просто не потрудились выполнить отрицание в своих проекционных матрицах.

Я ударил одну часть, так как это расходится с моими выводами.

либо изменение DepthRange или DepthFunc и использование ClearDepth (0) работает, но при использовании обоих они отменили друг друга обратно в левую систему.


ТОЛЬКО NDC

вы должны только заметить, что OpenGL only knows NDC!!, и это левая координата. независимо от того, какую координату вы используете,левая, правая ось-координата и т. д.Все должно быть отражено в NDC. Если хотите, вы можете полностью написать world-space в левой координате.

почему мы используем правую правую координату в мировом пространстве?

Я думаю, что это обычное дело.Так и есть.Возможно, он просто хочет отличить DirectX от DirectX.


книга" Руководство по программированию WebGl "Коути Мацуда тратит почти десять страниц на" WebGl / OpenGl: левый или правый?"

согласно Книге:

  • на практике большинство людей используют систему правой руки

  • OpenGl на самом деле является левой системой внутренне

  • внутренне, более глубоко это на самом деле ни то, ни другое. В самом низу OpenGl не заботится о Z-значении. Порядок, в котором вы draw things определяет, что нарисовано сверху (сначала нарисуйте треугольник, затем квадроцикл, квадроцикл переопределяет треугольник).

Я не полностью согласен с "это ни то, ни другое", но это, вероятно, философский вопрос в любом случае.


Opengl определенно левша. Вы видите много учебников, заявляющих обратное, потому что они отрицают z-значение в матрице проекции. Когда конечные вершины вычисляются внутри вершинного шейдера, это преобразование вершин, которые вы передаете с клиентской стороны (правая координата) на левую, а вершины затем будут переданы в геометрический шейдер и шейдер фрагментов. Если вы используете правую систему координат на стороне клиента, Opengl это не волнует. Он знает только нормализованную координату система, которая левша.

Edit: если вы мне не доверяете, просто поэкспериментируйте в своем шейдере вершин, добавив матрицу перевода, и вы легко увидите, является ли Opengl левшой или нет.