Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在libgdx中,如何向box2d实体对象添加摩擦力?_Java_Box2d_Libgdx - Fatal编程技术网

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

Java 在libgdx中,如何向box2d实体对象添加摩擦力?,java,box2d,libgdx,Java,Box2d,Libgdx,我对libgdx非常感兴趣,喜欢使用它。然而,我是box2d的新手,所以我希望比我聪明的人能帮助我 我有一个简单的测试屏幕,一堆静止的方形瓷砖组成一个地板,一个动态的物体(一个圆)在地板上反弹 我想做的是增加地板的摩擦力,这样球就不会滚动那么多。好像地板是草而不是木头 我在网上找到了一些东西,但似乎都不管用。我尝试过的最有希望的事情是: tileBody.getFixtureList().get(0).setFriction(0.9f); 但它似乎什么也没做 阅读box2d文档建议,在最初定义

我对libgdx非常感兴趣,喜欢使用它。然而,我是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吗?如果球的密度很大,它也不会很快慢下来。我想你可能已经忘记了这个问题,但也许这会帮助其他人。