Box2dWeb의 회전 인터페이스로 소형차를 만들어 보았다
18882 단어 JavaScriptBox2dWeb
회전 이음매는 모터의 작용을 한다
이번 캡처.
트럭에 연결된 바퀴가 회전하다
트럭 이동
이번의 모든 소스 코드는
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);
Reference
이 문제에 관하여(Box2dWeb의 회전 인터페이스로 소형차를 만들어 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/teradonburi/items/72ca1409e1c1993e0622텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)