我正在尝试创建一个在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
答案 0 :(得分:6)
从物理上讲,你是对的。能量守恒应确保身体的速度保持不变。
然而,Box2D无法完美地代表物理学。每一帧都会有一个小错误,这些错误加起来。我不知道Box2D如何处理关节,但是如果它将对象的位置投射到圆上,这将导致框架中行进的距离略小于没有关节的情况。
底线:期望速度与您的速度保持完全相同是不合理的,您需要进行补偿。根据您的需要,您可以每帧手动设置速度,也可以使用电机固定在行星上的旋转关节。
答案 1 :(得分:0)
尝试检查linearDamping和angularDamping数字并将它们设为零。这可能会解决问题