Я думал о публикации в Stack Overflow, но этот вопрос мне кажется слишком субъективным, поскольку я не могу придумать разумного технического объяснения выбора Microsoft в этом вопросе. Но этот вопрос беспокоил меня так долго, и проблема продолжает появляться в одном из моих проектов, и я никогда не видел попытки объяснить это:
OpenGL использует правую систему координат, где часть + Z мировой системы координат простирается к зрителю.
DirectX использует левостороннюю систему, в которой часть мировой координаты + Z простирается в сторону экрана от зрителя.
Я никогда не использовал API Glide , поэтому я не знаю, как он работает, но из того, что я могу собрать, он также использует левостороннюю систему.
Есть ли техническая причина для этого? А если нет, то есть ли какое-то концептуальное преимущество для конкретной системы координат? Почему один выбирает один над другим?
Ответы:
Я знаю, что это старый пост, но я видел, что на этот пост ссылаются, и мне не понравился тон выбранного ответа.
Поэтому я провел небольшое расследование!
Исходя из этого, я могу предположить пару вещей:
Поэтому мой вывод будет таким:
Когда им приходилось выбирать, они не знали стандарта, выбирали «другую» систему, а все остальные просто отправлялись на прогулку. Нет сомнительного бизнеса, просто неудачное дизайнерское решение, которое было принято, потому что обратная совместимость - это имя игры Microsoft.
источник
Я удивлен, что никто ничего не упомянул: OpenGL работает и в левой системе координат. По крайней мере, это происходит, когда вы работаете с шейдерами и используете диапазон глубины по умолчанию.
После того, как вы выбросили конвейер с фиксированной функцией, вы имеете дело непосредственно с «clip-space». Спецификация 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) просто не удосужились выполнить отрицание в своих матрицах проекции.
источник
Это чистая история. В древние времена ранние программисты в области пещерной графики считали поверхность обзора монитора (телетайп «stonetype») двумерной миллиметровкой. В математике и технике обычные соглашения для построения точек данных на миллиметровой бумаге: x = справа, y = вверх. И вот однажды, примерно через неделю после изобретения силиконового колеса, кто-то подумал о 3D-графике. Когда свеча этой идеи по какой-то причине загорелась над их головой, они решили добавить Z = от зрителя. (Ой, моя правая рука болит, просто воображая это.)
Они не знали, что когда-нибудь их далекие потомки станут инженерами, учеными, прекрасными художниками, коммерческими художниками, аниматорами, дизайнерами продуктов и т. Д. И найдут 3D-графику полезной. Все эти прекрасные современные люди используют правосторонние системы координат, чтобы соответствовать друг другу и более установленным математическим текстам и физическим соглашениям.
Глупо основывать трехмерную систему координат на поверхности дисплея. Это модель, которая имеет значение - треугольники, многоугольники и плоскости, описывающие дом, стул, избыточного веса зеленого людоеда или галактику. В настоящее время мы все проектируем и моделируем вещи для правосторонних систем XYZ, и делаем это с точки зрения мира модели, даже прежде чем думать о том, как она будет отображаться. В какой-то момент добавляется камера, возможно, созданная для того, чтобы летать сумасшедшими способами, и это невидимая инфраструктура, которая преобразует модель в пиксели, которые внутри ее кишечника должны вращаться с согласованными преобразованиями системы.
Просто чтобы добавить к путанице, некоторые графические библиотеки распознают, что ЭЛТ сканируют изображение сверху вниз, и поэтому имеют Y = вниз. Это используется даже сегодня во всех оконных системах и менеджерах окон - X11, fvwm, gtk +, Win31 API и т. Д. То, как новые 3D-системы с графическим интерфейсом, такие как Clutter, Beryl и т. Д., Имеют дело с Z, является отдельной проблемой от моделирования трехмерной графики. Это должно касаться только разработчиков приложений и дизайнеров GUI.
источник
Они оба по сути эквивалентны, так как одно может быть легко преобразовано в другое. Единственное преимущество, которое я могу найти для левосторонней системы, состоит в том, что, поскольку объекты находятся дальше от наблюдателя, в любом направлении (x, y или z) расстояние является более высоким значением. Но я понятия не имею, поэтому ли Microsoft выбрала одно из другого?
POV-Ray также использует левостороннюю систему коридора.
источник
Ведущий разработчик из DirectX (Direct3D и) Алекс Сент - Джон недавно прокомментировал , что. В статье об истории Direct3D он написал:
Источник: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/
источник
Нужно понимать, что ОГРОМНОЕ количество времени программиста было потрачено впустую на преобразование между левосторонней и правой системами координат, и еще больше времени программиста было потрачено на запоминание того, какая система была необходима в данный момент.
Все это прошло, когда правосторонние системы координат стали отраслевым стандартом.
Уже есть достаточно широко используемых систем координат, не удваивая число, вводя вопрос о вручении. См. Minkler & Minkler, «Аэрокосмические системы координат и преобразования» . Если вы занимаетесь аэрокосмическим бизнесом, например, симуляцией полета, вам НУЖНА эта книга.
Я предполагаю, что у Microsoft не было НИКАКОГО в проекте DirectX, который ничего не знал о отраслевых стандартах, не понимал, что там был отраслевой стандарт, и полагал, что это не имеет значения.
Другая возможность, что они знали, что правосторонние системы были отраслевым стандартом, и они сознательно сделали DirectX левосторонним, чтобы затруднить преобразование кода, использующего DirectX для использования OpenGL, не имеет значения. Если бы я обнаружил, что это действительно так, я бы счел необходимым начать новую и, предположительно, недолгую карьеру убийцы топоров в Редмонде.
источник
Для всех тех, кто считает, что правша или левша не имеют никаких преимуществ, вы абсолютно неправы. Правосторонность декартовых систем координат происходит от определения векторного перекрестного произведения. Для базисных векторов XYZ
u
,v
иw
,w = u X v
.Это определение имеет основополагающее значение для векторной математики, векторного исчисления и большей части физики. Предположим, что вы пытаетесь симулировать электромагнитные взаимодействия. У вас есть вектор магнитного поля
M
, и заряженная частица движется в этом поле со скоростьюv
. Каким образом ускоряется заряд? Легко - в направленииM X v
. За исключением того, что некоторые идиоты подумали, что было бы интересно сделать вашу систему отображения левой рукой, поэтому она ускоряется в направлении-M X v
.По сути, любое физическое взаимодействие между двумя векторными величинами определяется как правша, и поэтому всякий раз, когда вам нужно смоделировать это взаимодействие, вам лучше надеяться, что ваша графическая система правша, или вам нужно будет помнить, чтобы обходить отрицательные знаки в вся твоя математика.
источник
0,0,1
как идти вперед, и это левша, так что1,0,0 X 0,1,0
make0,0,1
левая рукаM X v
но считается, что магнитное полеM
направлено в противоположном направлении, потому что это псевдовектор. Вы можете использовать одни и те же уравнения в любой системе: единственное, что меняется, - это ваша интерпретация того, каким образом псевдовекторы «указывают». Собственные векторы, такие как ускорение, всегда будут работать одинаково в любой системе координат. en.wikipedia.org/wiki/Pseudovector#The_right-hand_ruleРеальный ответ на раннюю леворукость Direct3D гораздо менее зловещий, чем некоторые из вас предполагают. DirectX получил свое начало, когда Microsoft купила RenderMorphics еще в 1995 году.
В то время стандартным графическим текстом, используемым в офисах RenderMorphics, были «Принципы интерактивной компьютерной графики», разработанные Newmann и Sproul, которые делают все, используя левосторонние координаты. Это та же книга, которую я использовал в колледже. Глядя на код D3D, вы можете даже увидеть их, используя имена переменных, которые соответствуют уравнениям в книге.
Это не какой-то заговор Microsoft. Решение было принято еще до того, как Microsoft вошла в картину.
источник
Ни один из них в конечном счете не лучше другого - вы отображаете трехмерные координаты на двухмерную поверхность, поэтому третье измерение (которое фактически делает вещи трехмерными) можно выбирать произвольно, указывая на зрителя или на экран. В любом случае, вы будете проходить через матрицу 4х4, поэтому нет технической причины выбирать одно из другого. Функционально можно утверждать:
Вывод : существует некоторый консенсус для оси X, но для двух других можно аргументировать оба направления, получая две правосторонние и две левосторонние конфигурации, и все они имеют смысл.
источник
Интересен тот факт.
Direct3D (не DirectX - DirectX также охватывает ввод, звук и т. Д.) На самом деле не имеет левосторонней системы координат.
Он вполне способен поддерживать как RH, так и LH системы. Если вы посмотрите документацию SDK, вы увидите такие функции, как D3DXMatrixPerspectiveFovLH и D3DXMatrixPerspectiveFovRH. Оба работают, и оба производят матрицу проекции, которая может быть успешно использована с вашей системой координат выбора. Черт, вы даже можете использовать столбец-майор в Direct3D, если хотите; это просто библиотека программных матриц, и вы не обязаны ее использовать. С другой стороны, если вы захотите использовать его с OpenGL, вы обнаружите, что он также прекрасно работает и с OpenGL (что, возможно, является убедительным доказательством независимости библиотеки матриц от Direct3D).
Поэтому, если вы хотите использовать систему RH в своей программе, просто используйте версию -RH функции. Если вы хотите использовать систему LH, используйте версию -LH. Direct3D не волнует. Точно так же, если вы хотите использовать систему LH в OpenGL - просто glLoadMatrix матрица проекции LH. Ничто из этого не важно, и это далеко не та огромная проблема, которую вы иногда видите.
источник
Никаких технических преимуществ у обеих рук нет, это совершенно произвольно. Оба работают нормально, если вы последовательны.
Из-за преимуществ согласованности в идеале нужно просто «использовать то, что используют все остальные», но во многих случаях это довольно сложно, потому что на практике также нет подавляющего «предпочтительного» соглашения: обе руки широко используются. В лучшем случае, есть некоторая согласованность в определенных сообществах (например, OpenGL).
Поэтому я думаю, что основной ответ на этот вопрос таков: они выбрали то, что выбрали, потому что он чувствовал себя хорошо (без сомнения, у них был некоторый предыдущий опыт работы с этими руками), и не было особых причин не делать этого.
В конце концов, это не имеет большого значения - любой, кто серьезно хочет обменяться ресурсами / кодом с другими системами / сообществами, в любом случае должен быть готов к тому, чтобы иметь дело с преобразованием руками, потому что это факт жизни в 3D-графике.
источник
Предоставляя это как дополнительный материал к моему предыдущему ответу здесь. Из старой спецификации OpenGL 1990-х годов:
(источник: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).
Таким образом, поскольку ни D3D, ни OpenGL не навязывают никаких мер, реальный вопрос: почему люди считают это чем-то важным?
источник
Я не хочу говорить тебе, но «рука» набора координат на самом деле субъективна - это зависит от того, каким образом ты воображаешь, что смотришь на вещи. Например, из спецификации карты куба OpenGL: если вы представляете, что находитесь внутри куба и смотрите наружу, система координат является левой, если вы думаете, что смотрите снаружи, то это правая рука. Этот простой факт вызывает бесконечное горе, потому что для получения числового правильного ответа все ваши предположения должны быть непротиворечивыми, даже если локально не имеет значения, какое предположение вы делаете.
Спецификация OpenGL официально «нейтральна для рук» и делает все возможное, чтобы избежать этой проблемы, то есть перенести ее на программиста. Однако есть «смена руки» между координатами глаза и координатами клипа: в модели и пространстве глаза, в которых мы смотрим, в пространстве клипа и устройства, которые мы наблюдаем. Я всегда борюсь с последствиями этого, без сомнения, случайного осложнения.
Совместный продукт - наш друг, потому что он позволяет вам генерировать определенную правую или левую трехмерную систему координат из пары векторов. Но какая это рука, зависит от того, какой из этих векторов вы называете «Х».
источник
Я мог бы сказать, что отраслевой стандарт является неправильным с самого начала
Отраслевой стандарт координат на самом деле пришел от координат стола, когда люди рисуют на столе все, что является горизонтальной плоскостью. X - левый / правый, а Y - передний / задний, так что это просто делает Z восходящим, и это было рождено Правосторонней системой координат.
Но Вы знаете, что мы сейчас используем с экраном монитора. Это вертикальная плоскость. X все еще влево / вправо, но Y вместо этого вверх и вниз
Так что же может вызвать Правая система координат? Это заставляет + Z быть назад и -Z быть вперед Что, черт возьми, это? Вверх это +, а Вниз - Право + и Лево - НО Вперед - и Назад + ??? Это так глупо, если мы делаем игру таким персонажем, работающим в 3D мире, но нам нужно минус z, чтобы идти вперед. Вот почему программист игры больше всего ценит DirectX
Захватить стандарт, который пришел со стола, и использовать его на мониторе, во многом неправильно с самого начала. И теперь мы должны признать, что они, OpenGL и Industry, не правы. Они просто используют то, что, по их мнению, им будет удобно, но они не правы, а Правая система координат - это просто ненужное наследие, которое следует выбросить как можно быстрее.
источник