回転

我々が扱っている形状認識とは、3D CADのモデルを解析して製造などに必要な情報を取り出す技術です。
今回は、形状認識に使われる数学の話をしましょう。

形状認識の対象となる3Dモデルは、製品の中に使われる都合や設計者の意図によって方向が決まるので、必ずしも形状認識に都合のよい方向を向いているとは限りません。

そこで、形状認識の過程でモデルを回転させることが、よくあります。

二次元の回転

実際に扱うモデルは三次元ですが、その前に二次元の場合について考えてみましょう。
二次元平面上の点P(x,y)を原点を中心に角度βだけ反時計回りに回転させた点P'(x’y’)を求めたいとしましょう。

まず、点P(x,y)は、$r=\sqrt{x^2+y^2}$と置くことで、

     \begin{eqnarray*} \left\{ \begin{array}{l} x=r\cos{\alpha}\\ y=r\sin{\alpha} \end{array} \right. \end{eqnarray*}

と書き直せます(式1)。$(\cos{\alpha},\sin{\alpha})$が単位円上にX軸から角度αだけ反時計回りに進んだ点の座標を与えることから自明です。
求めたい点P’はここからさらに角度βだけ反時計回りに回転させた点なので、その座標は$(r\cos{(\alpha+\beta)},r\sin{(\alpha+\beta)})$になります。そこで加法定理(覚えていますか?)を適用すると、

     \begin{eqnarray*} \left\{ \begin{array}{l} x'=r\cos{(\alpha+\beta)}=r(\cos{\alpha}\cos{\beta}-\sin{\alpha}\sin{\beta})\\ y'=r\sin{(\alpha+\beta)}=r(\sin{\alpha}\cos{\beta}+\cos{\alpha}\sin{\beta}) \end{array} \right. \end{eqnarray*}

ここに式1を代入すると、

     \begin{eqnarray*} \left\{ \begin{array}{l} x'=\cos{\beta}x-\sin{\beta}y\\ y'=\sin{\beta}x+\cos{\beta}y \end{array} \end{eqnarray*}

(式2)
この式を行列とベクトルの積の形に書き換えて

     \begin{equation*} \left( \begin{array}{c} x'\\ y' \end{array} \right)=\left( \begin{array}{cc} \cos{\beta}&-\sin{\beta}\\ \sin{\beta}&\cos{\beta} \end{array} \right) \left( \begin{array}{c} x\\y \end{array} \right) \end{equation*}

(式3)
これが求める答えです。右辺で前乗(前から掛けること)している行列を回転行列と呼びます。
回転という操作が行列の掛け算で表されることがわかりました。

複素平面と回転

ところで複素数というものがありましたよね。二次方程式

     \begin{equation*} ax^2+bx+c=0 \end{equation*}

の解

     \begin{equation*} x=\frac{-b\pm\sqrt{b^2-4ac}}{2a} \end{equation*}

が、$b^2<4ac$の下では負の数の平方根の計算をしなければならなくなるのを解決するってヤツです。
どうするかというと、虚数単位iというものを考えて$i^2=-1$とし、普通の代数式と同じように計算できるものとするのです。
さて。ある複素数$a=x%2biy"$を考えた時、iの係数yはこの数自体としては実数部分にはなんら影響を与えないので実数部分の係数xとは無関係に表すことができます。そこで実数部分の係数xを横軸(実軸)、iの係数yを縦軸(虚軸)に取ってプロットすることができます。

ここで(わざとらしいですが)複素数$a=r\cos{\alpha}+i r\sin{\alpha}$$b=\cos{\beta}+i\sin{\beta}$の積を考えてみましょう。

     \begin{eqnarray*} ab&=&r\cos{\alpha}\cos{\beta}+ir\cos{\alpha}\sin{\beta}+ir\sin{\alpha}\cos{\beta}-r\sin{\alpha}\sin{\beta}\\ &=&\cos{\beta}\cdot r\cos{\alpha-\sin{\beta}\cdot r\sin{\alpha}+i(\sin{\beta}\cdot r\cos{\alpha}+\cos{\beta}\cdot r\sin{\alpha}}) \end{eqnarray*}

よく見てみるとこの式は式2とまったく同じ形をしてますね。つまり、$b=\cos{\beta}+i\sin{\beta}$という複素数を掛けると、複素平面上で反時計回りに角度β回転させることになるのです。
先に求めた行列と同じ働きですね。
このふたつのやり方、複素数と行列による回転は1989年から1998年までの短い間、高校数学の指導要領に入っていました。
わたしも幸いこの期間に高校生だったので、両方のやり方を学ぶ機会があったのですが、片方しか習ってない方も多いのではないでしょうか。

三次元への拡張

我々が形状認識で扱うのは二次元の図面ではなく、三次元のモデルです。
なので三次元空間への拡張を考えてみましょう。
と言ってもそんなに難しい話ではありません。二次元平面は三次元空間の中のz=0なるいち平面ですから、原点を中心とした回転は実はz軸を中心とした回転と見做せます。

     \begin{equation*} \left( \begin{array}{c} x'\\ y'\\ z' \end{array} \right)=\left( \begin{array}{ccc} \cos{\beta}&-\sin{\beta}&0\\ \sin{\beta}&\cos{\beta}&0\\ 0&0&1 \end{array} \right)\left( \begin{array}{c} x\\ y\\ z \end{array} \right) \end{equation*}

この式は元の点のz座標が回転後もx座標やy座標の影響を受けず変わらないことを表しています。
では他の軸、x軸やy軸を中心とした回転はどうでしょうか。今はz軸の矢印の先から反対方向を眺めるようにしてx-y平面上の回転から式を求めたので、同様にx軸を中心とした回転はx軸の矢印の先から反対方向を眺めるようにして、y軸を中心とした回転はy軸の矢印の先から反対方向を眺めるようにして、それぞれ二次元の回転を考えることで求めることができます。ただし、y軸を中心とした回転を考えるときは、矢印の向きが他の方向とは逆になる軸があるので符号に注意が必要です。
このようにして求めたx軸周り・y軸周り・z軸周りの回転を組み合わせることで、あらゆる方向への回転を表すことができます。
3つの軸周りの角度の組で回転を表す方法を、オイラー角と呼びます。

このように形状認識では、高校までで習うような数学が出てきます。
「三角関数など何の役に立つのだ」といった意見をよく目にするのですが、形状認識には立派に役に立ちます。
学校で習ったことが活かせる仕事があるのはすばらしいことだと個人的には思います。

ところで。複素数と同じように、三次元の回転もなにかの数の掛け算で表せないのでしょうか?
実はできるのですが、この話はまたの機会に。

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP