2017年02月16日

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

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

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

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


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

では。

追記
posted by gency at 22:18| Comment(0) | 3DProgramming