読者です 読者をやめる 読者になる 読者になる

AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

エプロン合成後のボーンウェイトを調べる

ヤンデレちゃんにエプロンを合成したあとのボーン重みづけの状態を調べてみた。

エプロン合成前は頂点数6085のmesh(髪の毛を削除しているのでその分、標準Hモデルより少ない)

エプロン合成後は、6327頂点に増える
エプロンmesh自体は241頂点なので、丁度エプロンの分だけ頂点数が増えている。


bonesはSkinnedMeshのSkinnedMeshRendererが所有している。
boneWeightsは、mesh自体が所有している。
bindpossesは、meshが所有している。

合成後のSkinnedMeshに関して、boneWeightsを調べてみると

f:id:yasu9780:20170215175847p:plain
↑mesh自体は合成されているが、Spineボーンを動かすと、紐づけされていないエプロンは動かない。


boneWeightsの数は頂点数に一致するので、すべての頂点が、1~4種類のボーンに対する重みづけをもっているという仕様。


ある頂点に関して、以下のようにboneWeightが定義されていると、ボーン0に100%関連付けられ、他のボーンには0%なので、ボーン0の動きに対して100%この頂点は影響を受ける。
index0 = 0 weight0 = 1
index1 = 1 weight1 = 0
index2 = 2 weight2 = 0
index3 = 3 weight3 = 0


以下の定義では、ボーン0に50%、ボーン1に50%と定義されるので、ボーン0とボーン1の動きに50%づつ影響を受ける。
例えば、肘付近の服や肌は、上腕と前腕の影響を受けるように定義することで、うまく曲がっている(はず)
index0 = 0 weight0 = 0.5
index1 = 1 weight1 = 0.5
index2 = 2 weight2 = 0
index3 = 3 weight3 = 0

元の話に戻ると、頂点6086以下はエプロンのメッシュから合成された頂点と考えられるけど、それぞれのボーンの重みづけ状況を調べると
150/1 150/0 150/0 150/0
となっている。これは150番ボーンに100%重みづけられ、150番ボーンに0%、、150番ボーンに0%、、150番ボーンに0%と定義になっている。
ある意味矛盾した定義(´・ω・`)
しかもボーンは150個なので、おそらく最後のボーンに機械的に紐づけられているだけだろうと推測
150番ボーンはボーンヒエラルキー的に、おそらく右手の親指の末端ボーン。
なお、末端ボーンは動かしても影響がない。これが149ボーンだったら、右手親指を動かせば、エプロンが影響を受けるかもしれない


ということで、SimpleLODはSkinnedMeshの合成に対応とはあるが、おそらくボーン重みづけはなにもしてない
末端ボーンと紐づているが、重みを100%であり0%と定義されているので、事実上、ボーンの影響を受けない仕様。
元々、SkinnedではないただのMeshであるエプロンは重みづけ情報を持っていない。

広告を非表示にする