はじめに
今回はUnityでSkinned Mesh RendererのBounds範囲をモデルより一回り大きくする理由を紹介します。
↓Skinned Mesh Rendererの基本はこちらをご覧ください。


初心者はこの記事にたどり着かないと思うので飛ばし気味で行きます。
分からないことがあれば右上の所からブログ内検索してください。
Bounds範囲の確認方法
ヒエラルキーに適当な “変形がある” モデルを配置。
「メッシュ」のデータを選択。
するとBoundsという白い線で立方体の枠が表示されます。

変形 = シェイプキー or ボーンによる操作。
Skinned Mesh Rendererはこの2つの変形が行われるメッシュに対して必要になる設定。
なのでこの2つのいずれかの操作を行わないなら「Mesh renderer」で良い。
そして、この記事にたどり着いてない。

表示されない方は「ギズモ表示」を有効化してください。

インスペクターを確認。
Skinned Mesh Rendererを開くと「Edit Bounds」下に範囲の表示があります。

このBounds範囲は物体より小さい状態がNGとされてます。

では、なぜこれがNGなのかを見ていきます。
Bounds範囲が小さいと起こる問題
Bounds問題が分かりやすくなるように位置を調整。
あえてメッシュからズラします。

ここれカメラ(視点)の情報をおさらいします。
【カメラの描画範囲について】
・1つの場所から画角が決まっていて映す範囲が決まる
・前方と後方に描画範囲の限界を設けてそこを超えた先は描画しない

この画角と前方+後方描画範囲で作られた範囲が描画範囲です。


この描画範囲を表す台形の図を「視錐台」と言います
この描画範囲にBoundsが当たっていれば、そのメッシュは描画します。

このBoundsの立方体がカメラで表示されているとメッシュの表示が見えます。

Boundsの立方体が描画範囲から消えるとメッシュの表示が消えます。

↓動かすとこんな感じです。

Boundsの効果が分かったので「物体より小さい状態がNG」と言われてる理由を見ていきます。

これはズームすると分かります。
一定の所までズームするとモデルがあるのにBoundsが画面外に行くことがあります。
そして表示が消えます。

なので「Bounds」の立方体ば物体全体を覆う必要があります。


ただ… メッシュを覆う範囲ギリギリではNGです。
一回り大きくする必要があります。
一回り大きくする理由
Skinned Mesh Rendererは「変形」するメッシュに対して必要になる設定です。
なのでシェイプキーなどで変形操作が行われます。
この時、変形の形によっては… 初期Bounds範囲を超えることがあります。

キャラクターの体なども同様です。
わざとギリギリにBoundsを設定したモデルを用意。
腕を上げるとBoundsの範囲を超えます。

この状態で特殊な視点で見ると…
Boundsが範囲外になりモデルの一部が消えることがあります。

↓動かすとこんな感じです。


これがよくVRChatで問題となります。
なので… ポーズ変更などの変形を想定してBounds範囲は一回り大きくしてください。

ほかのモデルも同様。

以上が、Bounds範囲をモデルより一回り大きくする理由です。
大きすぎはNG
ではBoundsは大きければ大きいほど良いかと言われれば… そうではありません。

Boundsが大きすぎるとメッシュが画面外に行っても計算処理が入ります。
そして「描画負荷」を上げる原因になります。

↓このような状態だと、メッシュが画面内に無いのに余計な表示のための計算処理をします。

これを回避するためにも…
「”一回り大きく”がBoundsの最適解」とされてます。

ルートボーンがBoundsに与える影響
Skinned Mesh Rendererには「ルートボーン」という設定項目があります。
これは3DCGの計算に必要となる一番最初のボーンです。

Unityで見るならArmtureの直下にあるボーンです。

VRChatアバターの場合は大体「Hips」がルートボーンになります。

これを操作すると全体が回転します。


ゲーム開発ではルート指定用に足元(X,Y,Z = 0,0,0地点)に1つボーンを置くことがあります。
どのような構造にするかは… 郷に入っては郷に従いましょう。
このルートボーンを変えると「Boudnsの基準点」が変わります。

そしてルートボーンに設定したボーンを変形すると…
「ボーンの変形に合わせてBounds範囲も変化」します。
↓Bagボーンをルートにして動かした「Bagのモデル」の図。

なので、ボーンなどで動くVRChat向けアクセサリーなどを作った場合…
ルートボーンは「Hips」にしなくても良いです。
「アクセサリー」のルートボーンをそのまま使ったほうが上手くいきやすいです。

下手にルートボーンを「Hips」に揃えようとしすぎると…
Boudnsの基準点がズレて範囲設定が面倒なことになります。

もしルートボーンのHips統一をやるなら…
アバター全体の可動範囲を想定してBounds範囲を一括指定する形になります。

モノによっては余計なBounds範囲ができたりしますが…
手軽に管理できるのが魅力。

また今のパソコンの性能を考えると…
正直、Bounds範囲がちょっと余計に大きいぐらい普通に許されると思います。

ただアクセサリー製作者的には全てのアバターのHips状態に対処できません。

なので結局はアクセサリー単体から見た「ルートボーン」を設定しておくのがいいと思います。


…あとはどこで「形状を区切り」何を「親ボーンとする」かを決めるセンスの問題。
ボーンが無いモデルはルートボーン設定不要
ボーンが無いモデルの場合、ルートボーンは設定は不要です。

このようなモデルに無理やりルートボーン「Hips」を入れると…
位置がどうやっても動かせなくなります。

なのでボーンが無いモデルは「ルートボーン設定不要」です。

いろいろ難しいことを描きましたが…
結局はどんな形であれ
「Bounds範囲を“一回り大きく”設定」
これが行われていればなんでも良いです。

以上がBounds範囲をモデルより一回り大きくする理由です。
まとめ
今回はUnityでBounds範囲をモデルより一回り大きくする理由を紹介しました。
・Bounds範囲はヒエラルキーでSkinned Mesh Renderer設定のモデルを選択して確認
・表示されない方は「ギズモ表示」を有効化
・Bounds範囲がモデルより小さいと一定の視点でモデルが描画されないことが起こる
・Skinned Mesh Rendererの変形に対応するためBoudns範囲は一回り大きくする
・大きすぎると余計な描画負荷を増やす
また他にもUnityや3DCGについて解説してます。



ぜひ、こちらもご覧ください。
コメント