2つのオブジェクトをつなげるジョイントクラスについてメモがわりにまとめてみました。
- 回転ジョイント(b2RevoluteJoint) ... 重なったBody同士をつなぐ回転ジョイント(モーター機能あり)
- 距離ジョイント(b2DistanceJoint) ... 離れたBody同士をつなぐ回転ジョイント
- 滑車ジョイント(b2PulleyJoint) ... 一方を下げるともう一方が上がる動きをするジョイント
- スライドジョイント(b2PrismaticJoint) ... 軸に沿って移動するジョイント
- 歯車ジョイント(b2GearJoint) ... ギアのように、一方を回転させると、もう一方がそれに合わせて動くジョイント
- マウスジョイント(b2MouseJoint) ... マウスでドラッグする際に使用(「Box2DFlashAS3(2.0.1) マウスで動かす」参照)
1.回転ジョイント(b2RevoluteJoint)
モーター機能があり、アンカーを基準に回転させることができる。SOURCE:
var jd:b2RevoluteJointDef = new b2RevoluteJointDef(); //box var box:b2PolygonDef = new b2PolygonDef(); box.density = 1.0; box.friction = 1.5; box.restitution = 0.1; box.SetAsBox(10 / m_physScale, 10 / m_physScale); //bodyDef var bd1:b2BodyDef = new b2BodyDef(); bd1.position.Set(125 / m_physScale, 100 / m_physScale); var bd2:b2BodyDef = new b2BodyDef(); bd2.position.Set(175 / m_physScale, 100 / m_physScale); //body var body1:b2Body = m_world.CreateBody(bd1); body1.CreateShape(box); body1.SetMassFromShapes(); var body2:b2Body = m_world.CreateBody(bd2); body2.CreateShape(box); body2.SetMassFromShapes(); //joint var anchor:b2Vec2 = bd1.position; jd.Initialize(body1, body2, anchor); jd.motorSpeed = 3.0; jd.maxMotorTorque = 5000.0; jd.enableMotor = true; m_world.CreateJoint(jd);
プレビュー:
2.距離ジョイント(b2DistanceJoint)
2つのアンカーを設定することができる。アンカーを各bodyの座標と同じにすると一定の距離を保つ。SOURCE:
var jd:b2DistanceJointDef = new b2DistanceJointDef(); //circle var circle:b2CircleDef = new b2CircleDef(); circle.density = 1.0; circle.friction = 0.5; circle.restitution = 0.1; circle.radius = 10 / m_physScale; //bodyDef var bd1:b2BodyDef = new b2BodyDef(); bd1.position.Set(125 / m_physScale, 100 / m_physScale); var bd2:b2BodyDef = new b2BodyDef(); bd2.position.Set(175 / m_physScale, 100 / m_physScale); //body var body1:b2Body = m_world.CreateBody(bd1); body1.CreateShape(circle); body1.SetMassFromShapes(); var body2:b2Body = m_world.CreateBody(bd2); body2.CreateShape(circle); body2.SetMassFromShapes(); //joint var anchor1:b2Vec2 = bd1.position; var anchor2:b2Vec2 = bd2.position; jd.Initialize(body1, body2, anchor1, anchor2); m_world.CreateJoint(jd);
プレビュー:
3.滑車ジョイント(b2PulleyJoint)
4つのアンカーを設定する、内2つのアンカー(groundAnchor)は固定される。左右のバランスはratioで設定。左右の長さは以下の式のような関係性がある。
length1(anchor1-ground1) + ratio * length2(anchor2-ground2) = 一定の数
SOURCE:
var jd:b2PulleyJointDef = new b2PulleyJointDef(); //box var box1:b2PolygonDef = new b2PolygonDef(); box1.density = 1.0; box1.friction = 1.5; box1.restitution = 0.1; box1.SetAsBox(20 / m_physScale, 10 / m_physScale); var box2:b2PolygonDef = new b2PolygonDef(); box2.density = 1.0; box2.friction = 1.5; box2.restitution = 0.1; box2.SetAsBox(20 / m_physScale, 20 / m_physScale); //bodyDef var bd1:b2BodyDef = new b2BodyDef(); bd1.position.Set(100 / m_physScale, 100 / m_physScale); var bd2:b2BodyDef = new b2BodyDef(); bd2.position.Set(200 / m_physScale, 100 / m_physScale); //body var body1:b2Body = m_world.CreateBody(bd1); body1.CreateShape(box1); body1.SetMassFromShapes(); var body2:b2Body = m_world.CreateBody(bd2); body2.CreateShape(box2); body2.SetMassFromShapes(); //joint var ground1:b2Vec2 = new b2Vec2(100 /m_physScale, 20 /m_physScale); var ground2:b2Vec2 = new b2Vec2(200 /m_physScale, 20 /m_physScale); var anchor1:b2Vec2 = bd1.position; var anchor2:b2Vec2 = bd2.position; var ratio:Number = 1.0; jd.Initialize(body1, body2, ground1, ground2, anchor1, anchor2, ratio); m_world.CreateJoint(jd);
プレビュー:
4.スライドジョイント(b2PrismaticJoint)
モーター機能があり、一定方向に移動する。SOURCE:
var jd:b2PrismaticJointDef = new b2PrismaticJointDef(); //box var box:b2PolygonDef = new b2PolygonDef(); box.density = 1.0; box.friction = 1.5; box.restitution = 0.1; box.SetAsBox(10 / m_physScale, 10 / m_physScale); //bodyDef var bd1:b2BodyDef = new b2BodyDef(); bd1.position.Set(150 / m_physScale, 100 / m_physScale); //body var ground:b2Body = m_world.GetGroundBody(); var body1:b2Body = m_world.CreateBody(bd1); body1.CreateShape(box); body1.SetMassFromShapes(); //joint var anchor:b2Vec2 = bd1.position; var axis:b2Vec2 = new b2Vec2(0.0, -1.0); jd.Initialize(ground, body1, anchor, axis); jd.motorSpeed = 5.0; jd.maxMotorForce = 100.0; jd.enableMotor = true; m_world.CreateJoint(jd);
プレビュー:
5.歯車ジョイント(b2GearJoint)
2つのジョイントを歯車のように連動させることができる。動きの伝わり方はratioプロパティで設定。SOURCE:
var jd:b2GearJointDef = new b2GearJointDef(); var jd1:b2RevoluteJointDef = new b2RevoluteJointDef(); var jd2:b2RevoluteJointDef = new b2RevoluteJointDef(); var ground:b2Body = m_world.GetGroundBody(); //circle var circle1:b2CircleDef = new b2CircleDef(); circle1.density = 1.0; circle1.friction = 0.5; circle1.restitution = 0.1; circle1.radius = 30 / m_physScale; var circle2:b2CircleDef = new b2CircleDef(); circle2.density = 1.0; circle2.friction = 0.5; circle2.restitution = 0.1; circle2.radius = 10 / m_physScale; //bodyDef var bd1:b2BodyDef = new b2BodyDef(); bd1.position.Set(150 / m_physScale, 100 / m_physScale); var bd2:b2BodyDef = new b2BodyDef(); bd2.position.Set(195 / m_physScale, 100 / m_physScale); //body var body1:b2Body = m_world.CreateBody(bd1); body1.CreateShape(circle1); body1.SetMassFromShapes(); var body2:b2Body = m_world.CreateBody(bd2); body2.CreateShape(circle2); body2.SetMassFromShapes(); //joint var anchor1:b2Vec2 = bd1.position; jd1.Initialize(ground, body1, anchor1); var gjd1:b2Joint = m_world.CreateJoint(jd1); var anchor2:b2Vec2 = bd2.position; jd2.Initialize(ground, body2, anchor2); var gjd2:b2Joint = m_world.CreateJoint(jd2); //gear joint jd.body1 = body1; jd.body2 = body2; jd.joint1 = gjd1; jd.joint2 = gjd2; jd.ratio = circle2.radius / circle1.radius; m_world.CreateJoint(jd);
プレビュー:


コメントする