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


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

6 73

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 просто координаты левой вертикальной,правой вертикальной,нижняя горизонтальная,верхняя горизонтальная отсечения плоскости (ОТВ).

В возле и далеко самолеты, однако, задаются по-разному. Элемент возле

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

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

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

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

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

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

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

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

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

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

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

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

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

ТОЛЬКО NDC

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

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

Я думаю, что это conventional.It просто делает.Может быть, его просто хотят отличить от DirectX.

книга" WebGl Programming Guide "Коути Мацуда тратит почти десять страниц на" WebGl / OpenGl: левая или правая рука?"

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

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

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

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

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

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

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