式姫で遊ぶ日記

ブラウザ3Dゲームを作る作戦その6: 軽量化

Load の軽量化

  • フィールド等のMMD以外のモデルデータは、glTF(GL Transmission Format) がおすすめだそうです(.gltf /.glb)。

.gltf はjson形式、.glbはバイナリ形式になっているそうで、どちらも同じようにThree.js 側から読み込めます。
なのですが他の形式と明るさが合わないので現在調査中。

  • VMDは長いループを作らなくてもThree.js 側のループ再生で違和感なく繋げられる(走り出し等もfadeInでつなげればいい)ので、走るモーションも最初から1ループ程度を切り出しておくと軽いデータにできます。

vmdについてモーションとセットにして使いそうなのは loopやフェードイン/アウト、再生速度(timeScale)などでしょうか。

var motionFiles = [
	{filePath : './vmd/walk/walk_short.vmd', 
	loop : THREE.LoopRepeat, fadeIn: 0.1, fadeOut: 0.1, timeScale: 1 },	
…省略
];

ループについては、はじめに actionを取り出す時点で

action.setLoop( motionFiles[i].loop );

で設定できます。一度だけ再生したいとき、終了時のポーズで止めたいときは clampWhenFinished を trueにすればよいようです(デフォルトはfalse でactionがセットされていないポーズになる)。

if (motionFiles[i].loop == THREE.LoopOnce){ action.clampWhenFinished = true;}

処理 の軽量化

  • モデルデータのメッシュ結合について

例えば今回使っているデータでは children にたくさんの家や木などが入っています。
[f:id:iwanabot:20200506031853p:plain:480]
木の幹同士、葉同士など同じマテリアルをblender などで結合すると軽くなるか試していたのですが、パーツの数がよほど多くない限り効果がないように思います。これも今は後回しになりそうです。

プレイヤーを増やしたときのネックになっていたのがRaycaster の処理でしたので、頭の水平2軸はもうやめて、足側も移動キーでX軸とZ軸のどちらかだけのRaycaster を出すようにしました。以前はプレイヤー毎5本でしたが、今はこれで常にY軸と足の片方の軸の2本なので比較的軽くなりました。