カメラ

Last Updated 2011/09/21


カメラは、3D 空間内における 3D オブジェクトを見るときの、仮想の視点(カメラの位置)と視線の方向(カメラの向き)を抽象的に表現したものです。現実の物体は三次元的な広がりを持ちますが、ディスプレイは二次元でしか表示できません。そこで、物体を二次元的に切り取った絵が必要です。それが物体をカメラで撮ったときと似ているので、3D オブジェクトを二次元に変換する機能を「カメラ」と表現することにしたのでしょう。したがって、一つの 3D シーンに一つのカメラが必ず存在しなければなりません。

ProjectionCamera オブジェクトの Position プロパティはカメラの位置、LookDirection プロパティはカメラの向いている方向、UpDirection プロパティはカメラの上方向を指定します。

カメラの上方向の意味を補足すると、実際のカメラをかまえたときの方向は通常上方向ですね。カメラで風景や人物を撮影するとき、通常はカメラを横向きにしますが、縦向きにすることもあります。撮影した画像を写真にするとカメラの向きによって画像を正常に表示する方向が異なります。そこで、カメラの上方向を決めておかなければならないということです。

ところで、カメラの位置については直感的に分かりにくいので、テストするコードを書いてみました。ライトは DirectionalLight オブジェクトで 3D オブジェクトの正面から照明しています。

【注意】以下の [カメラ位置のテスト] は、IE(インターネットエクスプローラ)でしか正常に動作しません。

カメラは PerspectiveCamera で、最初は正面を向いています。Z を小さくすると 3D オブジェクトに近づきますので、大きく表示されます。X と Y を変化させると、3D オブジェクトが移動すると同時に、影の位置が変化することが分かるはずです。Z を 5 ぐらいにして、X に -1.0、Y に 1.0 を設定すると、被写体は右下に移動し、影の位置が変化するはずです。

カメラの位置をテストしてみて、どのような感想を持ちましたか。私は当初、期待していたものとは逆の動作をしているように思いました。そう思った理由は、そもそもカメラの位置とは何をさすのかがハッキリしていなかったことに起因します。

最大のポイントは、カメラは常に Z 軸上にあるということにあります。下図は、カメラの位置を移動したときの被写体の位置とカメラの位置とを示すものです。カメラの位置を (0, 0, 1) から (-1, 1, 1) に移動すると、被写体はカメラのファイダーの中の右下に移動します。

Camera Setup

このことは上記のコードのテストで確認できます。では、影の位置(光源の位置または方向)はどうでしょうか。光源の位置と方向は変えずにカメラの位置だけを変えたので、影の位置は元の光源のままになっていることが分かります。つまり、3D オブジェクトが球体ですから、左上の影の部分がより多く見えています。

さて、WPF がサポートするカメラは次の 3 種類があります。

OrthographicCamera は遠近法を使わないカメラで、PerspectiveCamera は遠近法を使うカメラです。遠近法は遠くにあるものほど小さく表現するもので、透視図を思い浮かべればいいでしょう。

Camera Projection

Note 上図は、WPF SDK の中にあるものを使用しました。

MatrixCamera はほかのカメラとは性格が異なり、Matrix3D 型を使ってカメラの属性を自由に設定可能にするものです。

−以上−