Является ли система координат OpenGL левосторонней или правосторонней?
Я пытаюсь понять систему координат OpenGL. Однако в некоторых учебниках говорится, что система координат по умолчанию является левосторонней (см. http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx) а другие говорят, что он правша (см. http://www.falloutsoftware.com/tutorials/gl/gl0.htm). что правильно? Я понимаю, что мы можем преобразовать один в другой путем зеркального отображения, но я хотел бы знать значение по умолчанию координирует.
6 ответов:
здесь есть некоторая путаница.
OpenGL является правой рукой в пространстве объектов и мировом пространстве.
но в пространстве окна (ака пространство экрана) мы вдруг левша.
как это происходит?
путь, который мы получаем от правой руки к левой руке, - это отрицательная запись масштабирования z в
glOrtho
илиglFrustum
проекции матрицы. Масштабирование z на -1 (оставляя x и y такими, какими они были) приводит к изменению управляемости системы координат.для glFrustum,
далеко и возле должны быть положительными, с далеко>возле. Скажи далеко=1000 и возле=1. Затем C= -( 1001 ) / ( 999 ) = -1.002.
посмотреть здесь для более подробной информации и диаграммы.
С точки зрения орфографической, glOrtho генерирует матрицу следующим образом:
здесь левый,право,дно и 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 левшой или нет.