Android 零重力box2d世界中的速度递减

Android 零重力box2d世界中的速度递减,android,physics,box2d,rokon,Android,Physics,Box2d,Rokon,我试图在Box2D中创建一个围绕静态物体旋转的动态物体。 我有一个零重力的世界,还有一个连接两个身体的distance关节。我已经消除了身体和关节的所有摩擦和阻尼,并将初始线速度应用于动态身体。结果是物体开始绕轨道运行,但它的速度会随着时间的推移而减小——这在没有摩擦力的零重力环境中是不可能的 我做错什么了吗?是应该在每一步重新创建线速度,还是我可以将此工作委托给Box2D 以下是相关代码: // positions of both bodies Vector2 planetPosition

我试图在Box2D中创建一个围绕静态物体旋转的动态物体。 我有一个零重力的世界,还有一个连接两个身体的
distance关节。我已经消除了身体和关节的所有摩擦和阻尼,并将初始线速度应用于动态身体。结果是物体开始绕轨道运行,但它的速度会随着时间的推移而减小——这在没有摩擦力的零重力环境中是不可能的

我做错什么了吗?是应该在每一步重新创建线速度,还是我可以将此工作委托给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

实际上,你是对的。能量守恒应该确保物体的速度保持不变

然而,Box2D不能完美地表示物理。每一帧都会有一个小错误,这些错误加起来。我不知道Box2D是如何处理关节的,但如果它将对象的位置投影到一个圆上,这将导致在帧中移动的距离比没有关节时稍微小


一句话:期望速度保持与开始时完全相同是不合理的,你需要进行补偿。根据您的需要,您可以手动设置每帧的速度,也可以使用固定在行星上的带电机的旋转关节。

尝试检查线性阻尼和角度阻尼数字,并将其设置为零。这可能会解决问题

谢谢您的解释!当我们从计算机科学的角度考虑它时,它确实是有意义的,因为所有的舍入误差。。。我想我只是在期待纯物理:)