CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Babylon.jsでアニメーションの任意のフレームを検知して処理を作る方法

Babylon.jsにはアニメーションを実現する仕組みがあります。ソースコードでキーフレーム別に座標を書いてもよいし、Blenderなど別のツールで作ったアニメーションを再生させることもできます。

今回は後者のように、別のツールで作ったアニメーションの任意のタイミングをきっかけに別の処理を発生させる方法を整理しました。

1. AnimationGroupとmasterFrame

以前の記事でも紹介しましたが、AnimationGroupという方法があり、これを使うとキャラクターモデルに内蔵されているアニメーションを簡単に再生できます。

doc.babylonjs.com

しかし、このドキュメントではアニメーションの再生と停止方法は書いてあるのですが、任意のフレームを検出する方法は書いていません。

Babylon.js Forumで質問しようと思ったのですが、すでにforumでは同じ質問をしている人がいました。

forum.babylonjs.com

読んでいくと、masterFrameというプロパティを使うことで、任意のフレームのタイミングを取得できるようです。

animationGroup.animatables[0].masterFrame

2. masterFrameを使って、剣を振った途中のタイミングで光の軌跡を発動させる

前回の記事では、アニメーションと独立して光の軌跡が表示されていました。本来は炎の魔法剣を振って前方に剣が向いたあたりで光の軌跡が出ると、剣から衝撃波が出る雰囲気を表現できます。

A trailmesh example on Babylon.js Editorv4.2

これを実現するには、剣を振るアニメーションのフレームのタイミングで衝撃波を出す関数を呼ぶ必要があります。

色々悩んだ結果、ちょっと強引ですがUpdate()関数の中でフラグ管理することで実現できました。

gist.github.com

TrailMeshはSphereが付いています。これの大きさを上げて非表示にすることで、光の軌跡だけが高速で一直線に進むようにしています。

gist.github.com

試しに、物理判定を付けた岩を適当に配置してみました。

Swing motion and impulse shot

岩に対する演出ができてないので単に吹き飛ばしているだけ、細かい調整がまだですが、剣を振って衝撃波を出すところはできました。

3. おわりに

次回は、岩をバラバラにするとか、煙を出すなどの演出をもう少し作りたいと思います。