CrossRoad

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

Babylon.jsの中に鏡を置いてアバターを映してみよう

これは Babylon.js アドベントカレンダー 2023 の記事です。

Babylon.jsの公式ドキュメントを見ていたところ、Mirror Textureという機能を見つけました。これはPlaneを鏡のように使える機能です。

今回はサンプルコードの紹介と、踊っているアバターも表示できた例を紹介します。

使用した環境
・Babylon.js Playground (Babylon.jsのバージョンは5.71) ・Microsoft Edge ブラウザ :120.0.2210.77

1. 鏡を表示をするには

Babylon.jsのMirror Textureという機能を使います。

公式ドキュメントで紹介されています。

doc.babylonjs.com

Planeに対して、この辺りの処理を追加するとPlaneが鏡になります。

gist.github.com

ただし、何をミラー表示させるかの登録が必要です。

mirrorMaterial.reflectionTexture.renderList = [sphere];

このように、対象のメッシュを配列で登録する必要があります。

シンプルなサンプルコードはこちらです。

https://playground.babylonjs.com/#1YAIO7#730

このURLをクリックすると確認できます。

A mirror texture sample on Babylon.js

なお、Playgroundで表示されるBabylon.jsのバージョンを5.71にしてください。画面右上のWEBGL2と書いてある隣です。起動直後は6.34になっているのですが (2023/12/17現在) 、このバージョンだとMirrorTextureの以下の部分でnot functionというエラーがでます。

var reflector = new BABYLON.Plane.FromPositionAndNormal(glass.position, glassNormal.scale(-1));

Playgroundでは最新バージョンのBabylon.jsが使われるのですが、最新=まだエラー対応が不完全という状態がよくあります。そのため、確実に動いていたはずのサンプルコードが動かない時があります。

このような場合、バージョン変更することで動きます。

2. アバターを鏡に表示させてみる

上に書いた通り、鏡表示させる対象をリストに登録する必要があります。アバターの場合、複数のメッシュで構成されているので、それぞれまとめて登録します。

まず、こちらのサンプルコードから、踊っているアバターの3Dモデルを読み込む処理を使いました。
https://playground.babylonjs.com/#Z6SWJU#5

次に、このコードでメッシュ情報の読み込み処理を追加します。

gist.github.com

character_partに追加する対象ですが、今回はInspectorを開いて名前を確認しました。PlaygroundでInspectorを開いてメッシュ情報を確認するには、以下の[1], [2]の手順で進めます。

Showed inspector on Babylon.js

character_partsという配列をmirrorTextureの処理に追加します。

gist.github.com

上記の調整をした結果です。鏡の中でもアバターが踊っていることが確認できます。
Mirroring character animation on Babylon.js

これらを一通りまとめたコードがこちらです。

https://playground.babylonjs.com/#1YAIO7#729

3. おわりに

Babylon.jsは予想以上に色々な機能がありますね。また何か見つけたら紹介します。