2015-10-29 2 views
3

Я учусь OpenGL от этого scratchpixel, а вот цитата из перспективной матрицы проекта главы:Почему камера по умолчанию имеет отрицательный конец оси z?

Камера точки вдоль мировой системы координат отрицательной оси г так, что, когда точка превращаются из мирового пространства (а затем позже от места камеры до места на экране), если точка находится слева от оси координат глобальной оси y, она также будет отображаться слева от оси y системы координат камеры. Другими словами, нам нужна ось x системы координат камеры, чтобы она указывала вправо, когда ось координат системы координат мира также указывает вправо; и единственный способ, которым вы можете получить эту конфигурацию, заключается в том, что камера смотрит вниз на отрицательную ось z.

Я думаю, что это как-то связано с зеркальным изображением? но это объяснение просто смутило меня ... почему координата камеры по умолчанию не совпадает с мировой координатой (как и любые другие 3D-объекты, созданные нами в openGL)? Я имею в виду, нам все равно нужно преобразовать координату камеры с матрицей трансформации (что бы мы ни захотели с настройкой отрицательного z, мы можем имитировать ее) ... зачем беспокоиться?

+0

, который предназначен только для матрицы проекции 'gluPerspective' ... если вы используете Identity вместо этого, тогда вы будете смотреть на направление Z + ... вы также можете построить свою собственную перспективную проекцию, обращенную к Z + или любой другой оси ... см. Http : //stackoverflow.com/a/28084380/2521214 и http://stackoverflow.com/a/21100338/2521214 – Spektre

ответ

4

Совершенно произвольно, что выбрать для направления z.

Но ваш выбор имеет большое влияние.

Одной из причин придерживаться пути GL-z является то, что отбраковка лиц будет соответствовать постоянным именам GL, таким как GL_FRONT. Я бы посоветовал просто бросить курить.

Перевернув знак только на одной оси, также переворачивается «четность». Таким образом, лицевое лицо становится задним лицом. Тест глубины znear становится zfar. Поэтому разумно выбрать один на ранней стадии и придерживаться его.

0

Что это за «камера», о которой вы говорите? В OpenGL нет такой вещи, как «камера». Все у вас есть две стадии трансформация цепь:

  1. вершина положение положение → viewspace (по видовому преобразование)
  2. viewspace позиция положения → clipspace (проекция преобразование)

Чтобы понять, почему по умолчанию OpenGL «смотрит вниз» -z, мы должны посмотреть, что произойдет, если оба шага преобразования «ничего», т.е. полное преобразование идентичности.

В этом случае все позиции вершин, переданные OpenGL, не изменяются. X отображает ширину окна, Y - к высоте окна. Все вычисления в OpenGL по умолчанию (вы можете изменить это) были выбраны в соответствии с правилами правой системы координат, поэтому, если + X указывает справа и + Y, то Z + должен указывать «вне экрана» для Правило правой руки должно быть последовательным.

И это все, что есть. Не снимать. Просто линейные преобразования и выбор использования правых координат.

+0

Вы пропустили преобразование вида. Что в GL также имеет «хорошие значения по умолчанию», но в остальном это довольно странно в z путем преобразования -1.1 в окно z 0..1. – starmole

+0

@starmole: Нет, я не пропустил это, потому что нет такой вещи, как «преобразование вида». То, что вы имеете в виду, вероятно, является перспективным делением, за которым следует отображение в пространстве NDC. Однако я сознательно отказался от этого, поскольку это не имеет отношения к проблеме OPs; в отличие от установки вершин (представление модели и проекция в фиксированной функции) отображение NDC находится вне контроля программиста; это просто происходит, и самое лучшее, что вы можете сделать, это установить диапазон значений глубины и область просмотра в пространстве окна; но существуют жесткие ограничения на ценности и их выбор; настолько строгий, что имхо не стоит обсуждать их – datenwolf

+0

Никакой атаки не предназначено. Я думаю, что это одна особенная вещь. В классическом GL вы можете свободно перевернуть z. Классический DX будет отображать представление z из клипа как личность. В GL можно было установить неправильный знак z, перевернув тест глубины. Не так в DX. Ваш ответ просто напомнил мне об этом и выборе по умолчанию. – starmole

1

По умолчанию да, это «правая» система (например, используется в физике). Ваш большой палец является осью X, указательным пальцем по оси Y, и когда вы делаете эти движения вправо, Z-точки (средний палец) к вам. Почему ось Z выбрана для отображения внутри/снаружи экрана? Потому что тогда X- и Y-оси выходят на экран, как в 2D-графике.

Но в действительности OpenGL не имеет предпочтительной системы координат. Вы можете настроить его, как вам нравится.Например, если вы делаете лабиринт, вы можете захотеть, чтобы Y вышел наружу/внутри экрана (и Z вверх), чтобы вы могли хорошо перемещаться в плоскости XY. Вы изменяете свои представления/перспективные матрицы, и вы их получите.

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