[[FrontPage]]

-ちょっとネットで見かけた3次元から3次元への変換行列。
-といっても、スケールや直交性は維持されてるので、単なる視点変換の話。

*前提条件 [#hd1a06a2]
-変換前の3次元座標をAと変換後の3次元座標Bを
#mimetex(\text{A} = \left( \begin{array}{c}X\\Y\\Z\\1\end{array} \right))
#mimetex(\text{B} = \left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\\1\end{array} \right))
-と定義する

*変換行列 [#mac8177f]
-変換行列をMとする。
-変換行列Mは以下の様な特性を持つ
#mimetex(\text{B} = \text{M}\text{A})
#mimetex(\left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\\1\end{array} \right) = \left(\begin{array}{cccc}M_{11}&M_{12}&M_{13}&M_{14}\\M_{21}&M_{22}&M_{23}&M_{24}\\M_{31}&M_{32}&M_{33}&M_{34}\\0&0&0&1\end{array}\right)\left( \begin{array}{c}X\\Y\\Z\\1\end{array} \right))
-さらに、Mの内部も回転行列Rと並進成分tに分けられる
#mimetex(\left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\\1\end{array} \right) = \left(\begin{array}{cccc} & \text{R} & & \text{t}\\0&0&0&1\end{array}\right)\left( \begin{array}{c}X\\Y\\Z\\1\end{array} \right))

*ツッコミ [#n2f3b982]
-閲覧したサイトには
--まず行と列が逆になっていた
--4行目(サイトでは4列目)が &mimetex(\left(0 0 0 1\right)); となるような制約が抜けていた
-ので、その辺りの制約を加えるとなると、以下の様にする必要がある。
#mimetex(\left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\end{array} \right) = \left( \begin{array}{cccccccccccc} X&Y&Z&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X&Y&Z&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X&Y&Z&1 \end{array} \right)\left(\begin{array}{c} M_{11}\\M_{12}\\M_{13}\\M_{14}\\M_{21}\\M_{22}\\M_{23}\\M_{24}\\M_{31}\\M_{32}\\M_{33}\\M_{34} \end{array}\right))
-1つの点同士の対応で3本の方程式が成り立つ。
--真ん中の行列が3行存在する、という意味。
-点を増やせば、増やした数だけ、真ん中の行列は点数*3行ずつ増え、左辺は1列ずつ増える
-真ん中の行列の逆行列を求めたいので、最低4点必要になる。
#mimetex(\left( \begin{array}{c} X^{\prime}_{1}\\Y^{\prime}_{1}\\Z^{\prime}_{1} \\ X^{\prime}_{2}\\Y^{\prime}_{2}\\Z^{\prime}_{2}\\ X^{\prime}_{3}\\Y^{\prime}_{3}\\Z^{\prime}_{3}\\ X^{\prime}_{4}\\Y^{\prime}_{4}\\Z^{\prime}_{4} \end{array} \right) = \left( \begin{array}{cccccccccccc} X_{1}&Y_{1}&Z_{1}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{1}&Y_{1}&Z_{1}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{1}&Y_{1}&Z_{1}&1\\ X_{2}&Y_{2}&Z_{2}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{2}&Y_{2}&Z_{2}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{2}&Y_{2}&Z_{2}&1\\ X_{3}&Y_{3}&Z_{3}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{3}&Y_{3}&Z_{3}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{3}&Y_{3}&Z_{3}&1\\ X_{4}&Y_{4}&Z_{4}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{4}&Y_{4}&Z_{4}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{4}&Y_{4}&Z_{4}&1\\ \end{array} \right)\left(\begin{array}{c} M_{11}\\M_{12}\\M_{13}\\M_{14}\\M_{21}\\M_{22}\\M_{23}\\M_{24}\\M_{31}\\M_{32}\\M_{33}\\M_{34} \end{array}\right))
-これで、ようやく真ん中の行列の逆行列が求められる。
-この逆行列を左辺に右側からかければ、欲しい変換行列パラメータ M が求まる。
#mimetex(\left( \begin{array}{cccccccccccc} X_{1}&Y_{1}&Z_{1}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{1}&Y_{1}&Z_{1}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{1}&Y_{1}&Z_{1}&1\\ X_{2}&Y_{2}&Z_{2}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{2}&Y_{2}&Z_{2}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{2}&Y_{2}&Z_{2}&1\\ X_{3}&Y_{3}&Z_{3}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{3}&Y_{3}&Z_{3}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{3}&Y_{3}&Z_{3}&1\\ X_{4}&Y_{4}&Z_{4}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{4}&Y_{4}&Z_{4}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{4}&Y_{4}&Z_{4}&1\\ \end{array} \right)^{-1}\left( \begin{array}{c} X^{\prime}_{1}\\Y^{\prime}_{1}\\Z^{\prime}_{1} \\ X^{\prime}_{2}\\Y^{\prime}_{2}\\Z^{\prime}_{2}\\ X^{\prime}_{3}\\Y^{\prime}_{3}\\Z^{\prime}_{3}\\ X^{\prime}_{4}\\Y^{\prime}_{4}\\Z^{\prime}_{4} \end{array} \right) = \left(\begin{array}{c} M_{11}\\M_{12}\\M_{13}\\M_{14}\\M_{21}\\M_{22}\\M_{23}\\M_{24}\\M_{31}\\M_{32}\\M_{33}\\M_{34} \end{array}\right))

*その他/考察 [#ld888896]
-本当なら、スケーリング係数も考えないと行けないのだが、両方の点の最後の要素が1、行列の右下の要素も1という制約を守るなら、これでもいける
-あと、本当は回転行列はそれぞれノルムが1となる列ベクトル3本から成り立ってるはずで、その辺りの制約を入れればもっと精度がよくなる。
-多分、ノイズが乗る/乗らないという話以前に、変換行列の4行目に対する制約を導入すれば、ノイズが多少は減るはず。
-回転行列の制約を式に導入する方法に関しては未勉強なので、追々。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS