7

カメラからビュープレーンを介して光線を生成したいと思います。これを行うには、カメラの位置(「目」)、上、右、およびベクトル(towardは、カメラが見ているオブジェクトの方向へのカメラからのベクトル)とPが必要です。表示面上のポイント。これらを取得すると、生成される光線は次のようになります。

ray = camera_eye + t*(P-camera_eye);

ここで、tは光線に沿った距離です(今のところt = 1と仮定します)。

私の質問は、点Pが表示平面上の位置(i、j)にある場合、どのようにして点Pの3D座標を取得するのですか?表示平面の左上隅と右下隅が指定されていると仮定します。

注:表示平面は、すべての方向に無限に伸びないという意味で、実際には平面ではありません。むしろ、この平面をwidthxheightイメージと考えることができます。x方向の範囲は0->幅で、y方向の範囲は0->高さです。(i、j)番目の要素の3D座標を見つけたい0

4

3 に答える 3

2

直線と平面の中間部分の一般解http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/を参照

特定のグラフィック ライブラリ (OpenGL/DirectcX など) には、これを行う標準的な方法がある場合があります。

編集: スクリーン ポイント (マウス カーソルなど) とシーン内の 3D オブジェクトとの 3D 交点を見つけようとしていますか?

于 2010-03-29T15:34:30.757 に答える
0

P を計算するには、カメラからニア クリッピング プレーン (スクリーン) までの距離、ニア クリッピング プレーンのウィンドウのサイズ (またはビュー アングル。ビュー アングルからウィンドウ サイズを計算できます) が必要です。レンダリングされたウィンドウのサイズ。

  1. 画面位置を -1 < x < +1 および -1 < y < +1 の範囲にスケーリングします。+1 は上/右、-1 は下/左です。
  2. ビュー ウィンドウ サイズで正規化された x、y をスケーリングします
  3. カメラの右方向と上方向のベクトルでスケーリングし、結果を合計します
  4. クリッピング プレーン距離でスケーリングされたルックアット ベクトルを追加します。

実際には、次のようになります。

p = at * near_clip_dist + x * right + y * up

ここで、x と y は次のとおりです。

x = (screen_x - screen_centre_x) / (width / 2) * view_width
y = (screen_y - screen_centre_y) / (height / 2) * view_height
于 2010-03-29T16:53:27.983 に答える
0

提案された式を自分のプログラムに直接プラグインしたところ、正しい結果が得られませんでした (デバッグが必要だった可能性があります)。私の最初の問題は、補間コーナーポイントの (x、y、z) 座標の誤解にあるようでした。X、Y、Z座標を別々に扱っていましたが、そうすべきではありません(カメラは任意の方向に向けることができるため、これはアプリケーションに固有のものである可能性があります)。代わりに、ソリューションは、ビュー プレーンのコーナー ポイントの単純な補間であることが判明しました。

  • 下隅のポイントを i 方向に補間して P1 を取得します
  • P2 を取得するために i 方向に上隅のポイントを補間します。
  • P1 と P2 を j 方向に補間して、最終点のワールド座標を取得します。
于 2010-04-01T01:34:33.063 に答える