box2d - 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 的方法。这与 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
解决方案
推荐阅读
- javascript - 如何在 Next.js 组件中使用 SVG 图像?
- android - 当 ListView 内部布局时,ProgressBar 不在 RelativeLayout 中
- java - 使用 REF CURSOR 通过 java 程序检索 ResultSet 会引发错误
- ios - 将 NSString 序列化为 JSON 字符串
- python-2.7 - 使用命名空间时如何导入函数?
- r - 如何将数值转换为内存中的标准化双精度,反之亦然?
- arrays - 如何检查数组中的数字是否包含在嵌套数组中?
- apache-spark - EMR 上的 PySpark(步骤/作业)无法连接到 AWS Glue 数据目录,但 Zeppelin 可以
- java - 不支持 Spring Boot 请求方法“POST”
- openlayers - 带有图标和文本的标记