Back
Featured image of post 日本語で分かる!DynamicBone

日本語で分かる!DynamicBone

DynamicBoneを日本語で解説する

(記事のサムネイルはBlenderのレンダリング画像)

2021/03/19追記:本が出ました

 03/07にこの記事を公開したところ、たくさんの反応を頂きました。そして、その反応の中にはこの記事の内容に関する指摘もいくつか交じっており、はじめはその指摘を記事に追記することも考えていたのですが、途中でふと思い立って本を書くことにしました。――そうして書きあがったのがこの「DynamicBoneが日本語で分かる本」です。ちゃんと査読も依頼したので、今度こそ間違いのない内容に仕上がっています。無料で配布しているのでぜひ手に取ってみてください。
 つきましては、この記事の内容は信頼しないでください。一度世に出してしまった記事である以上、何も考えずに消したら消したで誤った情報を野放しにしてしまうことになりますから、記事自体は残しておくことにします。

ごあいさつ

 「Unityで物を揺らしたい……」「髪の毛やネクタイが揺れるバーチャル美少女になりたい……」そんな願いを叶えてくれる “DynamicBone” というアセットがあることをご存じですか?わたしはかなりご存じです。
 DynamicBoneはUnityを使う開発者の方ならほとんどの方がその名前を聞いたことのあるくらいポピュラーなアセットなのですが、DynamicBoneを購入していざ使おうとすると、すぐに日本語の詳細な解説が少ないことに気づくでしょう。――ということで、この記事ではわたしがある程度DynamicBoneを使い込んだ経験を基に、各種パラメータ等を日本語で解説しようと思います。(ただし、それぞれのパラメータをいじってみて(たぶんこうかな?)という憶測でドキュメントを意訳しているので、もしも誤りがあればご一報ください。)

環境

Unity2018.4.20f1
DynamicBone:Ver1.2.2

DynamicBoneコンポーネントの各種パラメータの意味と効果

Root

 読んで字のごとく、ルートボーンを指定するところです。“ルートボーン"は揺らしたいオブジェクトにウェイトで紐づいている一連のボーンの始まる、一本目のボーンです。ほかのパラメータを一生懸命設定しても、ここを設定しないと動きません。

Update Rate

 一秒間に何回揺れの演算を行い、それをボーンの動きとして反映するかを設定する項目です。値が大きくなるほど滑らかに、そして正確に動くようになりますし、小さくするほど負荷が小さくなります。

Update Mode

 演算の更新タイミングの設定項目です。上記のUpdate Rateに沿って毎秒n回更新されるNormal、物理エンジンであるPhysicsコンポーネントの制御に使われる「Physic Loop」と同期される?(憶測につき情報求む)Animate Physics、完全に独立した時間の流れを持つUnscaled Time、そして描画フレームと同期して更新される1Defaultの4種類があります。ドキュメントには「Defaultを推奨」と書かれているので、深い理由が無ければDefaultのまま触らないでおくのが良さそうです。

Damping

 「ルートボーンからボーンの階層が進むごとに、どれだけ動きが減衰するか」の設定項目です。Dampingの作用は言語化するのが難しいですが、上の図をご覧いただければ理解できると思います。

2021/03/08-20:00追記:“Dampingはボーンの階層に関係なく、ボーンツリー全体の勢いを減衰させているのでは?“というご指摘をいただきました。現在確認を進めております

Elasticity

 ボーンが動いたとき、それをもとの形に戻そうとする力の度合いです。ここで言っている「もとの形に戻そうとする力」は物体が動いているときに働く慣性ではなく、物体が動かされたあとに元に戻ろうとする弾性力のことです。(Elasticityは日本語に訳すと弾性力)
 0にするとボーンが動いた後もその形で固定されてしまい、1にするとそもそもボーンが動かなくなります。0.1~0.3の範囲に設定されることが多い印象です。

Stiffness

 「剛性」です。詳しいことは上の図を……と言いたいのですが、図にもある通り「おそらくボーンの動きに時間差をつけてオブジェクトの硬さを表現するのだろう」という仮説をこの記事の執筆にあたって検証したところ、本当にそうなのか自信を失ってしまいました。DynamicBoneのドキュメントにも’How much bone’s original orientation are preserved.'(≒ボーンの本来の向きからどのくらいの範囲まで逸することができるか)と書かれているので、なんだかディレイ説は正しくないような気さえします。ご存じの方がいればご一報ください。
 ただ、わたしがいろんな方の3Dモデルを見たり、自分で設定して上手くいった大抵の場合ではStiffnessのパラメータは基本的に0.01~0.05くらいの極端に小さい値が設定されるので、特にこのパラメータのことを意識する必要はないでしょう。

Inert

 「不活性」、ボーンを動かすのに必要な動きの量を指定します。閾値を指定するのか、それとも親オブジェクトの動きに設定値を乗算しているのかがイマイチ分からないやつなので、DynamicBoneのパラメータを調整するときはもっぱらDampingとInertをいじって理想の挙動に近づけていくのを延々と続けることになります。割とゼロでもなんとかなるときもあるのですが、シビアなメッシュ構造でややもすれば貫通してしまう、というときは思い切ってInertに0.8などの大きめの値を設定すると、ヒラヒラ感は失われてしまうものの、無理な加速度がかかってColliderを抜けてしまう現象を抑止できます。

Friction

 「摩擦」。2019年12月のVer1.2.1で追加された項目で、Colliderに衝突したときに摩擦を発生させることができます。今までこの項目にゼロ以外の値が入っているモデルを見たことが無かったので仕方なく検証したのですが、値が挙動にほぼ影響していないようだったので、やっぱりゼロのままでいいでしょう。

Radius

 Colliderに衝突する判定の大きさを設定します。ツイン/ポニーテールやケモ耳などのColliderがなくても問題ないものを揺らすときはこの項目はノータッチで大丈夫でしょう。反対にアクセサリーや前髪などの貫通の心配があるものを揺らすときは、後述のDistribをちゃんと設定してあげることで美しい動きと貫通耐性を両立できます。

Distrib

 上記のパラメータがボーンの階層が進むごとにどのように変化するかをグラフで設定できます。グラフの値は設定されている項目の値にそのまま乗算されます。Radius以外で使われることはあまりない印象ですが、一部のDynamicBoneを熟知している人たちはそれ以外の項目でもDistribを活用しているようです。

End Length

 一般的にFBXファイルにはボーンの終端位置の情報は格納されないので(出力時にリーフボーンを追加している場合のみボーンの終端位置が指定される)、DynamicBoneを設定すると長いオブジェクトの端にColliderの判定が生じなくて抜けてしまったり、揺れ方が不自然になってしまうことがあります。これを解決するための項目がEnd Lengthです。

……ですが、図で示したとおりEnd Lengthには「終端ボーンの角度が上のボーンと違っていると、終端位置もずれてしまう」というがあるので、結局はモデリングの段階でこの問題を意識しておく、というのが解決策になってしまいます。

End Offset

 ボーンが動いたとき、終端ボーンの下にさらにボーンを生成することで、設定した数値の分だけ揺れを増大させる。

Gravity

 ボーンの動きに関わらず、常に設定した数値の分だけ揺れを増大させる力を働かせる。

Force

 揺れではなく、ボーンそのものに強制的に設定した数値の力を働かせる。

Colliders

 「Size」に入力した値の数だけボーンと衝突して動きを止めるColliderを指定できます。Colliderについての詳しい解説はDynamicBone Colliderの項で。

Exclusions

 「Size」に入力した値の数だけ、ルートボーン以下にあるボーンツリーをDynamicBoneの演算の対象外に指定できます。しっぽの先にリボンを着けたり、ケモ耳の先にピアスを着けているときなんかに使う機能です。

Freeze Axis

 指定した座標軸の方向に働く力を無効化します。Colliderとぶつかったときに想定しない方向に動いてしまうようなときに。

Distant Disable/Reference Object/Distance To Object

 DynamicBoneが追加されたオブジェクトがカメラやプレイヤーから遠い場合に、自動的にDynamicBoneを無効化する設定。テクスチャミップマップに近い概念ですが、デフォルトでオフになっているので環境に合わせてオンとオフを切り替えて検証しながらどちらがいいか探る方がよさそうです。
 Distant To Objectで設定されたReference Objectからの距離に応じてDistant Disableの判定が行われ、Reference Objectが設定されていない場合はメインカメラからの距離で判定が行われます。

DynamicBone Colliderコンポーネントの各種パラメータの意味と効果

Direction

 「方向」。後述する設定項目Heightの値に応じてコライダーが伸びる向きを指定できます。

Center

 DynamicBone Colliderはコンポーネントが設定されたボーンの中心から発生するので、ボーンの構造によってはColliderが意図しない位置に出てしまう時があります。そのような場合Colliderの位置を調整するために、この設定を使います。

Bound

 読んで字のごとく、ボーンの動きをColliderの内側に制限するInsideと外側に制限する(普通に衝突判定を発生させる)Outsideが選べます。

Radius

 Colliderの大きさを設定します。

Height

 Colliderの長さを設定します。Colliderが伸びる方向はDirectionに依存します。

まとめ

 DynamicBoneの設定方法の解説記事はいくらかあるものの、ドキュメントの和訳は探したかぎり見つかりませんでした。それに、それぞれの設定項目も逐一検索すればある程度出てくるものの、やはり「この記事一本で全部の項目が分かる!」ということの恩恵は大きいと思って、この記事の執筆に踏み切りました。
 何箇所か自分の想定とドキュメントの内容が違っていて不安ですが、わたしはこういう解釈でパラメータを設定して上手くいっているので、本気でDynamicBoneを極めたい!という方でなければ、この記事を参考に設定して問題が起きることはないと思います。ただ、本当にDynamicBoneを極めた方で「おい!ここの項目、全然合ってないじゃないか!」というのを発見したら、ぜひTwitterのメンションなりメールなりでイルカの人までご一報ください。LMK.


  1. 例:60fpsの環境でUpdate Rateを30に設定している場合、2フレームごとに更新される。フレームレートがUpdate Rateを下回っている場合はフレームレートに従って更新されるため、過負荷時に自動的に演算負荷が低下する。 ↩︎

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy