Farseer / Box2D:BuoyancyController:将它设为多边形或圆形(矩形除外)?

时间:2018-06-01 13:04:41

标签: box2d farseer

我使用的是Farseer 3.5,它是Box2D的一对一C#端口,所以两者的专业知识都是相关的。

我有一个行星(粉红色),我使用GravityController,因此它具有重力。这很有效。我想以类似的方式使用BuoyancyController在其表面添加海洋。例如,在行星中心的中心浮力控制器,使其半径比行星的半径大100米,用100米的水平均覆盖整个行星。"一旦我有了这个,我将重构浮力控制器,以便在浮力方向的任何给定点使用行星引力的矢量,这样你就可以以任何角度漂浮在海洋顶上。

不幸的是,据我所知,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

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

编辑6/3/2018: 我一直在查看代码,ComputeSubmergedArea似乎计算了一条线以下的淹没区域。那条线通常是AABB的一条边,但也许我可以传入任何一条线。如果是这样,我可以重构浮力控制器以使用圆作为其区域而不是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

0 个答案:

没有答案