Имитация водостойкости в Box2D - PullRequest
9 голосов
/ 15 января 2012

Я делаю игру, в которой игрок тащит лодку вокруг пальца.Я использую Box2D для физических аспектов игры.В частности, я использую b2MouseJoint, чтобы прикрепить событие касания к лодке, чтобы событие касания потянуло лодку.

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 февраля 2012

Это на самом деле не тривиальная вещь, поэтому на «полный» ответ можно надеяться. Здесь - ссылка на пример автомобиля в box2d.Посмотрите демораль этого джентльмена (третье демо в ролике наиболее актуально), и взгляните на его исходный код.Его симуляция немного более продвинута, чем то, что вам нужно сделать, поэтому, если вы поймете, как это работает, у вас не возникнет проблем при создании более простой версии.

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

if( needs_to_turn )
{
   // turn_direction will either be -1 (left) or 1 (right), boat_torque can be a constant to start with, but should probably be controlled by the user
   body.ApplyTorque(turn_direction * boat_torque);
}

if( needs_to_move )
{
   // facing_vector should be a vector pointing in the direction the boat is facing, the boat_force could be a constant, but again should be controlled by the user
   body.ApplyForce(facing_vector * boat_force);
}

Я закончу свой ответ еще одной ссылкой , на этот раз на соответствующий учебник.Это не так круто, как в сценарии действий dougk16, но может быть более полезным для вас, поскольку оно в формате учебника.

1 голос
/ 17 февраля 2012

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

Ой, кажется, кто-то уже предлагал это ... Извините.

...