2010-11-08 10 views
67

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

+0

http://programmers.stackexchange.com/a/88776/12693 – Kos

+1

Не зависит ли это от того, как вы пишете свои трансформации в шейдерах и, следовательно, полностью зависит от вас? – jcoder

+0

Только мои два цента http://www.evl.uic.edu/ralph/508S98/coordinates.html, у него есть несколько самоочевидных изображений. – rraallvv

ответ

-6

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

+1

вы уверены ?, согласно моему тесту без какой-либо матрицы преобразования, объект с более низким z охватывает объекты с более высоким значением и с заголовком x вправо, а y это сделает его левшей системой. – hultqvist

+10

Неправильный, OGL имеет право в пространстве глаза, но левый в нормализованных координатах устройства. См. [Здесь] (http://www.songho.ca/opengl/gl_projectionmatrix.html) – bobobobo

+4

Нормированные координаты устройства левые. Можно использовать левую или правую координаты для пространства глаз, но в целом используется правая. – neodelphi

20

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

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

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

Цитируя предыдущий answer from Nicol: (забастовка, через это моя работа, поясняются ниже)

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

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

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

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

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

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

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

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

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

+0

Диапазон глубины не может быть [1, -1]. Думаю, вы имели в виду [1, 0]. Кроме того, [это было указано ранее] (http://programmers.stackexchange.com/questions/17519/why-does-directx-use-a-left-handed-coordinate-system/88776#88776). –

+0

Ваш ответ замечательный, слишком плохой вопрос DirectX, вы должны отправить его здесь! – hultqvist

+0

Я не думаю, что это стоило воскресить 2-летний вопрос. – SigTerm

107

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

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.

См. here для получения более подробной информации и схем.

С орфографической точки зрения, glOrtho генерирует матрицу следующим образом:

enter image description here

Здесь оставил, право, дно и топ только the coordinates for left vertical, right vertical, bottom horizontal, top horizontal clipping planes (resp).

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

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

и далеки:

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

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

canonical

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

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

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

Тогда NEAR САМОЛЕТ является 10 единиц впереди. Где ты? Почему, в начале координат, с осью x справа от вас, ось y на верхней части головы, а ваш нос указывает вниз на отрицательную ось z (это по умолчанию "By default, the camera is situated at the origin, points down the negative z-axis, and has an up-vector of (0, 1, 0)."). Таким образом, ближняя плоскость находится в точке z = -10. Дальний самолет 10 единиц позади вас, при z = + 10.

+1

«передний вектор отрицается в gluLookAt» - можете ли вы подтвердить, что это тот случай? Не gluPerspective или glFrustum или glOrtho? – Kos

+0

Да, в последних нескольких строках, 'matrix2 [2] = -forward [0]; .. 'переворачивает направление переднего вектора. – bobobobo

+1

_Вы внезапно левша_ с места клипа вперед, а не просто окно. – legends2k

4

Книга «Руководство по программированию WebGl» от Kouichi Matsuda проводит почти десять страниц на «WebGl/OpenGl: Left или Right Handed»?

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

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

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

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

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

+0

'Порядок, в котором вы рисуете объекты, определяет то, что нарисовано сверху (сначала нарисуйте треугольник, затем квадрат, квадрат переопределяет треугольник). Это правда, при отсутствии глубинных испытаний. При наличии тестирования глубины значение z фрагмента сравнивается со значением в буфере глубины, а фрагмент отбрасывается, если он терпит неудачу в тесте на глубину, поэтому квадроцикл может или не может перезаписывать треугольник в зависимости от их глубины и используемая функция глубины. – chrisvarnz

7

ТОЛЬКО NDC

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

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

Я думаю, что он обычный. Он просто делает. Может быть, он просто хочет отличить от DirectX.

+0

Я думаю, что этого недостаточно. Все эти диаграммы, демонстрирующие «преобразование моделирования», «преобразование представлений», «перспективное преобразование», не показывают, что они не являются неотъемлемой частью OpenGL. Вы даже можете сделать все свои преобразования вручную, с шейдерами или без них, с матрицами или без них. – Tomis

+1

Возможно, было бы лучше повторить его, чтобы включить слова «нормализованные координаты устройства». – Tommy

+1

OpenGL предшествует DirectX на несколько лет, поэтому OpenGL, конечно же, не пытались отличить себя от DirectX. Ведущий разработчик DirectX Алекс Сент-Джон заявил, что решение Microsoft пойти на левую систему координат было «частично из личных предпочтений» и «произвольным выбором». –

1

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

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

Смежные вопросы