必要な答えは、必要な結果の精度によって異なります。danaid が指摘したように、イメージ センサーの非線形性や、大気の歪みなどのその他の要因がエラーを引き起こす可能性がありますが、さまざまなデバイスのさまざまなカメラなどで解決するのは難しい問題です。それでは、より正確さが必要な場合に微調整できる合理的な近似値を取得することから始めましょう。
まず、必要に応じて、デバイスからの方向情報を無視できる場合があります。5 つの位置 (POS1 - POS4 とカメラ) が一貫した座標の基本セットにある場合、必要なものはすべて揃っています。実際、これらすべてのポイントは必要ありません。
一貫した座標に関するメモ。彼の縮尺では、緯度と経度をメートルに変換し、縮尺係数に cos(lat) を使用すると、「平らな地球」の観点からすべての人を扱うことができるはずです。次に、カメラの xy 平面が大まかにグローバル xz 平面であることを覚えておく必要があります。
概念的な背景
下の図は、イメージ プレーンへの点の投影を示しています。パースペクティブに使用される dz は、遠点と近点の間のビュー内の距離とそれらの物理的な距離の比率を使用して直接導き出すことができます。POS1 から POS2 への線が POS3 から POS4 への線と平行である単純なケースでは、遠近係数は 2 つの線のスケーリングの比率にすぎません。
Scale (POS1, POS2) = pixel distance (pos1, pos2) / Physical distance (POS1, POS2)
Scale (POS3, POS4) = pixel distance (pos3, pos4) / Physical distance (POS3, POS4)
Perspective factor = Scale (POS3, POS4) / Scale (POS1, POS2)
したがって、四角形の頂点に適用する遠近係数は、線間の頂点までの距離の比率になります。単純化:
Factor(rect) ~= [(Rect.z - (POS3, POS4).z / ((POS1, POS2).z - (POS3, POS4).z)] * Perspective factor.
答え
透視変換は、視線方向の焦点からの距離に対して線形です。以下の図は、X 軸がイメージ プレーンに平行で、Y 軸がビューの方向を指している状態で描かれています。この座標系では、原点から任意の距離にある任意の点 P とイメージ プレーンに対して、投影された点 p は Px/Py に比例する X 座標 px を持ちます。これらの値は線形補間できます。
この図で、tp はターゲット ポイントの目的の投影です。tp.x を取得するには、次のように距離の調整を使用して、たとえば pos1.x と pos3.x の間を補間します。
tp.x = pos1.x + ((pos3.x-pos1.x)*((TP.x/TP.y)-(POS1.x/POS1.y))/((POS3.x/POS3.y)-(POS1.x/POS1.y))
このアプローチの利点は、各ピクセルから見た角度を事前に知る必要がなく、カメラの位置と向きの妥当な誤差に対して比較的堅牢であることです。
さらなる改良
より多くのデータを使用するということは、より多くのエラーを補正できることを意味します。ビュー内の複数のポイントで、カメラの位置と向きはTienstra メソッドを使用して調整できます。このアプローチの簡潔な証明 (重心座標を使用) は、ここにあります。
必要な変換はすべて同次座標に基づく線形であるため、同次 3 空間の X、Y、Z、W 座標と (x、y) 座標を指定して、重心座標を適用して 3 つ以上の点に基づいて補間できます。画像空間で。ポイントが目的のポイントに近いほど、非線形性がそれほど重要ではない可能性が高いため、この例では、四角形が左側にあるため、POS 1 と POS3 を使用し、相対距離に応じて POS2 または POS4 を使用します。 .
(重心座標は、3D グラフィックスで三角形 (フラグメント) の色を補間するために使用される方法として最もよく知られています。)
編集:重心座標には、焦点からの距離の遠近補正を表現する別の方法である W 同次座標係数が引き続き必要です。詳細については、GameDev に関するこの記事を参照してください。
2 つの関連する SO の質問: 3Dのテクスチャ座標の透視補正と重心座標のテクスチャ マッピング。