Java 在libgdx中,如何向box2d实体对象添加摩擦力?
我对libgdx非常感兴趣,喜欢使用它。然而,我是box2d的新手,所以我希望比我聪明的人能帮助我 我有一个简单的测试屏幕,一堆静止的方形瓷砖组成一个地板,一个动态的物体(一个圆)在地板上反弹 我想做的是增加地板的摩擦力,这样球就不会滚动那么多。好像地板是草而不是木头 我在网上找到了一些东西,但似乎都不管用。我尝试过的最有希望的事情是:Java 在libgdx中,如何向box2d实体对象添加摩擦力?,java,box2d,libgdx,Java,Box2d,Libgdx,我对libgdx非常感兴趣,喜欢使用它。然而,我是box2d的新手,所以我希望比我聪明的人能帮助我 我有一个简单的测试屏幕,一堆静止的方形瓷砖组成一个地板,一个动态的物体(一个圆)在地板上反弹 我想做的是增加地板的摩擦力,这样球就不会滚动那么多。好像地板是草而不是木头 我在网上找到了一些东西,但似乎都不管用。我尝试过的最有希望的事情是: tileBody.getFixtureList().get(0).setFriction(0.9f); 但它似乎什么也没做 阅读box2d文档建议,在最初定义
tileBody.getFixtureList().get(0).setFriction(0.9f);
但它似乎什么也没做
阅读box2d文档建议,在最初定义对象时,应在夹具def上设置摩擦力:
FixtureDef fdef = new FixtureDef();
fdef.shape = wallshape;
fdef.density = 1.0f;
fdef.friction = 0.9f;
然而,这似乎并没有阻止球滚动太多
有更好的方法吗?我可以减少恢复,但那只会让它停止反弹,对吗?听起来更像是你想改变圆体的角度阻尼,这取决于它当前接触的物体。角度阻尼将抑制身体的旋转,但不会对线性运动产生任何影响。您可以通过执行body->SetAngularDamping(aHighValueLikeSay2to5)并查看得到的效果来检查这是否是您想要的
如果这看起来不错,那么你需要跟踪圆什么时候接触到应该改变角阻尼的东西。您可以通过使用联系人侦听器来实现这一点,该侦听器为您提供BeginContact和EndContact通知。当您获得BeginContact事件时,如果您的圆圈与可能影响滚动的物体之间存在接触,请将计数器增加1。在EndContact中,执行相同的检查并减小计数器。这将为您提供一个值,您可以随时检查,以确定是否应更改角阻尼。我在cocos2d论坛中找到了一个答案 在box2d中,圆的形状似乎不受摩擦力的影响 因此,要正确地将摩擦力应用于圆,最好用多边形近似圆
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();
这对我有用。如果沿着地面移动的物体有摩擦力,并且不是由暗物质构成的,它们应该减速 嗯。。。再读一遍你的问题,我想我可能走错路了。你只是想让某些瓷砖表现得像冰面吗?事实上,我是想让它表现得更像草地——球不会在草地上滚动那么多。我只是碰到了同样的东西,我成功地让它工作了。你确定球上的摩擦力不是0吗?如果球的密度很大,它也不会很快慢下来。我想你可能已经忘记了这个问题,但也许这会帮助其他人。