Skip to content

CarControlクラス

a3.CarControlは本格的な車の物理シミュレーションを行うクラスです。 Rapier物理エンジンのDynamicRayCastVehicleController (レイキャスト車両コントローラー)を使っていて、サスペンションの 伸び縮みやタイヤのグリップを含めた車の挙動を再現できます。 実際に遊べる例は カーレースサンプルプログラムを 参照してください。

使用例

CarControlは単体のオブジェクトではなく、Acerola3DGLTFの モデルに「組み込んで」使います。事前にa3.initPhysics()が 必要です。

js
const kart = await new a3.Acerola3D('kart.a3').ready;
const cc = new a3.CarControl(options);
kart.setTransformer(cc.trans);              // 車体の動きを差し替え
kart.getAction('default').motion = cc.motion; // タイヤの動きを差し替え
kart.setState('default');
view.scene.add(kart);

cc.transが車体(シャーシ)の位置・回転を物理演算で制御する Transformerで、cc.motionがサスペンションに合わせてタイヤの 表示を動かすMotionです。

運転の操作

運転は毎フレーム、以下のメソッドを呼んで行います。

  • cc.accelerate(force) — アクセル。正の値で前進、負の値で後退。
  • cc.steer(angle) — ハンドル。前輪の切れ角(ラジアン)。
  • cc.brake(force) — ブレーキ。
  • cc.reset(loc, quat) — 指定した位置・向きに瞬間移動して速度を ゼロにします。コースアウトからの復帰などに使います。

自動走行のサンプル

5秒ごとに前進・後退を切り替えて自動走行するサンプルです。 オプション(stk_kart)でシャーシの寸法・タイヤの位置や半径・ サスペンションの特性などをモデルに合わせて設定しています。

js
import * as a3 from 'a3js';

// stk_tux.a3のカート用の設定
const stk_kart = {
  mass: 10.0, // ブレーキの効きの調整のため
  chassisWidth: 0.7,
  chassisHeight: 0.5,
  chassisLength: 1.5,
  chassisOffset: {x:  0.0, y: -0.25,  z:  0.0 },
  wheelFrontYPosition: -0.05,
  wheelFrontZPosition: 0.40,
  wheelFrontAxleLength: 0.6,
  wheelRearYPosition: -0.00,
  wheelRearZPosition: -0.35,
  wheelRearAxleLength: 0.7,
  wheelFrontRadius: 0.1,
  wheelRearRadius: 0.15,
  wheelFrontWidth: 0.19,
  wheelRearWidth: 0.24,
  wheelFrontSuspensionRestLength: 0.26,
  wheelRearSuspensionRestLength: 0.25,
  wheelFrontSuspensionStiffness: 200.0,
  wheelRearSuspensionStiffness: 250.0,
  wheelFrontSuspensionCompression: 4.0,
  wheelRearSuspensionCompression: 4.0,
  wheelFrontSuspensionRelaxation: 10.0,
  wheelRearSuspensionRelaxation: 10.0,
  wheelFrontMaxSuspensionTravel: 0.05,
  wheelRearMaxSuspensionTravel: 0.05,
  aerodynamicDrag: 0.5, // 空気抵抗
};

await a3.initPhysics();
const view = new a3.Window(600,300);
const ground = await new a3.Acerola3D('/a3js/assets/stk_racetrack.a3').ready;
ground.setMode('SimplePhysics',{meshCollider:'tri_mesh',rigidBody:'fixed'});
view.scene.add(ground);

const kart = await new a3.Acerola3D('/a3js/assets/stk_tux.a3').ready;
const cc = new a3.CarControl(stk_kart);
kart.setTransformer(cc.trans);
kart.getAction('default').motion = cc.motion;
kart.setState('default');
view.scene.add(kart);
view.camera.setMode('Follow',{target:kart});

// 5秒ごとに前進・後退を切り替えて自動走行
let t = 0;
while (true) {
  t += await view.waitForRender();
  if (Math.floor(t/5)%2===0) cc.accelerate(8);
  else cc.accelerate(-8);
}

オプションを省略するとデフォルト値(シャーシ2×1×4mなど)が 使われます。全オプションは APIドキュメントを 参照してください。

注意点・コツ

  • スポーン位置は路面から少し浮かせる — シャーシのコライダーが 路面にめり込んだ状態で生成されると、貫通解消の力で勢いよく 弾き飛ばされます。シャーシの底面が路面より確実に上になる高さから 落として着地させてください。
  • 質量は10kg程度がおすすめ — RapierのDynamicRayCastVehicle Controllerは未完成なところがあり、質量が小さいとブレーキが うまく効きません。デフォルトのmass10.0にしてあります。
  • 空気抵抗(aerodynamicDrag — 空気抵抗がないと速度が いくらでも出てしまうため、速度の2乗に比例する空気抵抗を 設定できます。ただし大きくすると挙動が不安定になることがある ため、デフォルトは0(無効)です。

詳細はAPIドキュメントを 参照してください。