次の回答では正射影を想定していますが、透視投影への拡張は簡単です。小さめのオブジェクトの場合、正射影は問題ないように見えます (遠近効果が見られないことに慣れているため)。
各点について、、をオブジェクトi
空間の元の座標とします。x[i]
y[i]
z[i]
x'[i]
, y'[i]
,をカメラ空間に回転させz'[i]
た点とします (これは、回転変換を各点に適用することで計算できます。この部分は簡単だと思います)。
正射影は次のようになります。
X[i] = f*x'[i] + Cx
Y[i] = f*y'[i] + Cy
ここf
で、スケーリングを処理し、画像の中心Cx
となる数値を計算します。Cy
これは、透視投影、非ユニティ アスペクト比などを可能にするために、より複雑にすることができます。たとえば、この他の質問に対する私の回答を参照してください: ((画像を形成するために投影された 3D ポイント)) 透視投影を扱うこのようなものについて。
について解くのでf
、次のように並べ替えます。
f = (X[i] - Cx)/x'[i]
f = (Y[i] - Cy)/y'[i]
MaxX
を、ピクセル座標の最大の望ましいX
点、ピクセル座標MaxY
の最大の点Y
、MinX
およびMinY
最小の点 (ピクセルの中心をとります) とします。
例えば
MinX=0.5
MaxX=599.5
MinY=0.5
MaxY=599.5
f
最も極端な点x'[i]
またはy'[i]
点がこれらのピクセルの 1 つにマッピングされるように、十分に小さいものを選択したいと考えています。
注: 私は、オブジェクトが既に中心にあると仮定しています: そうでない場合は、良いものも計算する必要がCx
ありCy
ます (そして、画像へのより緊密な適合はそのように達成できます)。
X
との各Y
方向で回転した最大点と最小点を計算します ( のすべての可能な値min_i(x[i])
の最小値を意味します)。x[i]
i
minx = min_i(x[i])
maxx = max_i(x[i])
miny = min_i(y[i])
maxy = max_i(y[i])
次に、極値ピクセルのそれぞれがこれらの極値点のそれぞれにマッピングするために必要な焦点距離を解きます。
f_1 = (MinX - Cx)/minx
f_2 = (MaxX - Cx)/maxx
f_3 = (MinY - Cy)/miny
f_4 = (MaxY - Cy)/maxy
そして、オブジェクト全体が画面に収まるように、これらのうち最小のものを選択します。
例
一番左の点(ポストローテーション)が
minx = -1.2
一番右のポイント:
maxx = 1.5
最も上向きのポイント (ピクセル座標が空間座標と一致していると仮定していることに注意してください):
miny = -1.3
最も悪い点 (ピクセル座標が空間座標と一致していると仮定していることに注意してください):
maxy = 1.3
画像の例を使用します600x600
。
これらのそれぞれについて、次のように解きf
ます。
f_1 = (0.5 - 300)/-1.2 = 249.6
f_2 = (599.5 - 300)/1.5 = 199.7
f_3 = (0.5 - 300)/-1.3 = 230.4
f_4 = (599.5 - 300)/1.3 = 230.4
最小のものを選択するf
と、次のようになります。
f=199.7
正射影は次のようになります。
X[i] = 199.7*x'[i] + 300
Y[i] = 199.7*y'[i] + 300
注意: 透視投影を追加したり、別の画像中心を許可したり、スケーリングしたりなど、さまざまな方法でこれをより洗練されたものにすることができます。このアプローチは、開始するための最も簡単な方法になるように設計されています。