我使用的是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 - 不能旋转或形成超出基本矩形的任何形状。
一些插图:
我真正需要的是一种使它成为圆形(半径为中心)而不是AABB的方法。这与GravityController的工作方式非常相似。
编辑: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