利用Revolute Joint创建Motor
在上一篇中记录了如何创建Revolute Joint,现在在上一篇的基础上来修改Revolute Joint,使之变为一个Motor(动力装置,马达)。
主要代码:
var distanceBall:Ball = new Ball(10, new Point(300, 240), new Point(0, 0), new CircleSprite(), _container); var revRect:Rect = new Rect(20, 100, new Point(300, 240), new Point(0, 0), new RectSprite(), _container); var revCircle:Ball = new Ball(10, new Point(300, 150), new Point(0, 0), new CircleSprite(), _container); var massData:b2MassData = new b2MassData(); massData.mass = 0; revCircle.body.SetMass(massData); _revoluteJointDef.Initialize(revCircle.body, revRect.body, new b2Vec2(300/PhyOption.PHYSCALE,150/PhyOption.PHYSCALE)); //motor可用 _revoluteJointDef.enableMotor = true; //设置转动的速度,在此速度下,如果刚体无法越过其转动轨迹的最高点,则需要设置maxMotorTorque值更大。 _revoluteJointDef.motorSpeed = Math.PI / 3; //maxMotorTorque值设置多大与转动速度无关,此值越大说明在当前转动速度下能越过轨迹最高点越容易。 _revoluteJointDef.maxMotorTorque = 200; _revJoint = PhyOption.getInstance().world.CreateJoint(_revoluteJointDef) as b2RevoluteJoint; var distantJointDef:b2DistanceJointDef = new b2DistanceJointDef(); var pos1:b2Vec2 = new b2Vec2(); pos1.x = revRect.body.GetPosition().x; pos1.y = revRect.body.GetPosition().y + 50 / PhyOption.PHYSCALE; var pos2:b2Vec2 = new b2Vec2(); pos2.x = distanceBall.body.GetPosition().x; pos2.y = distanceBall.body.GetPosition().y; distantJointDef.Initialize(revRect.body, distanceBall.body,pos1, pos2); _distanceJoint = PhyOption.getInstance().world.CreateJoint(distantJointDef) as b2DistanceJoint;
先创建了一个球,用于创建一个Distance Joint。关键是第九到第十四行的设置。
1。要设置为Motor必须设置enableMotor为真。
2。设置转动的速度,单位是弧度每秒,此值直接反应转动的快慢。
3。设置最大的转矩,单位是焦耳,即力*距离,合力作用的距离所做的功的最大值。如果此值过小,则可能导致刚体无法越过其预期转动轨迹的最高点,此种情况下设置大的转动速度也无济于事,只能设置大的转矩。
具体的例子:
作者:ywxgod
E-mail:给我发邮件
出处:http://ywxgod.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
E-mail:给我发邮件
出处:http://ywxgod.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。