在libgdx中,如何向box2d Body对象添加摩擦力?

3
我非常喜欢使用libgdx,它让我感到非常愉悦。但是,由于我对box2d很陌生,因此希望有比我更聪明的人能够帮助我。
我有一个简单的测试屏幕,其中一堆静态正方形瓷砖组成了地面,而一个动态物体(一个圆)则在周围反弹。
我想做的是增加地面的摩擦力,以便球不会滚动得那么多。就像地面是草而不是木头一样。
我在网上找到了一些东西,但似乎都不起作用。我尝试过最有前途的是这个:
tileBody.getFixtureList().get(0).setFriction(0.9f);

尽管看起来什么都没有发生。

阅读box2d文档建议我在最初定义对象时在fixture def上设置摩擦力:

FixtureDef fdef = new FixtureDef();
fdef.shape = wallshape;
fdef.density = 1.0f;
fdef.friction = 0.9f;

然而,这似乎也无法完全阻止球的滚动。

有没有更好的方法?我可以减少恢复系数,但这只会减少弹跳的程度,对吧?


1
我刚遇到了同样的问题,但我已经成功解决了。你确定球的摩擦力不是0了吗?如果球的密度很大,它也不会很快减速。我猜你可能已经忘记了这个问题,但也许这会帮助其他人。 - NathanTempelman
3个回答

3
    Body groundBody = world.createBody(groundBodyDef);  
    PolygonShape groundshape = new PolygonShape();  
    groundshape.setAsBox(30, 1.0f);   
    FixtureDef groundFixture = new FixtureDef();
    groundFixture.density=0.0f;
    groundFixture.shape = groundshape;
    groundFixture.restitution = .5f;
    groundFixture.friction=0f;
    groundBody.createFixture(groundFixture);
    groundshape.dispose();

这对我有用。只要接触地面的物体有摩擦力并且不是由暗物质构成,它们就会减速。


1

听起来更像是您想根据圆形物体当前接触的物体来改变其角阻尼。角阻尼会抑制物体的旋转,但不会对线性运动产生任何影响。您可以通过执行body->SetAngularDamping(aHighValueLikeSay2to5)来检查是否符合您的要求,并查看其效果。

如果看起来不错,那么您需要跟踪圆形物体何时接触到应该改变角阻尼的物体。您可以使用接触侦听器来实现这一点,它会给您提供BeginContact和EndContact通知。当您收到BeginContact事件时,如果接触是在您的圆形和应该影响滚动的某些物体之间发生的,则将计数器加1。在EndContact中进行相同的检查并将计数器减1。这将为您提供一个值,您可以随时检查以了解是否应更改角阻尼。


嗯...再读一遍你的问题,我觉得我可能走错了方向。你只是想让某些瓷砖表现得像冰面一样吗? - iforce2d
实际上,我正在尝试使它更像草地 - 球在草地上不会滚动得太多。 - Matthew Rathbone

0

我在cocos2d论坛中找到了一个答案。

http://www.cocos2d-iphone.org/forum/topic/17762

看起来在box2d中,圆形不受摩擦力的影响。

因此,为了正确地对圆形施加摩擦力,最好用多边形来近似圆形。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接