我目前在libgx的java中使用box2d物理引擎,并且面临碰撞问题。问题是身体停止移动,在平坦的区域上出现碰撞点。我的工作方式是制造多个身体,每一个代表一个块,而这些块是并排的。看看这里的碰撞点:
物体不应该在这里碰撞,因为物体的Y坐标是相等的,它们的侧面也是相等的。
float PPM = 100;
float side = 45;
for (float i = start; i < end; i++) {
/**
* perlin noise for terrain
*/
def.type = BodyDef.BodyType.StaticBody;
float place = Maths.map(noise.noise(off, off), 0, 1, -10, 50);
if (place < 10) {
place = 0;
} else if (place < 20) {
place = side;
} else if (place < 30) {
place = side * 2;
} else if (place < 40) {
place = side * 3;
} else if (place <= 50) {
place = side * 4;
}
place += side / 2;
float posx = (i * side);
float posy = place;
float size = side / 2f;
def.position.set(posx / PPM, posy / PPM);
b = world.createBody(def);
shape.setAsBox(size / PPM, size / PPM);
fdef.shape = shape;
fdef.isSensor = false;
b.createFixture(fdef);
off += 0.01;
toSetLast = posx + side;
GrassBlock grass = new GrassBlock(b, new
Vector2(b.getPosition().x * PPM, b.getPosition().y * PPM));
//dirt under grass
for (float j = (place / side) - 1; j >= -1; j--) {
posy = j * side;
def.position.set(posx / PPM, posy / PPM);
b = world.createBody(def);
shape.setAsBox(size / PPM, size / PPM);
fdef.isSensor = false;
fdef.shape = shape;
b.createFixture(fdef);
DirtBlock dirt = new DirtBlock(b, new
Vector2(b.getPosition().x * PPM, b.getPosition().y * PPM));
addBlock(dirt.getLocation(), dirt);
}
addBlock(grass.getLocation(), grass);
}
发布于 2017-05-31 17:40:31
我相信你正在经历的是一个已知的短期的Box2D库。
有关此问题的另一篇文章,请参见什么会导致Box2D突然停止呢?。请参阅Box2D C++教程-幽灵顶点了解发生了什么以及您可以做什么来缓解这个问题.
基本上,使用一个链状的地面像纹理,而不是多边形(或在多边形之上),所以你的移动块实际上移动在链的顶部。这假设您所使用的java box2d实现的版本具有链形状,其中提供了“鬼顶点”支持。
在引擎盖下的细节.
从用户的角度看,链形状提供平滑,而在遮罩下,用来平滑的是边缘形状。边缘形状是通过两个特殊的额外顶点来完成的(除了预期的两个边)。当库评估一个链状和一个多边形(或一个圆)之间的接触时,它通过识别可能发生接触的链段来实现这一点。然后,将该链段转换为边,并将其额外的顶点设置为链中的相邻顶点。然后求出该平移的边与多边形(或圆)之间的接触。这在链状形状中会自动发生,并且在链状型态中没有选项可用来取得这种行为。
用户可以通过将链的所有段的边缘形状拼接在一起,并将所有边缘的额外顶点设置为逻辑上相邻的顶点,从而获得与链状形状相同的结果。然而,这比链形状使用的内存要多得多,并且要求用户编写更多的代码(至少对于具有两个以上顶点的链是这样的)。
发布于 2017-06-01 02:01:42
虽然Langholtz的答案已经很好,但我还有更多要补充的。
链点或鬼点是一般推荐的方法,但:
我建议用斜面来代替:-
我已经测试过(jbox2d) --它可以显着地减少小故障的影响。
这种方法的缺点是需要额外的顶点。
(例如4个顶点-> 8个顶点)
因此,它需要更多的计算能力。
因此,在实践中,我一般把所有的团体分成两组:
就我个人而言,我希望有一种简单的方式来使用链/鬼,正如 Langholtz所建议的那样。
https://stackoverflow.com/questions/44291644
复制相似问题