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

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

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

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

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

Или я далеко?

Ответы [ 5 ]

3 голосов
/ 20 мая 2011

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

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

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

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

2 голосов
/ 20 мая 2011

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

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

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

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

Аналогично,

Тяга скалярная.

Угол скаляра.

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

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

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

Так что, если i = [1, 0] и j = [0, 1], тогда

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

(4,65 и + 23,3 Дж) - вектор,

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

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

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

и

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

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

1 голос
/ 20 мая 2011

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

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

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

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

0 голосов
/ 20 мая 2011

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

d (mv) / dt = force(x)

и, следовательно, также легче подключить к черному ящику Runge Kutta Solver.

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

0 голосов
/ 20 мая 2011

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

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

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

...