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"]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);
}
});