Appearance
CarControlクラス
a3.CarControlは本格的な車の物理シミュレーションを行うクラスです。 Rapier物理エンジンのDynamicRayCastVehicleController (レイキャスト車両コントローラー)を使っていて、サスペンションの 伸び縮みやタイヤのグリップを含めた車の挙動を再現できます。 実際に遊べる例は カーレースサンプルプログラムを 参照してください。
使用例
CarControlは単体のオブジェクトではなく、Acerola3DやGLTFの モデルに「組み込んで」使います。事前に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は未完成なところがあり、質量が小さいとブレーキが うまく効きません。デフォルトの
massは10.0にしてあります。 - 空気抵抗(
aerodynamicDrag) — 空気抵抗がないと速度が いくらでも出てしまうため、速度の2乗に比例する空気抵抗を 設定できます。ただし大きくすると挙動が不安定になることがある ため、デフォルトは0(無効)です。
詳細はAPIドキュメントを 参照してください。