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

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

エプロンの各頂点から一番近い既存の頂点を探す

エプロンを切り出してmeshとして保存した段階で、もともと持っていたボーンとの重みづけは失われている。
ならば、エプロンの各頂点から一番近い重みづけをもっている頂点を探して、その重みづけをコピーすれば
エプロンは、身体の動きに応じて曲がるようになるのではないか?という仮定のもとに、
まず一番近い頂点と、その重みづけデータをとってみた。
いきなりやると重いので、まずは100頂点で調べた。


f:id:yasu9780:20170215193225p:plain


頂点探すために、6000回ループを100回やるので、C#にとってはなかなか重い。
(あらかじめ頂点のY座標でソートなどしていれば、バイナリーサーチで早くできる)

全頂点に対し、一番近い頂点を探して重みづけをコピーした。

使用前

f:id:yasu9780:20170215175847p:plain

使用後

曲がった! エプロンが曲がった! ( ;∀;)
f:id:yasu9780:20170215200753p:plain

あとはsharedMeshをAssetに保存してやれば永続的に使える('ω')

一部、下のセーラー服が見えてたりするので、改良の余地はあるが、ぴったりした服を重ねて着せる場合など活用できるはず。
現在は合成頂点番号を決め打ちしているので、skinnedMeshとmeshを合成して重みづけまで変更するようにすれば、汎用性が出る。
というか、これってアセットストアで売れるかも?('ω')

少なくともこの人の要望には応える

https://forum.unity3d.com/threads/simplelod-generate-lod-levels-and-combine-skinned-meshes.282127/page-7#post-2580607

蹴りモーション

蹴りモーション実行中。エプロン下部はスカートの重みづけがコピーされていることが分かる。
スカートがめくれるとエプロンもめくれてる
細かく見ると荒も見えるけどおおむね満足できる。
f:id:yasu9780:20170215203129p:plain

足ボーンとの紐づけはない

もともスカート自体が、大腿部のボーンと紐づいてないので、足を動かしても、重みコピーされた状態のエプロンも動かない。
アセットに付属のモーションで、歩行でスカートが揺れるのは、GenericAnimationとしてスカート揺れもモーションが追加されるため。
HumanoidAnimationであればスカートは揺れないので、足がスカートを突き破る。

f:id:yasu9780:20170215205033p:plain


blenderの重みづけ自動がどういうアルゴリズムか分からないけど、各頂点から近いボーンを4つピックアップして、距離に応じて割合を案分してやれば
自動ウェイト機能が作れるのではないだろうか。
これをやれば、おそらくスカートボーンに100%重みづけがあるスカートの頂点が、足の動きに連動するはず。

これはちょっと想像するとかなり難しそう。
たとえば、右大腿部の頂点は、右大腿部ボーンや右膝ボーンと重みが欲しいが、いくら近くても左膝ボーンとの重みづけは欲しくない。
しかし、場所によっては、右大腿部より左ひざの方が近い頂点があるかもしれない。近いかどうかでは限界がある。面が繋がっているかどうかも考慮しないといけない。
空間距離ではなく、面上での距離。UV距離といってもいいかもしれないが。
情報としては頂点と三角形の情報があるのだから、経路をたどっていけば、面上との距離は算出できるだろう。
オープンソースなんだからBlenderのソースを見た方が早いかもしれない。