Моделирование водонепроницаемости в Box2D

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

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

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

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


person Lukman    schedule 15.01.2012    source источник
comment
Пробовали ли вы использовать уравнение перетаскивания? Термин площади поперечного сечения A будет меняться в зависимости от ориентации лодки относительно ее скорости, что должно делать то, что вы хотите. И вы всегда можете оценить A с помощью дешевой эвристики.   -  person    schedule 15.01.2012
comment
@Rahul, спасибо за подсказку. Я добавил уравнение сопротивления в код с некоторыми методами аппроксимации (например, используя зависимость скорости от угла лодки, чтобы определить опорную площадь). лодка сталкивается с границей мира. Я пытаюсь понять, что не так, прежде чем просить о дальнейшей помощи здесь. Еще раз спасибо за подсказку.   -  person Lukman    schedule 20.01.2012
comment
Нахальный обходной путь может состоять в том, чтобы создать множество очень маленьких круглых тел с небольшой массой, чтобы заполнить пространство вокруг лодки. Я не проверял жизнеспособность этого с точки зрения физики или вычислительной мощности (пока), поэтому я не представляю его как правильный ответ.   -  person Andrey    schedule 14.02.2012


Ответы (2)


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

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

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, но может быть более полезным для вас, так как он в формате учебника.

person Dan O    schedule 19.02.2012

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

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

person Fred    schedule 16.02.2012
comment
К сожалению, ИМО, эти частицы будут мешать другим физическим объектам, существующим в мире, поэтому я бы предпочел не использовать эту хакерскую технику. Спасибо за предложение. - person Lukman; 17.02.2012
comment
@Fred В конце концов я поиграл с этим, и это была огромная проблема с правильным балансом - либо круги были слишком большими и препятствовали всем движению, либо все это слишком нагружало мой процессор. Имейте в виду, я пробовал это на порте JS, который, как мне кажется, обычно немного медленнее. - person Andrey; 19.02.2012