ビューマトリックス問題

やあ子供たち。今日は3dCGで言うところのビューマトリックスというものについての話をするよ。
(ここでビューマトリクスと読んでいるのはいわゆる「モデル・ビューマトリクス」の後半部分の「ビューマトリクス」のことを指しているよ。日本語にするとワールド座標系を視点座標系に変換する「ビュー変換」、「視点座標変換」などと呼ばれたりする変換のことだよ。ビューマトリクスとプロジェクションマトリクス(投影行列)の区別がつかない人、この記事はプロジェクションマトリクスのことについては一切触れていない内容なので、混乱しないためにもこれ以上読み進むことはやめて今すぐ帰ってくれ。その辺の最低限の勉強して出直してきてくれな。)
ビューマトリックスはねー、難しく考えちゃって理解がなかなか進まなかったり(それは俺です)、一度は理解した人でも何か処理を加えたりする際に、いちいち混乱してしまうケース(それも俺です)が多いようなのだけど、こんなに簡単なことなんだよ!ってことで、メモしておくぞ。(俺用にな)

●チェックポイントその1
「レンダラーとビューマトリックスについて。」

 およそ世の中の遍くレンダラーはカメラ固定(=カメラの位置と向きは不変であるということ)を前提にして作られている。OpenGLしかり、MentalRayしかりだ。例えば前者の場合だと、カメラは右手座標系の原点に固定され、y軸が頭のてっぺんにくる感じで、z軸の負方向を向いていることを前提に、レンダラーは作られているよ。
どうしてそうなのかというと、レンダリング処理はレンダリング処理に特化することが目的だからなんだね。どこか場所と向きを固定しないとレンダリング処理の開発というものは始まらないわけですよ。
なのでこのままではカメラが向きを変えたり、別の場所に自分自身が移動したりといったことができない。
 そこでビューマトリックスを使って、カメラではなく、他の被写体から構成される世界全体の位置と向きを変えることによって、あたかもカメラが動いているのと同等なレンダリング結果を得ることを可能としている。写真や映像を見ただけでは、果たしてカメラの方から出かけて行ったのか、あるいは被写体の方からカメラの前にやって来たのかを区別することはできないという事実を逆手に取った考え方だね。

●チェックポイントその2
「カメラもシーンの中の1モデルにすぎない」

 では肝心のビューマトリックスはどう実装すればいいか?上述のようにレンダラーを補助的に支えているようでもあり、またレンダラーに一番近いところに記述されるべきこのビューマトリックスなだけに、難しく考えてしまいがちだ。
 ところが気分を変えて考えてみると、カメラ自身も、描画対象でこそないものの、シーンの中に位置し、然るべき向きが定義されているという点においては、他の被写体オブジェクトと何ら変わりはなく、むしろその点では区別することができない、カメラもまた、シーン内に存在するモデルのひとつに過ぎないということに気付く。

●チェックポイントその3
「ビューマトリックスとは、カメラ自身のモデル座標変換の逆変換にすぎない」

 「モデル変換行列」は、各モデルがワールド系の中で置かれるべき位置と姿勢の情報を簡潔に記述した4x4行列であるが、それはモデル座標系の座標値をワールド座標系に変換するための座標変換に他ならない。これの逆変換について考えてみると、それは、ワールド座標系の座標値をモデル座標系のそれへ変換する操作となる。
 ここで、上記のビューマトリックスとは、ワールド座標系空間の中に置かれたあらゆるモデルの各座標値を、カメラのモデル座標系での表記に変換するものなので、つまりカメラのモデル座標変換の逆変換に他ならないことがわかる。
 何のことはない、カメラ自身の位置と姿勢が、モデル座標変換という形式で求まっていれば、その逆変換がそのままそのカメラに相当するビューマトリックスなのだ。
 これはまた、モデル座標変換という形でその姿勢が定義されている全てのモデルは、どれも今すぐカメラになれるということを意味しているね。

●結論
「ビューマトリックス問題はカメラの位置姿勢を決定する問題そのものであり、それ以上でもそれ以下でもない。」

 つまり純粋にカメラの姿勢制御を考えてやり、その逆変換をもってビューマトリックスとしてしまえば良い話だよ。カメラがどこにいてどっちを向いてて、ってことだけを考えとけば、あとはその逆変換がそのままビューマトリックスになるよって話だ、簡単だろ?
 3Dゲーム、モデリングツール、レンダラー、ムービー作成、全てにおいてカメラという概念があり、ビューマトリックスは登場するわけだけれども、ウォークスルー、トラックボール、全部ひっくるめて以上の話でビューマトリックスについては解決。もうどんなカメラ機能だって実装できるよ、何でも来い状態だよな?

●実装
 以上を踏まえた実装はどうなるのか?具体的にどうすればいいのか?それはこちらの日記で4通りの実装例を挙げているのでよかったらチェックしてみてくれ。

じゃっ、今日はこのへんで!