Skip to content

KinematicCharacterモード

プレイヤーやNPCなどのキャラクターを動かすためのモードです。 オブジェクトをカプセル型のコライダーで包み、Rapierの キネマティックキャラクターコントローラーで制御します。 使う前にawait a3.initPhysics();が必要です。

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

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

  • setPosition()で位置を指定して動かします(キネマティック= プログラム主導)。壁にめり込まない・段差を登る・斜面を滑らない といったキャラクター特有の処理はRapierがやってくれます。
  • 接地判定(isGrounded())が正確で安定しています。
  • 速度の情報が得られないため、 向きとアクションの自動制御setAutoDirection()/setAutoAction())は使えません。 周囲の剛体から押される相互作用が必要な場合も DynamicCharacterモードを使ってください。

キーボード操作には AvatarPositionControllerクラス がそのまま使えます。以下はロボットをW/A/S/Dキーで動かすサンプル です(キーが効かないときは一度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('KinematicCharacter');
player.setState('Walking');
player.setPosition(0,2,0);
view.scene.add(player);

// W/A/S/Dで移動、←→で回転、Spaceでジャンプ
// (キーが効かないときは一度3D表示部分をクリック)
view.setController(new a3.AvatarPositionController(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のとき使用)。
  • offset — コライダーと地面・壁との間に保持する最小隙間。 デフォルトは0.01
  • friction/restitution/membership/filter/ collisionDetectionSimplePhysicsモードと 同様です。

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