首页 > 解决方案 > Farseer/Box2D:BuoyancyController:将其设为多边形或圆形(矩形除外)?

问题描述

我正在使用 Farseer 3.5,它是 Box2D 的一个相当一对一的 C# 端口,因此任何一个方面的专业知识都是相关的。

我有一个行星(粉红色),我正在使用 GravityController 所以它有重力。这很好用。我想以类似的方式使用 BuoyancyController 在其表面添加海洋。例如,将 BuoyancyController 放在行星的中心,使其半径比行星的半径大 100m,从而用 100m 的“水”均匀地覆盖整个行星。一旦我有了这个,我将重构 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 - 不能旋转或制作超出基本矩形的任何形状。 在此处输入图像描述

一些插图:

如果我只能旋转 AABB,我可能会使其工作,但这并不理想。 在此处输入图像描述

我真正需要的是一种使其成为圆形(带半径的中心)而不是 AABB 的方法。这与 GravityController 的工作方式非常相似。 在此处输入图像描述

编辑:2018 年 6 月 2 日不幸的是,对此没有任何回复,所以我面临着我可能需要自己写的可能性。我可以只使用多边形来表示身体形状,没有圆形或其他形状,所以如果我可以重构 PolygonShape 的 ComputeSubmergedArea() 方法以与任何其他多边形进行比较,而不仅仅是 AABB 区域,这可能是诀窍。任何人?

编辑 6/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:接近... 在此处输入图像描述

编辑 6-6-2018:一切就绪。我自己写的。这并不容易。 在此处输入图像描述

标签: box2dfarseer

解决方案


推荐阅读