利用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。设置最大的转矩,单位是焦耳,即力*距离,合力作用的距离所做的功的最大值。如果此值过小,则可能导致刚体无法越过其预期转动轨迹的最高点,此种情况下设置大的转动速度也无济于事,只能设置大的转矩。

具体的例子:

posted @ 2010-05-16 22:42  ywxgod  阅读(1442)  评论(0编辑  收藏  举报