Skip to content

DynamicCharacterモード

KinematicCharacterモードと同じく キャラクター用のモードですが、こちらはカプセルコライダーを dynamicな剛体として物理演算します。 使う前にawait a3.initPhysics();が必要です。

js
await a3.initPhysics();
player.setMode('DynamicCharacter');

このモードの特徴は以下の通りです。

  • setLinearVelocity()で速度を指定して動かします。重力も物理演算で かかります。
  • 物理演算の剛体なので、周囲の剛体を押したり押されたりする 相互作用ができます。
  • 速度の情報が得られるので、 向きとアクションの自動制御setAutoDirection()/setAutoAction())が使えます。
  • 接地判定はKinematicCharacterモードより不正確です。安定した 接地判定が必要ならKinematicCharacterモードを使ってください。

キーボード操作には AvatarVelocityControllerクラス がそのまま使えます。以下はロボットをW/A/S/Dキーで動かすサンプル です。setAutoAction()も有効にしてあるので、動き出すと自動で アニメーションが切り替わります。赤い箱を押すこともできます (キーが効かないときは一度3D表示部分をクリックしてください)。

js
import * as a3 from 'a3js';

await a3.initPhysics();
const view = new a3.Window(600,300);

const ground = await new a3.GLTF('/a3js/assets/grass-ground2.glb').ready;
ground.setMode('SimplePhysics',{meshCollider:'tri_mesh',rigidBody:'fixed'});
view.scene.add(ground);

const player = await new a3.GLTF('/a3js/assets/RobotExpressive.glb').ready;
player.setScale(0.5,0.5,0.5);
player.setMode('DynamicCharacter');
player.setPosition(0,2,0);
// 速度に応じてアクションを自動切り替え(このモデルのアクション名に合わせる)
player.haltActionName = 'Idle';
player.walkActionName = 'Walking';
player.runActionName = 'Running';
player.setState('Idle');
player.setAutoAction(true);
view.scene.add(player);

// W/A/S/Dで移動、←→で回転、Spaceでジャンプ
// (キーが効かないときは一度3D表示部分をクリック)
view.setController(new a3.AvatarVelocityController(player));
view.camera.setMode('Follow',{target:player,lookFrom:{x:0,y:2,z:-4}});

// ぶつかると押せる箱(dynamic)
const box = new a3.Box('red');
box.setMode('SimplePhysics');
box.setPositionNow(0,1,3);
view.scene.add(box);

モードのオプション

  • autotrueのとき、メッシュ形状からカプセルの高さと半径を 自動計算します(デフォルト)。
  • height/radius — カプセルの高さ・半径(auto:falseのとき使用)。
  • mass — 質量(kg)。デフォルトは1.0
  • friction/restitution/membership/filter/ collisionDetectionSimplePhysicsモードと 同様です。

実戦的な使用例はTPSのサンプルプログラムを 参照してください(プレイヤーと敵の両方がDynamicCharacterモード です)。

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