1

目標は、カメラ画面に投影された 3D 空間内のポイントを取得することです (最終的な目標は、ポイント クラウドを生成することです)。

これはセットアップです:

カメラ位置: px,py,pz 上方向: ux,uy,uz look_at_direction: lx,ly,lz screen_width screen_height screen_dist

空間内の点: p = (x,y,z)

初期 U、V、W

w = || position - look_at_direction || = || (px,py,pz) - (ux,uy,uz) ||
u = || (ux,uy,uz) cross-product w ||
v = || w cross-product u ||

これにより、カメラの u、v、w 座標が得られます。

これは、私が実装することになっている手順であり、それらを理解する方法です。翻訳で何かが失われたと思います。

(1) カメラから点への光線を求める

カメラの位置で点を引く

ray_to_point = p - 位置

(2) ポイントへの光線と画面の中心 (カメラ方向) への正規化された光線の間の内積を計算します。結果を sc_dist で割ります。これにより、ポイントの距離とカメラの画面までの距離の比率が得られます。

比率 = (ray_to_point * w)/screen_dist

ここで、w、カメラの元のルックアット値、またはカメラ空間の単位ベクトルである w ベクトルを使用する必要があるかどうかはわかりません。

(3) ポイントへの光線を手順 2 で求めた比率で分割し、カメラ位置に追加します。これにより、カメラ画面上のポイントの投影が得られます。point_on_camera_screen = ray_to_point / 比率

(4) カメラの画面の中心と投影点の間のベクトルを見つけます。画面の中心ピクセルを見つけることになっていますか? どうやってやるの?

ありがとう。

4

1 に答える 1

1

次の図を検討してください。

形

最初のステップは、カメラから p (=>diff までの差分ベクトルを計算することです)。そのとおりです。

次のステップは、カメラの座標系で差分ベクトルを表現することです。その軸は直交しているため、これは内積で行うことができます。軸が単位ベクトルであることを確認してください。

diffInCameraSpace = (dot(diff, u), dot(diff, v), dot(diff, w))

結果の差分ベクトルの z 成分が になるようにスケーリング部分が来ますscreen_dist。そう:

diffInCameraSpace *= screenDist / diffInCameraSpace.z

それをワールド空間に戻したくありません。カメラ ユニットをピクセルにマッピングする方法についてさらに詳しい情報が必要になる場合がありますが、基本的にはこの手順で完了です。diffInCameraSpace結果をだけシフトしたい場合があり(screenWidth / 2, screenHeight / 2, 0)ます。z コンポーネントを忘れると、画面上の位置がわかります。

于 2013-06-19T11:28:26.880 に答える