2017年02月16日

デュアルクォータニオンスキニング

デュアルクォータニオンによるスキニング(DQS)を実装しました。
DQSはけっこう古い技術で、問題点も多いとのことで個人的には実装したいってほど興味もなかったのですが、他のスキニングを調べてみてもDQSに勝るスキニングはいまだに存在しないようだったので、んじゃ実装してみるかという感じでコード書いてみました。

参考サイト
https://www.cs.utah.edu/~ladislav/dq/index.html

こちらのサイトにはデュアルクォータニオンと行列の相互変換のサンプルコードが載っています。論文の数式がさっぱり理解できなかった私には非常に有難いサンプルでした。
DQと行列の相互変換さえできれば、DQSの実装は比較的簡単にできるかと思います。ただ、CPU側の処理で、どの段階の行列をデュアルクォータニオンに変換すればいいのか分からなくて、私は少し迷いました。まぁ普通に考えて合成行列(シェーダーに送るボーンの変形行列)だよなぁって思ったので、これをDecomposeして回転と平行移動成分を取り出し、それをデュアルクォータニオンに変換してシェーダーに渡してとやっていたのですが、最初のテストで上手く動かなかったために、あれ合成行列違うのか?となってしまい、けっこう迷走しておりました。。
ちなみに、上手く動かなかった原因は、glm::quatのオーダーが「x」からなのを知らず「w」から始まると思い込んで処理していたからでした;
考えてみれば、クォータニオンの各成分を直接弄るのは初めてだったかも・・。


今回は動画で内容を紹介するつもりでしたが、いろいろおかしなことになってしまったので、これで終わりとさせて頂きます。
追記の方にボツにした動画と感想文を入れておきますので、よかったら見てやってください。

では。

tset.gif



デュアルクォータニオンスキニングを使ってみた所感ですが、よく知られるBulge(膨らみ)というアーティファクトについては正直よく分かりませんでした。動画では肘の関節に注目していますが、ここは頂点数が少ないためかBulgeらしきものは見られず、DQSのメリットだけが際立っているように見えます。もっと頂点数の多いモデルであればBulgeがはっきりと表れるかもしれませんが、ローポリなウラ嬢では判断しづらい部分でした。裏を返せば、DQSとローポリは相性が良いということかもしれませんけどね(未検証

意外なところでは、太腿のボーンにバインドしたスカートの頂点の挙動が改善されていました。LBSでは太腿がスカートを貫通することが多かったのですが、DQSだとその現象がほぼ見られませんでした。これは全く予想してなかった部分ですが、今回の中で最も嬉しい改善でした。これでもし補助ボーン(というかスカート用のボーン)が要らなくなるようであれば、ボーン2本分の計算時間が節約できますね。というかそもそも、LBSのアーティファクトを解消するための補助ボーンが一切不要になっているので、その分も節約になっているわけだから、2本どころじゃないんですけどね(見た目の良し悪しはあるけど)。

最初は古臭い技術だと思って侮っていましたが、実際にDQSを使ってみた今にしてはLBSの次に人気だと言われる理由も分かるような気がします。ただ、今回はローポリモデルでしか試していません。ローポリモデルというのは、もともとある程度見た目を捨てているモデルで、絵で言うところのラフ画のようなものなので、多少の歪みは暈されて気にならなくなってしまう部分があるかと思います。そういう効果もあって良く見えただけのような気がしなくもないので、上の方でも書きましたが、頂点数の多いモデルを使って試してみないと分からないことも多いのではと感じています。

感想はこんなところでしょうか。まだ出来たてホヤホヤで隅々までチェックできていないので、今後改善したい点など出てくるかもしれません。

今回紹介したのは2つだけですが、アニメーション周りはかなり強化しまして、動画にもありますようにユーザーが直接ボーンを動かせる仕組みなども実装しています。この仕組みができたことでIKやラグドールの実装も可能になりましたので、今後はこの2つを実装することを目標に作業していく感じなるかと思います。
そんな感じです。では。
posted by gency at 22:18| Comment(0) | 3DProgramming
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: