Система координат OpenGL левша или правша? - PullRequest
82 голосов
/ 08 ноября 2010

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

Ответы [ 5 ]

122 голосов
/ 09 сентября 2012

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

enter image description here

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

Но в окнепробел (иначе экранное пространство) мы внезапно левша .

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

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

Для glFrustum,

enter image description here enter image description here

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

См. здесь для более подробной информации и диаграмм.

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

enter image description here

Здесь слева , справа , снизу и top - это всего лишь координаты по вертикали , по вертикали , по горизонтали внизу , по горизонтали сверху плоскости отсечения (соответственно) .

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

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

и дальний:

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

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

canonical

Поскольку множитель zравно (-2 / (далеко)), знак минус эффективно масштабирует z на -1 .Это означает, что «z» поворачивается влево во время преобразования просмотра, без ведома большинства людей, поскольку они просто работают в OpenGL как «правосторонняя» система координат.

Итак, если выПозвоните

glOrthof(-1, 1, -1, 1, 10, -10) ; // near=10, FAR=-10,

Тогда САМОЛЕТ ВСЕГО 10 единиц впереди вас .Где ты?Почему, в начале координат, с осью X справа от вас, осью Y на макушке головы, а нос направлен вниз на отрицательную ось Z (это значение по умолчанию "Попо умолчанию камера расположена в начале координат, направлена ​​вниз по отрицательной оси z и имеет вектор повышения (0, 1, 0). ").Таким образом, ближняя плоскость находится в точке z = -10.Дальний самолет находится на расстоянии 10 единиц позади вас, при z = + 10 .

24 голосов
/ 22 апреля 2012

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

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

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

Цитирование предыдущего ответа от Никола : (зачеркнутая работа - моя работа, объясненная ниже)

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

После того, как вы выбросили конвейер с фиксированной функцией, вы имеете дело непосредственно с «клип-пространством».Спецификация OpenGL определяет пространство клипа как 4D однородную систему координат.Когда вы следуете за преобразованиями через нормализованные координаты устройства и до пространства окна, вы обнаружите это.

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

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

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

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

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

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

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

10 голосов
/ 02 июля 2014

ONLY NDC

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

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

Я думаю, что это условно. Это простоможет. Просто хочу отличить от DirectX.

7 голосов
/ 04 июня 2014

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

Согласно книге:

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

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

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

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

3 голосов
/ 28 июня 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...