Преобразование объекта между двумя координатными пространствами - PullRequest
2 голосов
/ 01 февраля 2009

Итак, я читаю книгу «3D Math Primer для графики и разработки игр», пришедшую с нематематического фона, и я наконец начинаю понимать векторную / матричную математику - и это облегчение.

Но, да, всегда есть, но у меня проблемы с пониманием перевода объекта из одного координатного пространства в другое. В книге автор приводит пример стрельбы из пистолета в машину (изображение) , которая повернута на 20 градусов (просто 2D-пространство для простоты) в «мировом пространстве». Итак, у нас есть три пространства: Мировое Пространство, Пространство Объектов Оружия и Пространство Объектов Автомобиля - правильно? Книга тогда заявляет это:

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 01 февраля 2009

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

2 голосов
/ 01 февраля 2009

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

0 голосов
/ 01 февраля 2009

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

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

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

0 голосов
/ 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 преобразований для большого количества точек без существенного снижения производительности по сравнению с одним преобразованием для того же числа. точек.

0 голосов
/ 01 февраля 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...