MRが楽しい

MRやVRについて学習したことを書き残す

HoloLens用のオリジナルモデルを作成する その39(SpringBone を使って揺れ物の設定を行う)

本日はホロ恋子モデルの作成枠です。
今回からホロ恋子モデルに揺れ物の設定を行っていきます。
3d.nicovideo.jp
f:id:bluebirdofoz:20181107074851j:plain

揺れ物スクリプトの選択

揺れ物の設定を行うには、まず利用するスクリプトを決める必要があります。
現状、揺れ物を設定するために公開されているスクリプトは多数あり、公開元やライセンス、機能などが異なります。
代表的な4つのスクリプトをまとめてみました。

SpringBone

ricopin氏が公開しているスクリプトでUnityChanでも採用されているものです。
本家のスクリプトはユニティちゃんライセンスでもないため、再配布も容易です。
有名どころではプロ生ちゃんがこのスクリプトを含めたパッケージを公開しており、機能を配布パッケージ内で完結しています。
VRM の VRMSpringBone と実装が似ているため、設定値などが流用できます。VRChat では対応していません。
rocketjump.skr.jp

SpringBone 2.0

Unity Technologies Japanが公開しているスクリプトです。
最初、ユニティちゃんライセンスで公開される予定でしたが、揺れ物仕様の統一を目指し、MITライセンスで公開されました。
SpringBone に比べ、コライダー形状を球体以外で選べるなど様々な追加機能を持っています。
しかし、VRM や VRChat の有名どころではまだ採用されていないため、既存フォーマットへの流用に問題があります。
github.com

VRMSpringBone

VRM の揺れ物設定用スクリプトとしてドワンゴが公開しているスクリプトです。
SpringBone をベースアルゴリズムとしているようで、SpringBone と設定項目が似ており、設定値を流用できます。
UniVRM の一部なのでMITライセンスになります。
VRMSpringBone - dwango on GitHub
github.com

DynamicBone

Unity Asset Store で販売されている有料($20)のアセットストアです。
VRChat では、この DynamicBone が揺れ物スクリプトとして唯一利用が許可されています。
よって VRChat のアバターに揺れ物を設定する場合はこちらの利用が必須となります。
当然、DynamicBone のアセットを含めたパッケージの再配布はできず、パッケージ単体で機能を完結できなくなります。
assetstore.unity.com

ホロ恋子モデルは Unity パッケージ版と VRM ファイル版を作成しています。
今回は Unity パッケージ版には SpringBone を、VRM ファイル版には VRMSpringBone を設定してみます。

Spring Bone (Script) の設定

まずは Unity パッケージ版に Spring Bone (Script) を利用します。
Spring Bone (Script) はricopin氏が公開しているスクリプトで、以下ページのから取得可能です。
rocketjump.skr.jp
f:id:bluebirdofoz:20181107074916j:plain

以下の3つのスクリプトがダウンロードできます。
・SpringBone.cs
・SpringCollider.cs
・SpringManager.cs

Assets フォルダに全てのスクリプトをコピーします。
f:id:bluebirdofoz:20181107074930j:plain
※ 前述の通り、UnityChan パッケージやその他の公開パッケージにも SpringBone が含まれることがあります。
  同名のスクリプトがある場合はスクリプトの namespace に注意が必要です。

ホロ恋子のポニーテイルを揺らしてみます。
ボーン構造は4つのボーンで構成されており、1つ目のボーンは固定して2つ目以降の部分を揺らすことにします。
f:id:bluebirdofoz:20181107075007j:plain

揺らしたいオブジェクトに SpringBone をアタッチします。
ここでは以下のオブジェクトに SpringBone を設定しました。
・ponytail.002
・ponytail.003
・ponytail.004
f:id:bluebirdofoz:20181107075016j:plain

次に SpringBone コンポーネントの設定を行います。
SpringBone の各要素はそれぞれ以下の意味合いを持ちます。

Child    : 該当オブジェクトの子オブジェクトを指定する
BoneAxis : ボーンの方向を指定する
Radius   : 揺れ物の当たり判定の半径

StiffnessForce : 揺れの固さ(値を小さくするほど元の形に戻りにくくなる)
DragForce      : 力の減衰(値を小さくするほど抵抗が減る)
SpringForce    : XYZ軸ごとの補正値(オブジェクトのXYZ軸方向に値分の補正がかかる)

Colliders : 揺れ物との衝突判定を行うコライダーオブジェクト
Debug     : デバッグ時のエディター画面に当たり判定を表示

ダウンロードページを参考に以下の通り、値を入れてみました。
ponytail.004 の Child には ponytail.004_end を指定しています。
ponytail.004_end に SpringBone は設定していません。
f:id:bluebirdofoz:20181107075030j:plain

次にこれらのボーンを制御する SpringManager を追加します。
場所は何処でも構いませんが、分かりやすいように揺れ物の親ボーンである ponytail.001 に追加します。
f:id:bluebirdofoz:20181107075052j:plain

SpringBones の設定項目を開き、Size に SpringBone がアタッチされているオブジェクトの数を入力します。
Element が表示されるので SpringBone がアタッチされているオブジェクトを親から順番に設定します。
今回のケースでは ponytail.002 -> ponytail.003 -> ponytail.004 の順です。
f:id:bluebirdofoz:20181107075118j:plain

最後に衝突判定を行うコライダーオブジェクトを設定します。
ホロ恋子の頭部をポニーテイルが突き抜けるのを避けたいので、頭部にコライダーオブジェクトを設定します。

コライダー用の新規オブジェクトを右クリックの Create Empty で追加します。
頭部に追従するように、頭部ボーンの子オブジェクトとして作成します。
また、オブジェクトが頭部の中央に位置するよう Transform を調整します。
f:id:bluebirdofoz:20181107075128j:plain

オブジェクトに SpringCollider を追加し、Radius 変数に衝突判定の半径を設定します。
衝突したときに押し戻す力が働くため、判定は少し大きめにしておくと良いです。
f:id:bluebirdofoz:20181107075137j:plain

各 SpringBone の Colliders に作成したコライダーオブジェクトを指定します。
これで設定完了です。
f:id:bluebirdofoz:20181107075148j:plain

長くなったので、揺れ物の動作確認と VRM 側の設定は次回記事に分けます。