前回クォータニオン徹底解説というのを書いたので、デュアルクォータニオン(Dual Quaternions)についても書いてみたいと思います。
デュアルクォータニオンというのは文字通り2つのクォータニオンを使って、回転だけでなく移動量も同時に表現しようというものです。でも、回転はクォータニオンを使って、移動量は普通に3次元ベクトルを使えば済む話なので、3Dゲームの開発でデュアルクォータニオンはほとんど使われていませんでした。しかし、デュアルクォータニオンをキャラクタのスキニングに使う手法が Kavan らによって発表されて、3Dゲームの開発でもデュアルクォータニオンが注目されるようになりました。
私もデュアルクォータニオンを使ったスキニングを実装したことはあったのですが、なぜデュアルクォータニオンによるスキニングがうまくいくのか、いまいちよくわかっていませんでした。今回このブログを書こうと思い、改めて勉強してみて、デュアルクォータニオンが回転と移動を同時に補間するのに適していることがよくわかりました。
デュアルクォータニオンについてインターネットで検索してみるといくつかの文献がみつかりますが、どれも定理や公式を羅列するだけで、何がポイントなのかをきちんと説明しているものはほとんどありません。その中で Kavan らの論文はスキニングの問題点やデュアルクォータニオンのスキニングがうまく行く理由について大変よくまとまっているので、ぜひ読んでいただきたいと思いますが、やはりデュアルクォータニオンの説明は天下り的なものです(それでも他の文献に比べればポイントを抑えていてわかりやすいのでお勧めです)。
このデュアルクォータニオン徹底解説では、クォータニオン徹底解説と同じ手法でデュアルクォータニオンを導出し、なぜそれが補間(スキニング)に適しているのかを解説しています。そのため、前提条件としてクォータニオン徹底解説を先に読んで理解しておく必要がありますが、不必要な定理や公式は省き、要点を抑えて説明するように心掛けたので、わかりやすくなっていると思います。
前回同様、やや長くなってしまったので、複数のページにわたって解説しています。まず次のページではやや天下り的ではありますが、クォータニオンを2つ並べて2次元のベクトルを作り、その2次元のクォータニオンベクトルを使って回転と移動を表現することを試みます。これは私の最初のデュアルクォータニオンの理解の仕方でした。しかし、これではスキニングがうまくいく理由を説明することができません。
そこで、3ページ目ではクォータニオン徹底解説のときのように、微小変換からデュアルクォータニオンを導出することを試みます。
そして4ページ目では微小変換から導出されたデュアルクォータニオンの形式がどのような幾何学的意味を持つのかを解説します。
5ページ目では、2ページ目で導出されたデュアルクォータニオンの形式と、3ページ目で導出されたデュアルクォータニオンの形式との対応関係を調べます。
6ページ目ではデュアルクォータニオンの球面線形補間について解説しています。
7ページ目以降でスキニングについて解説しようと考えていたのですが、書いてる間にやらなきゃいけないことがたまってきたので、7ページ目のまとめで解説は終わりになります。当初予定としては、WebGL を使いながら、まず7ページ目で行列の線形補間によるスキニングの問題点について解説し、8ページ目では回転にクォータニオンを使って、回転と移動を別々に補間することを試み、この方法でもまだ問題があることを示して、9ページ目でデュアルクォータニオンがこれらの問題をうまく解決していることを説明するつもりでした。もし時間ができて気が向いたら続きを書こうかと思いますが、スキニングに関しては Kavan らの論文に全て書いてあるので、ぜひこちらをお読みください。
大変すばらしい解説、ありがとうございました。
ロボット工学で良く出てくるので、すごい参考になりました。
ロボット工学では良く使われるのですね。知りませんでした! コメントありがとうございます。
いつも大変お世話になっております。
3ページ目の
回転と移動をあらわした行列 A は Z の指数関数で表現できます。
A=eZ
そして、この行列 A に対応したデュアルクォータニオン d は
d=e^θ(axi+ayj+azk)+ϵ(vxi+vyj+vzk)
で計算できます。
の部分の質問なんですがこの文が書かれていたところの前に書かれていた文書のi,j,kとX,Y,Zの対応関係で出てきた1/2はどこに消えたのですか?
ご指摘の通り、1/2が抜けていましたので修正いたしました。
ありがとうございます!