Я пытаюсь понять систему координат OpenGL. Однако некоторые учебные пособия говорят, что система координат по умолчанию левая (см. http://www.c-sharpcorner.com/UploadFile/jeradus/OpenGLBasics11172005014307AM/OpenGLBasics.aspx), а другие говорят, что она правая (см. http://www.falloutsoftware.com/tutorials/gl/gl0.htm). Что правильно? Я понимаю, что мы можем преобразовать один в другой путем зеркального отображения, но я хотел бы знать координаты по умолчанию.Система координат OpenGL левая или правая?
ответ
Система координат правая. Первая статья кажется неправильной.
вы уверены ?, согласно моему тесту без какой-либо матрицы преобразования, объект с более низким z охватывает объекты с более высоким значением и с заголовком x вправо, а y это сделает его левшей системой. – hultqvist
Неправильный, OGL имеет право в пространстве глаза, но левый в нормализованных координатах устройства. См. [Здесь] (http://www.songho.ca/opengl/gl_projectionmatrix.html) – bobobobo
Нормированные координаты устройства левые. Можно использовать левую или правую координаты для пространства глаз, но в целом используется правая. – neodelphi
По умолчанию координата нормализованного устройства левая.
Параметр 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) работают, но при использовании обоих они отменяют друг друга обратно в левую систему.
Диапазон глубины не может быть [1, -1]. Думаю, вы имели в виду [1, 0]. Кроме того, [это было указано ранее] (http://programmers.stackexchange.com/questions/17519/why-does-directx-use-a-left-handed-coordinate-system/88776#88776). –
Ваш ответ замечательный, слишком плохой вопрос DirectX, вы должны отправить его здесь! – hultqvist
Я не думаю, что это стоило воскресить 2-летний вопрос. – SigTerm
Здесь есть некоторые путаницы.
OpenGL является правша в пространстве объекта и мировое пространство.
Но в пространстве окна (ака космос экрана) мы внезапно левая рука.
Как это произошло?
Путь, который мы получаем от правого к левому, представляет собой отрицательный знак масштабирования z в матрицах проекции glOrtho
или glFrustum
. Масштабирование z на -1 (оставив x и y как они есть) приводит к изменению ручности системы координат.
Для glFrustum,
далеко и вблизи должны быть положительными, далеко>около. Сообщите далеко = 1000 и вблизи = 1. Тогда C = - (1001)/(999) = -1,002.
См. here для получения более подробной информации и схем.
С орфографической точки зрения, glOrtho генерирует матрицу следующим образом:
Здесь оставил, право, дно и топ только the coordinates for left vertical, right vertical, bottom horizontal, top horizontal clipping planes (resp).
рядом и далеко самолеты, однако, определяются по-разному. вблизи параметр определен как
- вблизи: The расстояние на глубину ближе плоскости отсечени. Это расстояние отрицательно, если плоскость должна находиться за зрителем.
и далеки:
- zFar расстояние к дальней глубине подрезки плоскости.Это расстояние отрицательно, если плоскость должна находиться за зрителем.
Здесь мы имеем типичный канонический вид объем
Поскольку г множитель (-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.
«передний вектор отрицается в gluLookAt» - можете ли вы подтвердить, что это тот случай? Не gluPerspective или glFrustum или glOrtho? – Kos
Да, в последних нескольких строках, 'matrix2 [2] = -forward [0]; .. 'переворачивает направление переднего вектора. – bobobobo
_Вы внезапно левша_ с места клипа вперед, а не просто окно. – legends2k
Книга «Руководство по программированию WebGl» от Kouichi Matsuda проводит почти десять страниц на «WebGl/OpenGl: Left или Right Handed»?
Согласно книге:
На практике, большинство людей используют правостороннюю систему
OpenGl на самом деле левша система внутренне
Внутренне, более глубоко на самом деле это не так. В самом низу OpenGl не интересует z-значение. Порядок, в котором вы рисуете вещи, определяет то, что нарисовано сверху (сначала нарисуйте треугольник, затем квадрат, квадрат переопределяет треугольник).
Я не полностью согласен с тем, что «это не так», но это, вероятно, философский вопрос.
'Порядок, в котором вы рисуете объекты, определяет то, что нарисовано сверху (сначала нарисуйте треугольник, затем квадрат, квадрат переопределяет треугольник). Это правда, при отсутствии глубинных испытаний. При наличии тестирования глубины значение z фрагмента сравнивается со значением в буфере глубины, а фрагмент отбрасывается, если он терпит неудачу в тесте на глубину, поэтому квадроцикл может или не может перезаписывать треугольник в зависимости от их глубины и используемая функция глубины. – chrisvarnz
ТОЛЬКО NDC
следует только заметить, что OpenGL only knows NDC!!
и `s левая рука координат. независимо от того, какую координату вы используете, левую, правую координату оси и т. Д. Все должны быть зеркально отражены в НДЦ. Если вам нравится, вы можете полностью написать мировое пространство в левой координате.
Почему мы используем правую правую координату в мировом пространстве?
Я думаю, что он обычный. Он просто делает. Может быть, он просто хочет отличить от DirectX.
Я думаю, что этого недостаточно. Все эти диаграммы, демонстрирующие «преобразование моделирования», «преобразование представлений», «перспективное преобразование», не показывают, что они не являются неотъемлемой частью OpenGL. Вы даже можете сделать все свои преобразования вручную, с шейдерами или без них, с матрицами или без них. – Tomis
Возможно, было бы лучше повторить его, чтобы включить слова «нормализованные координаты устройства». – Tommy
OpenGL предшествует DirectX на несколько лет, поэтому OpenGL, конечно же, не пытались отличить себя от DirectX. Ведущий разработчик DirectX Алекс Сент-Джон заявил, что решение Microsoft пойти на левую систему координат было «частично из личных предпочтений» и «произвольным выбором». –
Opengl определенно левша. Вы видите много руководств, указывающих на противоположное, потому что они отрицают значение z в матрице проекции. Когда конечные вершины вычисляются внутри вершинного шейдера, он преобразует вершины, которые вы передаете с клиентской стороны (правая координата) в левую сторону, а вершины затем передаются в шейдер и шейдер геометрии. Если вы используете правую систему координат на стороне клиента, Opengl не заботится. Он знает только нормализованную систему координат, которая левая.
Редактировать: Если вы мне не доверяете, просто поэкспериментируйте в своем вершинном шейдере, добавив матрицу перевода, и вы можете легко увидеть, является ли Opengl левым или нет.
- 1. PointerPressed: левая или правая кнопка?
- 2. Почему система координат нормализованного устройства левая?
- 3. Система координат/преобразования координат OpenGL или порядка ошибки
- 4. Система координат OpenGL ES 2.0
- 5. Система координат OpenGL ядра ядра ядра
- 6. jQuery keypress левая/правая навигация
- 7. Простая левая правая область прокрутки
- 8. Система координат [-1, 1]
- 9. Система координат Core Graphics
- 10. Система координат калибровки камеры MATLAB
- 11. Jquery левая и правая кнопка мыши listenier
- 12. верхняя левая и верхняя правая кнопки
- 13. SlidingTabLayout левая и правая набивка/маржа
- 14. Левая и правая прокрутка по изображению
- 15. Как решить, левая или правая рука на основе акселерометра телефона
- 16. Как определить - правая или левая клавиша мыши является основной?
- 17. Высота левая и правая сторона неровная - CSS
- 18. CSS Правая сторона переполнения Левая сторона
- 19. FBX SDK импортер и система координат LH в OpenGL
- 20. jQuery левая и правая прокрутка кнопки
- 21. Прокладка (левая, верхняя, правая, нижняя) в WPF
- 22. CSS выравнивание: левая и правая проблема
- 23. левая и правая в нескольких assingment
- 24. левая и правая анимация салфетки в tabActivity
- 25. vim левая и правая колонка выделить
- 26. jQuery простая левая и правая анимация
- 27. Ошибка компиляции: левая неоднозначная, правая неоднозначная
- 28. С jQuery mobile - левая правая прокрутка
- 29. Flex Slider Левая и правая стрелка Ограничение
- 30. правая координатная матрица для левой руки?
http://programmers.stackexchange.com/a/88776/12693 – Kos
Не зависит ли это от того, как вы пишете свои трансформации в шейдерах и, следовательно, полностью зависит от вас? – jcoder
Только мои два цента http://www.evl.uic.edu/ralph/508S98/coordinates.html, у него есть несколько самоочевидных изображений. – rraallvv