ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 在零重力box2d世界中降低速度

2019-05-18 22:13:21  阅读:191  来源: 互联网

标签:android physics box2d rokon


我正在尝试创建一个在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

解决方法:

在身体上,你是对的.能量守恒应确保身体的速度保持不变.

但是,Box2D无法完美地代表物理学.每一帧都会有一个小错误,这些错误加起来.我不知道Box2D如何处理关节,但是如果它将对象的位置投射到圆上,这将导致框架中行进的距离略小于没有关节的情况.

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

标签:android,physics,box2d,rokon
来源: https://codeday.me/bug/20190518/1129822.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有