Box2dWeb의 회전 인터페이스로 소형차를 만들어 보았다

18882 단어 JavaScriptBox2dWeb
이번에는 box2dweb로 회전 인터페이스를 만듭니다.
회전 이음매는 모터의 작용을 한다
이번 캡처.
트럭에 연결된 바퀴가 회전하다
트럭 이동

이번의 모든 소스 코드는
test.html
<canvas id="canvas" width="600px" height="420px" style="background-color:#333333;"></canvas>

<script type="text/javascript" src="Box2dWeb-2.1.a.3.min.js"></script>
<script type="text/javascript">

    // Box2Dオブジェクトを取得
    var b2Vec2 = Box2D.Common.Math.b2Vec2 // 2Dベクトル
     ,  b2BodyDef = Box2D.Dynamics.b2BodyDef // Body定義
     ,  b2Body = Box2D.Dynamics.b2Body // Body
     ,  b2FixtureDef = Box2D.Dynamics.b2FixtureDef // Fixture定義
     ,  b2Fixture = Box2D.Dynamics.b2Fixture // Fixture
     ,  b2World = Box2D.Dynamics.b2World // 物理世界
     ,  b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape // 衝突オブジェクトの形状(ポリゴン)
     ,  b2CircleShape = Box2D.Collision.Shapes.b2CircleShape  // 衝突オブジェクトの形状(円)
     ,  b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef // 回転ジョイント
     ,  b2DebugDraw = Box2D.Dynamics.b2DebugDraw // デバッグ描画


    // 世界を作る
    var world = new b2World(new b2Vec2(0,10), true);

    /////////////////////////////

    var bodyDef = new b2BodyDef;
    bodyDef.type = b2Body.b2_dynamicBody;

    var fixDef = new b2FixtureDef;
    fixDef.density = 30;
    fixDef.friction = 10;
    fixDef.restitution = 0.1;
    fixDef.shape = new b2CircleShape(0.3);

    // 車輪1
    bodyDef.position.Set(8,10);
    var wheel1=world.CreateBody(bodyDef);
    wheel1.CreateFixture(fixDef);
    // 車輪2
    bodyDef.position.Set(12,10);
    var wheel2=world.CreateBody(bodyDef);
    wheel2.CreateFixture(fixDef);

    // 台車
    bodyDef.position.Set(10,9.5);
    fixDef.shape = new b2PolygonShape;
    fixDef.shape.SetAsBox(4,.5);
    var car = world.CreateBody(bodyDef);
    car.CreateFixture(fixDef);

    // 回転ジョイント
    var revoluteJointDef = new b2RevoluteJointDef();
    revoluteJointDef.Initialize(car, wheel1, wheel1.GetWorldCenter());
    revoluteJointDef.maxMotorTorque = 1100.0;// トルク力
    revoluteJointDef.motorSpeed = 3.0; // 回転速度
    revoluteJointDef.enableMotor = true; // モーターを有効化
    var revoluteJointA = world.CreateJoint(revoluteJointDef);

    revoluteJointDef.Initialize(car, wheel2, wheel2.GetWorldCenter());
    revoluteJointDef.lowerAngle = -Math.PI/2; // 可動範囲の最小値
    revoluteJointDef.upperAngle = Math.PI*5; // 可動範囲の最大値
    revoluteJointDef.enableLimit = true; // 可動範囲を可動有効化
    var revoluteJointB = world.CreateJoint(revoluteJointDef);

    // 地面
    var bodyDef = new b2BodyDef;
    bodyDef.type = b2Body.b2_staticBody;
    bodyDef.position.Set(-3,14);

    var fd = new b2FixtureDef;
    fd.shape = new b2PolygonShape;
    fd.shape.SetAsBox(20,1);

    var holder = world.CreateBody(bodyDef);
    holder.CreateFixture(fd);    

    /////////////////////////////


    // デバッグ描画の設定      
    var debugDraw = new b2DebugDraw();
    debugDraw.SetSprite ( document.getElementById ("canvas").getContext ("2d"));
    debugDraw.SetDrawScale(30);     //描画スケール
    debugDraw.SetFillAlpha(0.3);    //半透明値
    debugDraw.SetLineThickness(1.0);//線の太さ
    debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);// 何をデバッグ描画するか
    world.SetDebugDraw(debugDraw);

    window.setInterval(update,1000/60);

    function update() {
        world.Step(1 / 60, 10, 10); // 物理世界を更新する
        world.DrawDebugData(); // デバック描画
        world.ClearForces(); // 物理世界上の力をリセットする
    };

</script>
회전 커넥터용
b2 RevoluteJointDef 객체를 추가합니다.
var b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef // 回転ジョイント
회전 조인트를 만드는 곳은 다음과 같습니다.
객체의 Initialize 함수에서
연결할 트럭의 대상과 바퀴의 대상, 바퀴의 위치를 지정한다.
maxMotorTorque는 토크 파워
모터스피드는 모터의 회전 속도입니다.
EnableMotor를 True로 변환하여 모터를 회전시킵니다.
    // 回転ジョイント
    var revoluteJointDef = new b2RevoluteJointDef();
    revoluteJointDef.Initialize(car, wheel1, wheel1.GetWorldCenter());
    revoluteJointDef.maxMotorTorque = 1100.0;
    revoluteJointDef.motorSpeed = 3.0;
    revoluteJointDef.enableMotor = true;
    var revoluteJointA = world.CreateJoint(revoluteJointDef);
다음은 오른쪽 바퀴 설정입니다.
lowerAngle은 가동 범위의 최소값을 지정합니다.
upperAngle은 가동 범위의 최대값을 지정합니다.
enableLimit 회전 제한 사용
가동 범위를 초과하여 회전하면 회전이 멈춘다.
    revoluteJointDef.Initialize(car, wheel2, wheel2.GetWorldCenter());
    revoluteJointDef.lowerAngle = -Math.PI/2; // 可動範囲の最小値
    revoluteJointDef.upperAngle = Math.PI*5; // 可動範囲の最大値
    revoluteJointDef.enableLimit = true; // 可動範囲を可動有効化
    var revoluteJointB = world.CreateJoint(revoluteJointDef);
추가 1:
객체의 Initialize 함수에 대한 연결 객체
world.GetGroundBody()를 지정하면
물리적 세계 고정 회전revoluteJointDef.Initialize(world.GetGroundBody(), wheel1, wheel1.GetWorldCenter());
덤프트럭

추가 2:
도중에 모터를 반대로 돌리고 싶을 때
결과 회전 조인트 객체의 경우
SetMotorSpeed 함수로 음수를 입력하면
역회전
 revoluteJointA.SetMotorSpeed(-3.0);

좋은 웹페이지 즐겨찾기