X, Y, Z согласовать стандарты?

12

Тем не менее, я довольно новичок в разработке 3D-игр. Читая учебные пособия и примеры, я обнаружил, что координаты X / Y / Z кажутся немного более обратными, чем мое первое предположение.

Я предполагал, что если человек будет ходить вокруг поля, его положение X / Y будет меняться, и если он будет прыгать или идти вверх или вниз по склону, то его положение Z будет меняться. Мои предположения кажутся неверными, потому что ходьба по полю, кажется, меняет X / Z, а прыжки или подъем / спуск по склону изменяют Y.

1) Верны ли мои наблюдения? 3D является новым для меня, и я, возможно, не думаю о вещах должным образом.

2) Какова логика горизонтального движения - X / Z, а вертикального - Y?

3) Было бы так неправильно с моей стороны использовать X / Y как горизонтальное движение и Z как вертикальное движение в XNA Framework?

Кори Огберн
источник
Системы координат левой / правой руки. DirectX - левая рука, по умолчанию в OpenGL - правая рука.
Джонатан Коннелл

Ответы:

19

Ваши предположения не ошибочны: каждый движок обрабатывает эти координаты по-своему. Вообще говоря, X - это почти всегда ось Восток-Запад, но имеет ли значение Y или Z ось Высот. Насколько я понимаю, у Quake 3, Source Engine и Torque есть Z как вверх. Как и инструмент моделирования 3DS Max. Это не редкость.

Имеет смысл иметь систему координат, которая упорядочена примерно в порядке убывания важности, чтобы упростить понимание представления в меньшем количестве измерений. Например, если ваша игра установлена ​​на двухмерной карте высот, имеет смысл, чтобы Z был «вверх», потому что тогда ваши координаты X и Y на трехмерной карте мира прямо соответствуют координатам X и Y на карте высот. С другой стороны, если вы думаете в первую очередь с точки зрения рендеринга (как это делают многие разработчики игрового движка), вы привыкли к тому, что X и Y являются координатами экрана, поэтому добавление третьей оси естественным образом входит или выходит из экрана.

Используйте то, что проще для вас, но помните, что любой выбор является произвольным и что вам может потребоваться выполнить преобразование между ними и использовать несколько систем координат в одной программе.

Kylotan
источник
На самом деле мне больше нравятся два других ответа, но поскольку это общепринятый ответ, обратите внимание на то, что Y - вертикальный, а Z - экран, - это способ работы большинства аппаратных API-интерфейсов 3D (DirectX и OpenGL). , Если вам нужна собственная система, просто помните об этом, так как может потребоваться перевод. (То, что используется неправильно, но последовательно, может часто работать по желанию, поэтому «может быть» :))
Джеймс
1
Технически, OpenGL имеет Z, выходящий из экрана по умолчанию, когда вы указываете направление, поэтому, хотя он и DirectX имеют Z параллельно направлению просмотра, они по-прежнему несовместимы! При работе с 3D вам необходимо уметь переходить из одной системы координат в другую посредством поворотов, перемещений и масштабирования - действительно, именно так модели оказываются в мире - поэтому нет особого смысла привязываться к какому-либо понятию стандарт.
Kylotan
Просто указав на это, когда имеешь дело с миллионами треугольников, может быть, чем меньше нужно делать для борьбы с аппаратной системой координат, тем лучше;) В конце дня создание игр - это весело, несмотря на уровни стресса. Делайте то, что хотите: )
Джеймс
Понятие «Z» как вход / выход из экрана или высота над уровнем моря несколько вводит в заблуждение. Возможно, было бы проще осмыслить трансформации. Мы представляем координаты вершин 3D / 4D, которые в конечном итоге преобразуются в пространство 2D-окна, но с глубиной. Идея о том, что API по сути отображает трехмерные координаты X, Y или Z на «глубину», не совсем верна - вы можете придумать любое преобразование, которое меняет смысл координат. В конце этого преобразования вы все равно получите координаты пространства 2D-окна и значение глубины.
PatrickB
1
Я не совсем уверен, где мы не согласны с остальными: конечно, вы можете использовать любое пространство координат, какое захотите, до тех пор, пока вы можете проецировать на x, y, глубину в конце, но этот вопрос в первую очередь о том, почему существуют определенные соглашения для систем координат, и соглашения неизбежно связаны с концепциями реального мира.
Kylotan
6

Представьте себе, что вы видите лист бумаги, протянутый перед вами, с диаграммой на нем, оси обычно обозначены буквой X внизу, а Y вверх по вертикали; это оставляет Z быть внешней осью вдоль земли.

Это просто соглашение, но оно широко используется в графике, где мы думаем о Z как о глубине сцены.

В других областях, таких как CAD, ваша версия будет более распространенной.

Патрик Хьюз
источник
4

Идея состоит в том, что оси x и y остаются неизменными - y на экране «вверх», а x поперек.

z - третье измерение, проецируемое обратно на экран (здесь игнорируются проблемы с руками). В 3-х измерениях это становится немного странным, но для позиционирования объектов на экране имеет больше смысла.

3) Можно, если хочешь, но было бы больно и неуклюже. Я бы посоветовал просто привыкнуть к Z-проектам в / из-за монитора.

Коммунистическая утка
источник
1

1) Да, ваши наблюдения верны.

2) Стандартная глобальная система координат XYZ имеет смысл, когда вы мыслите с точки зрения шутера от первого лица, когда вы смотрите глазами персонажа на сцене с пустой (идентичной) матрицей преобразования. Как и при рисовании системы координат на листе бумаги, X указывает вправо, а Y указывает вверх. Согласно правилу правой руки (x-> большой палец, y-> указательный палец, z-> средний палец), Z указывает на вас.

3) Это не было бы неправильно, но это было бы отклонением от стандартов. На данный момент я могу представить себе три проблемы: (a) Допустим, однажды вы захотите использовать физическую библиотеку, которая использует стандартную систему координат. Если вы не следовали стандарту, теперь вам нужно подумать о преобразовании, которое переносит вас из вашего мира в мир физики. Может стать раздражающим, когда вы хотите исправить ошибку. (б) Если вы хотите поделиться с кем-то кодом или привлечь кого-то для помощи в разработке, они должны привыкнуть к вашему соглашению. (c) При использовании стандартных 3D-моделей вы всегда должны иметь трансформацию над ними, чтобы они не смотрели вбок.

Теперь, чтобы добавить к вопросу 2, очень полезно думать о X, Y и Z как о не только трех буквах, но и как о правильном, вверх и назад. К каждому персонажу в сцене привязана локальная система координат, и в своих локальных системах координат X всегда прав, Y - вверх, а Z - назад. Если у вас есть это, теперь вы можете разобраться с векторами, которые вы распечатываете, или написать свои алгоритмы так, чтобы это имело смысл. Допустим, у вас есть два символа A и B, и вы хотите что-то сделать, если один из них смотрит на другого. Вы можете просто найти местоположение B в системе координат A (Ta ^ -1 * p_b), посмотреть на полученный вектор и посмотреть, отрицательно ли Z (назад), а X (справа) и Y (вверх) малы, потому что этот вектор говорит вам, сколько назад, вправо и вверх B относительно A.

Газихан Аланкус
источник