Должен ли я использовать декартову (x и y) или полярную (угол и величина) систему координат для представления скорости?

Я программирую физическую игру. Кажется, я могу использовать 2 системы для хранения данных о движении персонажа:
A) компоненты x и y (декартовы координаты) B) компоненты скорости и направления (полярные координаты)

Кажется, мне нужно в конечном итоге выбрать одну из этих двух систем, потому что:
A) Обе они представляют одну и ту же информацию о векторе B) Это кажется избыточным и неэффективным. поддерживать оба

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

Я предполагаю, что разные модели подходят для разных типов игр. Но...
Какие компромиссы влияют на решение использовать декартову или полярную модель?
Когда одна модель становится громоздкой или многословно?

Или я заблуждаюсь?


person Pup    schedule 19.05.2011    source источник
comment
Небольшой совет по номенклатуре. Пара (x,y) (или, возможно, (v_x,v_y) в данном случае), взятые вместе, представляют собой двумерный вектор, выраженный в декартовых координатах, но каждый бит данных по-прежнему является масштабирующим фактором. Тяга и угол — это также два масштабатора, которые также объединяются в вектор, хотя и выраженный в полярных координатах. И у вас есть еще одна проблема: скорость имеет единицы (длина / время), а тяга имеет единицы силы (масса * длина / время ^ 2).   -  person dmckee --- ex-moderator kitten    schedule 05.06.2011


Ответы (5)


Предпосылка вашего вопроса немного странная. Величина плюс угол и сумма двух базовых компонентов — оба способа задать вектор в двумерном пространстве. В любом случае вы записываете 2 скаляра (т. е. у вас нет отдельной переменной для представления единичного вектора x). Выбор прямоугольных координат вместо полярных не меняет природу чего-либо с вектора на скаляр или наоборот.

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

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

В любом случае, грех и кос, вероятно, станут вашими друзьями. Просто помните, что в большинстве графических систем координат y-down положителен.

person ccoakley    schedule 19.05.2011

Вы запутались в разнице между векторами и скалярами.

Скорость вдоль оси x является скаляром.

Скорость по оси Y также является скаляром.

Когда вы объединяете эти два числа в один математический объект, этот объект является вектором скорости. Думайте об этом как о двухэлементном массиве: [x, y]

Сходным образом,

Тяга является скаляром.

Угол является скаляром.

Комбинация этих двух чисел представляет собой другой вид вектора скорости [тяга, угол].

Любая скорость, которая может быть выражена в вашей системе [x, y], также может быть выражена в вашей системе [тяги, угла].

Вы можете запутаться с «базисными векторами». В вашей первой системе координат базисный вектор — это вектор длиной в одну единицу, который указывает вдоль оси x или y. Таким образом, [1, 0] будет базисным вектором, равным одной единице по оси x, а [0, 1] будет базисным вектором, равным одной единице по оси y. Что интересно в базисных векторах, так это то, что любой вектор вообще может быть выражен как линейная комбинация базисных векторов.

Итак, если я = [1, 0] и j = [0, 1], то

(34,5 i + -4,45 j) — вектор,

(4,65 i + 23,3 j) — вектор,

и т. д. (если вы не знакомы с векторным сложением, просто погуглите, это просто)

Теперь вы можете подумать, что когда вы берете свое двумерное пространство и используете другую систему координат (например, полярные координаты, которые на самом деле являются вашими координатами тяги/угла), вы уходите от базисных векторов, но на самом деле это не так. Итак, для вашей системы координат тяги и угла ваши базисные векторы:

i = 1 единица положительной тяги или радиуса

и

j = 1 градус (или радиан) положительного угла

Любая возможная скорость по-прежнему является комбинацией i и j, ваших базисных векторов.

person eeeeaaii    schedule 19.05.2011
comment
Кроме того: просто чтобы вы знали, для 2-мерной игры полярные координаты могут подойти. Но для трехмерной игры вы должны быть осторожны, потому что трехмерные полярные координаты могут быть нечеткими. Во-первых, если я правильно помню, есть разные способы указания координат - во-вторых, я думаю, что вы можете столкнуться с проблемами с карданным замком: en.wikipedia.org/wiki/Gimbal_lock - person eeeeaaii; 20.05.2011

Эти два представления математически эквивалентны. Кроме того, преобразование одного в другое — это простая операция O(1). Так что имейте в виду, что это, вероятно, не решающее решение. Тем не менее, с точки зрения простоты использования:

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

Используйте возможности языка, чтобы помочь вам абстрагироваться от конкретного типа реализации. Например. Если вы используете Java, создайте интерфейс IPoint с соответствующими методами. Таким образом, вы можете выбрать реализацию или даже больше в соответствии с потребностями. Вы даже можете выбрать определенные части программы для работы с одной реализацией, а другие части с другими типами. Правильная архитектура сделает эти вещи невидимыми.

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

person davin    schedule 19.05.2011

То, что вы называете «скалярными величинами», на самом деле просто полярный вектор, верно? Таким образом, ваш вопрос касается не столько векторов vc скаляров, сколько декартовых и полярных систем координат. [x,y] и [theta,r] являются векторами.

Я не занимался физическим программированием, но в последний раз, когда я это делал, и это начало усложняться (моделирование рыбы, плавающей в трехмерном пространстве), мне было гораздо удобнее иметь дело с полярными координатами. Я работал с нуля над реализацией алгоритма, подобного boids, и мне показалось, что гораздо проще думать с точки зрения полярных векторов, особенно при работе в 3-х измерениях. Я также обнаружил, что использование тригонометрических функций (acos(), asin() и т. д.) чище, чем использование формул Пифагора, которые вы использовали бы в декартовой системе.

Но действительно ли вы кодируете вещи с такого низкого уровня?

person CharlieMezak    schedule 19.05.2011

Динамику системы обычно легче описать в рамках (точка, скорость). Действительно, «фундаментальное» ОДУ обычно описывается в этой системе:

d (mv) / dt = force(x)

и, следовательно, их также легче подключить к решателю Рунге Кутта «черный ящик».

Однако подойдет любая система благодаря каноническим преобразованиям.

person Alexandre C.    schedule 19.05.2011