理系的な戯れ

理工学系とくにロボットやドローンに関する計算・プログラミング等の話題を扱って、そのようなことに興味がある人たちのお役に立てればと思っております。

カメラを注視点に向ける

カメラを注視点に向ける

はじめに

マルチコプタのシミュレーションをしたいと考えた際に、計算結果を3次元CGで可視化したいと 思い始めると、動き回るマルチコプタを画面に収めるため、あたかもカメラがマルチコプタを 追い続けるような事を考えなければなりません。

前に、物体の方向を如何に表すかという考察をしました。その際、座標変換や回転と言ったことも考察したので、 その知識を前提にして、カメラを注視点に向けると言う事を考えていきます。

rikei-tawamure.com

カメラを注視点に向けるとは

カメラを注視点に向ける事で達成したいこととは、カメラ座標空間に被写体を座標変換することとなります。

そうすることで、射影変換を施し、画面上に図形として描くことができます。

つまり、座標変換行列が求められることがゴールとなります。

カメラから注視点を向くベクトル

慣性空間におけるカメラの座標を示す位置ベクトル{\boldsymbol{p}}_1と注視点の位置ベクトルを{\boldsymbol{p}}_2とします。

そうすると、カメラから注視点を向くベクトル{\boldsymbol{r}}_1


\begin{eqnarray}
{\boldsymbol{r}}_1={\boldsymbol{p}}_2-{\boldsymbol{p}}_1\\
\\
\end{eqnarray}

これで、カメラの方向を表す回転行列(方向余弦行列)の1軸分が定まりました。

あとは{\boldsymbol{r}}_1に直交し、互いにも直交する2本のベクトルを見つけることで目的が達成されます。

もう一本をどうやって決めるか

以前にもお話ししましたが、直交する座標軸は、2本が決まると、左手系か右手系かが決まっていると、 ベクトルの外積の計算により、一意に決まってしまいますので、 この問題は、あと一本のベクトルをどうするかという問題になります。

カメラマンはどうするか

この問題は、カメラを注視点に向けたあとにカメラマンが何を考えるか、何をするかということにヒントがあります。

カメラマンはおそらく簡単に被写体の注視点にカメラを簡単に向けることができます。

これは先程のベクトル{\boldsymbol{r}}_1を作るのと同じことです。

その後、カメラマンはファインダを覗いて多少の注視点の移動はすると思いますが、 主には被写体の向きを調整すると思います。

被写体の向きの調整というのは、被写体自体を動かすことではなく カメラ自身をベクトル{\boldsymbol{r}}_1を回転軸として、回転して ファインダーから見える被写体の向きを変えます。

被写体の回転行列を手がかりにする

被写体の向きに、カメラを回転して合わせることをするわけなので、 被写体の回転行列の要素を2本目のベクトルを決める何らかの 手がかりにしたいと思います。

ここでは、簡単のために被写体の回転行列の被写体の上方向を示す列要素を取り出します。 カメラを回転させて、被写体に上方向がカメラの画面の上方向と一致する様にします。

人物の写真であれば、人物の顔や頭が画面の上にきて、人物が真っ直ぐ立っている様にします。

さて、被写体の回転行列の列要素の中で被写体の上方向の向きを表しているベクトル要素を {\boldsymbol{q}}_1とします。

この{\boldsymbol{q}}_1を2本目のベクトルにできれば良いのですが、ほぼ間違いなく 特殊な場合を除くと{\boldsymbol{q}}_1{\boldsymbol{r}}_1に直交しません。

先に3本目を考える

ここで話が飛ぶ様ですが、カメラの回転行列の3本目の要素を考えると、 ベクトル{\boldsymbol{r}}_1とベクトル{\boldsymbol{q}}_1が作る(存在) する平面に垂直になることがわかります。

したがって、ベクトル{\boldsymbol{r}}_1とベクトル{\boldsymbol{q}}_1の外積から それらに垂直なベクトル{\boldsymbol{r}}_3を求めます。


\begin{eqnarray}
{\boldsymbol{r}}_3={\boldsymbol{r}}_1 \times {\boldsymbol{q}}_1\\
\\
\end{eqnarray}

外積の掛ける順は以上のようにします。

これがカメラの回転行列の3本目の要素になります。

1本目と3本目から2本目を求める

そして、最後に1本目のベクトル{\boldsymbol{r}}_1と3本目のベクトル{\boldsymbol{r}}_3の外積から 2本目のベクトル{\boldsymbol{r}}_2を求めます。


\begin{eqnarray}
{\boldsymbol{r}}_2={\boldsymbol{r}}_3 \times {\boldsymbol{r}}_1\\
\\
\end{eqnarray}

これで、カメラの回転行列{\bf{R}}が次の様に求まります。


\begin{eqnarray}
{\bf{R}}=
\begin{bmatrix}
{\boldsymbol{r}}_1&{\boldsymbol{r}}_2&{\boldsymbol{r}}_3
\end{bmatrix}
\end{eqnarray}

カメラ座標系への座標変換行列

回転行列{\bf{R}}は、カメラ座標系から慣性系への座標変換行列になります。

逆に、慣性系からカメラ座標系へ座標変換するためには転置した{\bf{R}}^\mathsf{T}を用います。

この記事では、被写体の上方向にカメラの上方向も合わせましたが、 傾けたいと思えば、被写体を向いているベクトルを軸に回転すれば良いので簡単です。

おわりに

今回は、カメラを被写体に向けるということ、すなわち カメラ座標空間への座標変換行列について考察してみました。

マルチコプタのシミュレーションの可視化に生かしたいと思います。

すみません、 記事は書き殴りで、図などを足してわかりやくすしていきたいと思ってます。

では、また!