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

未踏作業日誌――余計なもの作るよ!

未踏の作業日誌的なものを書きましょうということで書くことにしました.余計なことばっかりしています.

擬似的なスキンメッシュアニメーションをやるスクリプトを書いていた

Face Rigで制御する予定なので,スキンメッシュアニメーションをやった後の結果がどうしても欲しかった.Unityに標準搭載のスキンメッシュはGPU上でやっているため,その計算結果を取得することが難しい.そのため,スクリプトで擬似的なスキンメッシュアニメーションをわざわざやって,ボーンを動かした後の頂点座標を取らなければならない.

そのスクリプトが以下のスクリプト

擬似的なスキンメッシュアニメーションをやるスクリプト

まだ途中のものできちんと動くのかどうかわからない.どこにバグが潜んでいるのか全然わからないので,ちゃんと実装がうまく行っているのか若干の不安が残る.

 

スクリプトの仕組みとしては,最初に幅優先でボーンの配列を作ってる.ボーンは根本から動かさないと行けないので,ボーンの階層的に浅い順で計算しないとならない.

その次にボーンから頂点までのベクトルを取り,一旦ボーンのローカル座標に移す作業をやる.このベクトルにボーンの回転をかけるわけだけれども,スキンメッシュアニメーションをやるにはボーンと頂点に対応したウェイト値を考慮しないとならない.

そこで,Quaternion.Slerpを利用することで,ウェイト値に応じた回転量を新しく作る.それとベクトルと掛け算することで,頂点を移動させることができるようになる.

最後はベクトルにボーンの座標を足してワールド座標系に戻すことで,頂点の移動を図るような形になっている.

 

最初は行列計算でやろうと思ったけど,行列の知識が曖昧なのと,回転を扱うならクォータニオンのほうが便利だろうということで,現在の実装になった.行列と比べると,直感的に回転を操作することができる.

ただ,若干の疑問があって,単位クォータニオンと回転クォータニオンのSlerpは果たして間の値をきちんと出すことができるのかという点.ここがちょっとどうしてもわからなかったけど,ゼロって単位がないので動くものと信じたい.

 

明日は大学に提出する書類を書いたりしないといけないので,時間があったらちょろちょろミクさんのウェイトを塗ろうかなって思う.