失重的Box2d世界中速度减小

5

我正在尝试在Box2D中创建一个绕静态物体轨道运动的动态身体。

我有一个零重力的世界,和一个连接两个物体的DistanceJoint。我已经从物体和关节中移除了所有摩擦和阻尼,并给动态物体施加了初始线性速度。结果是,物体开始绕着运动,但它的速度随时间减小 - 在没有摩擦的零重力环境中,这不是我所期望的。

我做错了什么吗?线性速度应该在每一步重新创建,还是可以委托给Box2D来完成这项工作?

以下是相关代码:

// positions of both bodies

Vector2 planetPosition = new Vector2(x1 / Physics.RATIO, y1 / Physics.RATIO);
Vector2 satellitePosition = new Vector2(x2 / Physics.RATIO, y2 / Physics.RATIO);


// creating static body

BodyDef planetBodyDef = new BodyDef();
planetBodyDef.type = BodyType.StaticBody;
planetBodyDef.position.set(planetPosition);
planetBodyDef.angularDamping = 0;
planetBodyDef.linearDamping = 0;

planetBody = _world.createBody(planetBodyDef);

CircleShape planetShapeDef = new CircleShape();
planetShapeDef.setRadius(40);

FixtureDef planetFixtureDef = new FixtureDef();
planetFixtureDef.shape = planetShapeDef;
planetFixtureDef.density = 0.7f;
planetFixtureDef.friction = 0;

planetBody.createFixture(planetFixtureDef);

// creating dynamic body

BodyDef satelliteBodyDef = new BodyDef();
satelliteBodyDef.type = BodyType.DynamicBody;
satelliteBodyDef.position.set(satellitePosition);
satelliteBodyDef.linearDamping = 0;
satelliteBodyDef.angularDamping = 0;

satelliteBody = _world.createBody(satelliteBodyDef);

CircleShape satelliteShapeDef = new CircleShape();
satelliteShapeDef.setRadius(10);

FixtureDef satelliteFixtureDef = new FixtureDef();
satelliteFixtureDef.shape = satelliteShapeDef;
satelliteFixtureDef.density = 0.7f;
satelliteFixtureDef.friction = 0;

satelliteBody.createFixture(satelliteFixtureDef);

// create DistanceJoint between bodies

DistanceJointDef jointDef = new DistanceJointDef();        
jointDef.initialize(satelliteBody, planetBody, satellitePosition, planetPosition);
jointDef.collideConnected = false;
jointDef.dampingRatio = 0;

_world.createJoint(jointDef);

// set initial velocity

satelliteBody.setLinearVelocity(new Vector2(0, 30.0f)); // orthogonal to the joint
2个回答

6

从物理上讲,您是正确的。能量守恒应该确保物体的速度保持不变。

然而,Box2D无法完美地表示物理。每一帧都会有一个小误差,并且这些误差会累加。我不知道Box2D如何处理关节,但如果它将对象的位置投影到一个圆上,这将导致在没有关节的情况下,在一帧中行进的距离略微小于它本来应该行进的距离。

底线:不合理地期望速度与起始速度完全相同,并且您需要进行补偿。根据您的需求,您可以手动设置每帧的速度,或者使用一个以星球为锚点的旋转关节,并带有电机。


谢谢您的解释!从计算机科学的角度来看,这确实很有道理,考虑到所有的舍入误差...我想我只是期望了纯物理 :) - Alex Gyoshev

0

尝试检查线性阻尼和角度阻尼的数值,并将它们设为零。这可能会解决问题。


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