easy-three

load.bvh2

load.bvh2(url : String, vrm : VRM, props : Object) : { mixer, duration }

url - BVHファイルのURL。
vrm - VRM。
props - 設定オブジェクト。
  • effectiveWeight (Number) : ウェイト (デフォルト : 1)。
  • timeScale (Number) : タイムスケール (デフォルト : 1000)。
  • nameList (Array) : VRMボーン名のリスト。
  • idList (Array) : BVHボーン名のリスト。
  • onProgress (Function) : 読み込み進捗のコールバック関数。

BVH形式のアニメーションファイルを読み込み、指定したVRMモデルに適用します。
VRMモデルは、あらかじめ読み込んでおく必要があります。
戻り値は、mixerとdurationが格納されたオブジェクトです。
timeScale はアニメーションの分解能です。
mocopiで取得したBVHファイルを使用することを想定しています。
そうでない場合は、idListを変更する必要があるかもしれません。

load.bvhと違い、load.bvh2 は update に delta をそのまま渡すことができます。

nameListとidListの初期値は以下の通りです。

nameList = [
"head", "neck", "chest",
"spine", "hips",
"rightShoulder", "rightUpperArm",
"rightLowerArm", "rightHand",
"leftShoulder", "leftUpperArm",
"leftLowerArm", "leftHand",
"rightUpperLeg", "rightLowerLeg",
"rightFoot",
"leftUpperLeg", "leftLowerLeg",
"leftFoot"]

idList = [
"head", "neck_1", "torso_5",
"torso_3", "root",
"r_shoulder", "r_up_arm",
"r_low_arm", "r_hand",
"l_shoulder", "l_up_arm",
"l_low_arm", "l_hand",
"r_up_leg", "r_low_leg",
"r_foot",
"l_up_leg", "l_low_leg",
"l_foot"]

コードの例

BVHによるVRMモデルのアニメーション

const { camera, create, helper, load, controls, animate } = init()
create.ambientLight();
create.directionalLight();
camera.position.set(0, 1.5, -1.5);
controls.target.set(0, 1, 0);

controls.connect();

helper.axes();
helper.grid();

let model;
let mixer;

load.vrm("/easy-three/model/sample.vrm", {
  position: [0, -0.55, 0],
}).then((vrm) => {
  model = vrm;
  load.bvh2("/easy-three/motion/sampleMotion.bvh", vrm).then((_bvhObj) => {
    mixer = _bvhObj.mixer;
  });
});

animate(({ delta }) => {
  if (model && mixer) {
    mixer.update(delta);
    model.update(delta);
  }
});