前もって言っておきますが、この問題は難しいです。Dan Story のリンクされた質問が回答されていないのには理由があります。突き刺したい人のために説明をしましょう。しかし、それがどれほど難しいかについて私が間違っていることを願っています。
2D スクリーン座標と投影/透視行列が既知であると仮定します。少なくともこれだけ知っておく必要があります (射影行列がわからない場合は、基本的に別のカメラを使用して世界を見ていることになります)。2D スクリーン座標の各ペアを呼び出しましょう(a_i, b_i)
。射影行列は次の形式であると仮定します。
P = [ px 0 0 0 ]
[ 0 py 0 0 ]
[ 0 0 pz pw]
[ 0 0 s 0 ], s = +/-1
ほとんどすべての合理的な射影は、この形式をとっています。レンダリング パイプラインを調べると、次のことがわかります。
a_i = px x_i / (s z_i)
b_i = py y_i / (s z_i)
(x_i, y_i, z_i)
ポイントの元の 3D 座標はどこにありますか。
ここで、頂点が(x0_i, y0_i, z0_i)
. これらを行列の列として配置できますC
。形状の実際の座標は、これらの座標の厳密な変換です。同様に、実際の座標を行列の列として整理してみましょうV
。次に、これらは
V = R C + v 1^T (*)
ここ1^T
で、 は正しい長さの 1 の行ベクトル、R
は剛体変換の直交回転行列、 は変換v
のオフセット ベクトルです。
これで、上記の各列の式ができました。V
最初の列は is{ s a_1 z_1 / px, s b_1 z_1 / py, z_1 }
などです。
(*)
スカラーのセット、およびz_i
と で定義された剛体変換の方程式のセットを解かなければなりません。R
v
困難
- 方程式は未知数では非線形であり、 と の商を含みます
R
。z_i
- これまでは、どの 2D 座標が元の形状のどの頂点に対応するかを知っていると仮定してきました (形状が正方形の場合、これは問題にはなりません)。
- 解決策さえあると思います。
(*)
2D データにエラーがある場合、方程式がどの程度満たされるかを判断するのは困難です。変換は非剛体または非線形になります。