Farseer / Box2D: BuoyancyController: сделать его многоугольником или кругом (кроме прямоугольника)? - PullRequest
0 голосов
/ 01 июня 2018

Я использую 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

Некоторые иллюстрации:

Если бы я мог просто вращать AABB, я мог бы, вероятно, заставить его работать, но это не идеально.enter image description here

Мне действительно нужен способ сделать его кругом (центр с радиусом), а не AABB.Это было бы очень похоже на работу GravityController.enter image description here

РЕДАКТИРОВАТЬ: 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

РЕДАКТИРОВАТЬ 6-6-2018: все готово.Я написал это сам.Это было нелегко.enter image description here

...