Appearance
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);モードのオプション
auto—trueのとき、メッシュ形状からカプセルの高さと半径を 自動計算します(デフォルト)。height/radius— カプセルの高さ・半径(auto:falseのとき使用)。mass— 質量(kg)。デフォルトは1.0。friction/restitution/membership/filter/collisionDetection— SimplePhysicsモードと 同様です。
実戦的な使用例はTPSのサンプルプログラムを 参照してください(プレイヤーと敵の両方がDynamicCharacterモード です)。
詳細はAPIドキュメントを 参照してください。