Я использую Farseer 3.5, который является симпатичным C # портом Box2D, так что опыт работы с любым из них актуален.
У меня есть планета (розовая), и я использую GravityControllerпоэтому у него есть гравитация.Это работает отлично.Я хочу добавить океан к его поверхности, используя BuoyancyController подобным образом.Например, центрируйте BuoyancyController в центре планеты и сделайте его радиус на 100 м больше радиуса планеты, чтобы равномерно покрыть всю планету 100 м "воды".Как только я это сделаю, я проведу рефакторинг BuoyancyController, чтобы использовать вектор гравитации планеты в любой заданной точке для направления плавучести, чтобы вы могли плавать над океаном под любым углом.
К сожалению, насколько я могу судить, BuoyancyController позволяет только указать AABB.Смотрите здесь:
// create southern ocean
var testOcean1 = new BuoyancyController(
new AABB(
new Vector2(100, -200), // position
100, // width
50), // height
0.5f, // density
2.0f, // linear drag
1.0f, // angular drag
new Vector2(1.0f, 0) // gravity direction
);
this.World.AddController(testOcean1);
// create northern ocean
var testOcean2 = new BuoyancyController(
new AABB(
new Vector2(100, 0), // position
100, // width
50), // height
0.5f, // density
2.0f, // linear drag
1.0f, // angular drag
new Vector2(1.0f, 0) // gravity direction
);
this.World.AddController(testOcean2);
Вот форк Farseer, который иллюстрирует этот класс: https://github.com/tinco/Farseer-Physics/blob/master/SourceFiles/Controllers/BuoyancyController.cs
Кто-нибудь знает о пользовательском контроллере или способе согнуть это для моих нужд?Математика физики становится немного тяжелой для чего-то подобного, поэтому в идеале я могу использовать готовое решение.Существует много портов Box2D на многих языках, и если ЛЮБОЙ из них имеет такое решение, то я могу портировать его сам, без проблем.
Вот как это выглядит сейчас.Области плавучести всегда являются AABB - не могут вращаться или создавать какие-либо формы за пределами основного прямоугольника.![enter image description here](https://i.stack.imgur.com/bg1wi.jpg)
Некоторые иллюстрации:
Если бы я мог просто вращать AABB, я мог бы, вероятно, заставить его работать, но это не идеально.![enter image description here](https://i.stack.imgur.com/VnMC1.jpg)
Мне действительно нужен способ сделать его кругом (центр с радиусом), а не AABB.Это было бы очень похоже на работу GravityController.![enter image description here](https://i.stack.imgur.com/ROjgi.jpg)
РЕДАКТИРОВАТЬ: 02/6/2018 К сожалению, не было никаких ответов на этот вопрос, поэтому я сталкиваюсь с возможностью, что мне может понадобиться написать это сам.Я в порядке, используя только многоугольники для фигуры, а не круги или другие фигуры, поэтому, если я могу реорганизовать метод ComputeSubmergedArea () для PolygonShape, чтобы сравнить его с любым другим многоугольником, а не только с областью AABB, это может быть уловкой.Кто-нибудь?
РЕДАКТИРОВАНИЕ 3/3/2018: я больше смотрю на код, и ComputeSubmergedArea, кажется, вычисляет затопленную область ниже линии.Эта линия, как правило, является одним краем AABB, но, возможно, я могу пройти в любой строке.Если это так, я мог бы реорганизовать BuoyancyController, чтобы использовать круг в качестве своей области, а не AABB, и когда что-то входит в него, передать касательную к краю круга в метод ComputeSubmergedArea.Это может сделать это!Он сломался бы, если бы область плавучести была очень мала, поскольку любая точка на его периметре рассматривалась как прямая линия, но в моем случае это будет приемлемо, поскольку планета и океан настолько велики, что прирассматривается как игрок.Некоторые многообещающие выводы: 1. http://www.box2d.org/forum/viewtopic.php?t=6250 2. http://box2d.org/forum/viewtopic.php?t=4068
РЕДАКТИРОВАТЬ 6-4-2018: Приближаясь ... ![enter image description here](https://i.stack.imgur.com/SuPMC.png)
РЕДАКТИРОВАТЬ 6-6-2018: все готово.Я написал это сам.Это было нелегко.![enter image description here](https://i.stack.imgur.com/eGcgO.png)