Skip to main content

風船ヘッド

このチュートリアルでは、フェイストラッキングを使ってキャラクターの頭を風船のように膨らませます!

頬を膨らませて頭を大きくする。

ボーンのスケーリング​

キャラクターの頭を膨らませるには、要するにキャラクターのボーンをいくつか拡大する必要があります。Warudoのキャラクター(実際、あらゆるUnityアプリ/ゲームのキャラクター)には55本のボーンがあり、その一部は任意です。今回注目する頭のボーンは、ずばり「Head」と呼ばれます。ノードエディターに Set Character Bone Scale ノードを追加し、Bone を「Head」、Scale を1.1に設定しましょう。

ヒント

既定では、Scaleオプションを設定するとXYZの全軸が同じ値になります。これは均一スケーリングと呼ばれます。各ボーン軸を個別にスケーリングしたい場合は、Scaleオプション横の Uniform Scaling ボタンをクリックしてオフにできます。

Enterをクリックしてノードをテストします。キャラクターの頭が少し大きくなるはずです!

フェイストラッキングデータの読み取り​

頭のボーンをスケーリングする方法ができたので、次はいつスケーリングするかを決める必要があります。楽しいトリガーとして、頬を膨らませてみましょう!

頬を膨らませているかどうかを知るには、Get Character BlendShape ノードを使えます。ノードエディターに追加しましょう。

ここでの BlendShape オプションでは、頬を膨らませることに対応するブレンドシェイプを選びます。ARKit互換のキャラクターモデルなら、通常は「cheekPuff」または「CheekPuff」です。

ヒント

ARKit互換のキャラクターモデルがない、またはiPhoneで顔をトラッキングしていない場合は、頬を膨らませるブレンドシェイプやトラッキングデータはありません。その場合は、代わりに口を使うトリガーに変更できます。たとえば、「jawOpen」(ARKitブレンドシェイプのモデル)または「A」(VRMブレンドシェイプのみのモデル)で膨張をトリガーできます。

次のように Inspect Value ノードを使って、ブレンドシェイプの値を確認できます。

頬を膨らませてみてください。値が0(頬を膨らませていないとき)と1(膨らませているとき)の間で変化するはずです。

これでノードを接続する準備ができました。ブレンドシェイプの値を Set Character Bone Scale → Scale に接続すればよいだけですよね? ちょっと待って……。

Warudoがノード同士の接続を許してくれません! 何が起きているのでしょう? Get Character BlendShape → Value は小数を出力しますが、Set Character Bone Scale → Scale オプションはX、Y、Zの3つの数です! より形式的には、0~1の小数から ベクトル を作る必要があります。(ベクトルとは単に「複数の数」をかっこよく言った言葉です。)これには Scale Vector ノードを使えます。

このノードはVector3(X、Y、Zの3つの小数)とfloat(小数)を受け取り、スケーリングされたVector3を出力します。たとえば入力が(1, 2, 3)と5なら出力は(5, 10, 15)です。入力が(2, 2, 2)と0.5なら、出力は(1, 1, 1)になります。

ひとまず Vector3 オプションを(2, 2, 2)に設定して、上のようにノードを接続し、頬を膨らませたときにどうなるかを見てみましょう。

あれ、何も起こりません……? これはSet Character Bone Scaleノードが一度もトリガーされていないためです。ひとまず手動でトリガーしましょう。もう一度頬を膨らませ、今度は Set Character Bone Scale → Enter もクリックします。キャラクターの頭が大きくなるはずです!

しかし問題があります。頬を膨らませるのをやめて、もう一度 Set Character Bone Scale → Enter をクリックすると、キャラクターの頭がこのようになります。

ヒント

続きを読む前に、なぜこうなるのか推測できますか?

演算入門​

少し戻って、ここで何をしているか考えてみましょう。0から1までの小数である頬膨らませブレンドシェイプの値を取り、それを使って3つの数(2, 2, 2)をスケーリングしています。この3つの数の最大値と最小値は何でしょう?

最大値は(2, 2, 2)で、頭が元の大きさの2倍になることを意味します。しかし最小値は(0, 0, 0)で、頭が消えてしまうことを意味します! そのため、頬を膨らませるのをやめるとキャラクターの頭が消えるのです。

これを直すには、最小値が(1, 1, 1)になるようにして、キャラクターの頭が決して消えないようにする必要があります。どうすればよいでしょう? 各数に常に1を加えるのはどうでしょう。Offset Vector3 ノードを使えます。

Scale Vector3 → Vector3 を(1, 1, 1)に、Offset Vector3 → Offset を(1, 1, 1)に変更したことに注目してください。これで、頬を膨らませてEnterをクリックすると頭は大きくなり、頬を膨らませるのをやめて再びEnterをクリックすると元の大きさに戻ります。

なぜこれでうまくいくか、もう一度計算してみましょう。頬を膨らませたとき、最大値は(1, 1, 1) + (1, 1, 1) = (2, 2, 2)、最小値は(0, 0, 0) + (1, 1, 1) = (1, 1, 1)です。まさに欲しかった結果です!

On Update​

Set Character Bone Scaleノードを手動でトリガーするのは、私と同じくらい嫌だったでしょう。実際、キャラクターの頭を膨らませるたびにブループリントをクリックしてはいられません。ノードを自動的にトリガーする方法さえあれば……。待って、ある?

On Update ノードは、Warudoの実行中に毎フレームトリガーされるイベントノードです。たとえばWarudoが60 FPSで動いている場合、On Updateノードは毎秒60回トリガーされます。このノードのおかげで毎秒60回クリックせずに済みました。ふう。

ヒント

Set Character Bone Scaleノードの後にノードを追加して、頬を使ってさらに効果をトリガーできることを覚えておいてください! 頬を膨らませたときにキャラクターのブレンドシェイプを有効化するため、Set Character BlendShape ノードを追加してみましょう。ヒント:Set Character BlendShape → Target Valueは0から1までの小数なので、Get Character BlendShape → Valueを直接接続できます。

ボーンスケールのリセット​

これで配信中にこのブループリントを使ってキャラクターの頭を膨らませられますが、おそらくこの効果をずっと有効にしておきたくはないでしょう。無効化されたブループリント内のイベントノードはトリガーされないと知っているので、使いたいときだけブループリントを有効にし、後で無効にすることにします。

しかし小さな問題があります。ブループリントを無効にしたとき、頭のボーンスケールが(1, 1, 1)ではないかもしれません。その瞬間に頬を膨らませていたかもしれないのです! On Disable Blueprint ノードを使って修正しましょう。

On Disable Blueprintノードは、ブループリントが無効になったときにトリガーされる特別なノードです。これでブループリントを無効にすると、頭のボーンスケールが(1, 1, 1)にリセットされます。問題解決です!

フェイストラッキングデータの読み取りについて​

情報

このセクションは上級者向けです。ちんぷんかんぷんなら、遠慮なく飛ばしてください。

このチュートリアルでは、フェイストラッキングデータを読むために Get Character BlendShape ノードを使いました。しかし完全に正確ではありません。実際にはフェイストラッキングデータそのものを読んでいるのではなく、フェイストラッキングデータ によって 生成され、キャラクターに適用されたブレンドシェイプの値を読んでいます。これは微妙ながら重要な違いです。たとえばiFacialMocapからの生の cheekPuff ブレンドシェイプ値が0.5であっても、iFacialMocap Receiver → Configure BlendShapes Mappingで、キャラクターに適用される cheekPuff ブレンドシェイプを実質的に2倍して1.0にするよう設定しているかもしれません。その場合、頬を半分だけ膨らませても、キャラクターの頭は最大サイズまで膨らみます。また、Character → Motion Capture を無効にすると、頬を膨らませていてもキャラクターの cheekPuff ブレンドシェイプは常に0になります!

多くの場合はこれで問題ありませんが、実際のフェイストラッキングデータに依存したいなら、フェイストラッキングシステム用の Get Receiver/Tracker Data ノードを使うべきです。たとえば私はiFacialMocapを使っているため、Get iFacialMocap Receiver Data ノードと BlendShape List Get BlendShape ノードを使って、実際の cheekPuff ブレンドシェイプ値を取得できます。

この方法の欠点は、iFacialMocapを使っていない場合にこのブループリントが動作しないことです。利点は、キャラクターのブレンドシェイプに依存しなくなることです。キャラクターに cheekPuff ブレンドシェイプがなくても、頬を膨らませることをさまざまな楽しい効果のトリガーとして使えます!

最終更新日 2026.10.06