Преобразование объекта между двумя координатными пространствами

Итак, я читаю книгу «3D Math Primer For Graphics And Game Development», написанную в значительной степени не из математики. Я наконец начинаю понимать векторную / матричную математику, что является облегчением.

Но да, всегда есть но, у меня проблемы с пониманием перевода объекта из одного координатного пространства в другое. В книге автор приводит пример с стрельбой из пистолета по машине (изображение), которая перевернута 20 градусов (просто двумерное пространство для простоты) в «мировом пространстве». Итак, у нас есть три пространства: мировое пространство, пространство для объектов с оружием и пространство для объектов с автомобилями — правильно? Затем в книге говорится следующее:

"На этом рисунке мы представили винтовку, которая стреляет пулей в машину. Как показано координатным пространством слева, мы обычно начинаем со знания об оружии и траектории пули в мировом пространстве. Теперь представьте преобразование координатного пространства в соответствии с пространством объектов автомобиля, сохраняя при этом машину, пистолет и траекторию пули неподвижными.Теперь мы знаем положение пистолета и траекторию пули в пространстве объектов автомобиля. машину, и мы могли бы провести тесты на пересечении, чтобы увидеть, попадет ли пуля в машину и где".

И я следую этому объяснению, и когда я заранее знаю, что машина повернута на 20* градусов в мировом пространстве это не проблема - но как это перевести в ситуацию скажем когда у меня лучник в игре стреляет с горки вниз на кого-то другого? Я не знаю под каким углом там все смещено?

А пространство какого предмета здесь вращается? Мир или оружейное пространство? Да, как видите, я немного запутался.

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


person thr    schedule 31.01.2009    source источник


Ответы (5)


Вы должны прочитать, как изменить базу, и мыслить в векторе, а не массивы, но математические: P

person Andrea Ambu    schedule 01.02.2009

Раньше я был программистом игр, и я делал это время от времени. В конце концов, я отказался от использования углов. Для каждого объекта у меня был направленный вперед и восходящий вектор. Таким образом, вы можете получить направленный вправо вектор из векторного произведения. И все преобразования между пробелами становятся скалярными произведениями.

person Nosredna    schedule 31.01.2009

Вы понимаете, как представление о том, как координатные пространства и преобразования работают в 2D? Я считаю, что координатные пространства и преобразования намного проще визуализировать в 2D, прежде чем пытаться перейти в 3D. Таким образом, вы можете проработать сценарии «что, если» на бумаге, и это поможет вам просто понять основные концепции.

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

Вы должны понимать, что у автомобиля есть своя локальная система координат. Геометрия автомобиля определяется в терминах его локальной системы координат. Таким образом, длина автомобиля всегда простирается вдоль оси x в его собственной локальной системе независимо от его ориентации в Мире. Автомобиль можно ориентировать, преобразуя его локальную систему координат.

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

Это то, что очень трудно объяснить, не имея возможности рисовать визуальные сценарии, и мой гугл-фу не может найти хорошее описание основ.

person user21714    schedule 31.01.2009

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

Допустим, у нас есть два пространства A и B, в A вверх, вперед и вправо (0,1,0), (0,0,1) и (1,0,0) соответственно, а начало координат находится в нуле. это дает обычные левосторонние координаты xyz для A. Скажем, для B мы имеем u=(ux,uy,uz), f=(fx,fy,fz) и r=(rx,ry,rz) с началом координат o = (бык, ой, унция). Тогда для точки p = (x,y,z) в B имеем в A (x*rx + y*ux + z*fx + ox, x*ry + y*uy + z*fy + oy, x *rz + y*uz + z*fz + oz).

К этому можно прийти путем осмотра. Обратите внимание, что, поскольку правый, восходящий и прямой векторы для B имеют компоненты на каждой оси A, компонент некоторых координат в B должен вносить вклад во все три компонента координат в A, т. е. поскольку (0,1,0) в B равно (ux,uy,uz), тогда (x,y,z) = y*u + (еще что-то). Если мы сделаем это для каждой координаты, мы получим (x, y, z) = x*r + y*u + z*f + (кое-что еще). Если мы сделаем наблюдение, что в начале координат эти термины равны нулю, за исключением (каких-то других вещей), то мы поймем, что (какие-то другие вещи) на самом деле должны быть o, что дает координаты в A как x*r + y*u + z*f + o, то есть (x*rx + y*ux + z*fx + ox, x*ry + y*uy + z*fy + oy, x*rz + y*uz + z*fz + oz ) после расширения векторных операций.

Эту операцию также можно выполнить в обратном порядке, мы просто устанавливаем координаты в A и решаем уравнения, чтобы найти их в B. (1,1,1) в A равно x*r + y*u + z*f + o в B. Это дает три уравнения с тремя неизвестными и может быть решено методом уравнений. Я не буду объяснять это здесь... но вот ссылка, если вы застряли: ссылка

Как все это связано с вашим первоначальным примером пули и автомобиля? Что ж, если вы вращаете набор векторов вверх/вправо/вперед вместе с автомобилем и обновляете начало координат по мере перемещения автомобиля, вы можете перемещаться из мирового пространства в локальное пространство автомобиля и упрощать некоторые тесты. например, вместо преобразования вершин для модели столкновения вы можете преобразовать пулю в «локальное пространство автомобиля» и использовать локальные координаты. Это удобно, если вы собираетесь преобразовывать вершины автомобиля для рендеринга на графическом процессоре, но не хотите нести накладные расходы на чтение этой информации обратно для использования в физических расчетах на ЦП.

В других случаях это может сэкономить вам преобразование x точек путем преобразования трех точек и выполнения этих операций вместо этого, это позволяет вам комбинировать преобразования x на большом количестве точек без значительного снижения производительности по сравнению с одним преобразованием для того же количества точек.

person jheriko    schedule 01.02.2009

В игровой ситуации обычно вы не знаете, что машина повернута на 20 градусов как таковая; вместо этого ваша информация о местоположении автомобиля будет неявно содержать это знание. Таким образом, в этом двумерном примере вы должны знать координаты x,y центра автомобиля и вектор x,y, на который указывает автомобиль (обе части информации в мировом пространстве) - иначе вы не смогли бы нарисовать это. Эти две части информации — все, что вам нужно, чтобы найти матрицу для преобразования между мировым пространством и пространством объекта автомобиля. (И тогда человек мог бы посмотреть на эту матрицу в этом примере и сказать, о, смотрите, поворот на 20 градусов — но это не та часть информации, о которой вы обычно беспокоитесь в игре.)

Проблема пушки и машины может быть решена в любом из трех пространств. Итак, вопрос в том, в каком из них проще всего? Предположительно пространство пистолета устроено так, что пуля вылетает по оси X. Так что это легко перевести в любое из других пространств. 2D-автомобиль, вероятно, будет представлен в своем собственном объектном пространстве — может быть, в виде набора 2D-линий, 2D-пикселей или чего-то еще. Вы, конечно, можете перевести их в мировое пространство или пространство объектов оружия, но если вы решаете задачу в пространстве объектов автомобиля, вам вообще не нужно переводить их, так что это самый простой вариант для решения этой задачи.

Это что-то вроде теории относительности: с ее собственной точки зрения ни одно из пространств не вращается. Однако, в отличие от теории относительности, мы рассматриваем мировое пространство как привилегированную фиксированную систему отсчета. Таким образом, пространства моделей объектов поворачиваются, зеркально отражаются, масштабируются, перемещаются и т. д. по отношению к мировому пространству.

person Sol    schedule 01.02.2009