4

私は現在、正常に動作する GLSL でのレイキャスティングに取り組んでいます。とにかく、正射影から透視投影に移行したいのですが、適切に行う方法がわかりません。レイキャスティングで射影マトリックスを使用する方法に関する良いリンクはありますか? マトリックスを何に適用する必要があるのか​​ さえわかりません(おそらく、何らかの形でレイの方向に?)。今、私はこのようにしています(疑似コード):

vec3 rayDir = (0.0, 0.0, -1.0); //down the negative -z axis in parallel;

しかし今は、gluPerspective 関数と同様に機能する projMatrix を使用して、アスペクト比、fov、近距離および遠距離の平面を簡単に定義できるようにしたいと考えています。基本的に、誰かが私に同様のプロジェクトマトリックスを設定するためのコードのチャンクを提供できgluProjectionますか? 次に、それを rayDirection で乗算するのが正しいかどうか教えてください。

4

5 に答える 5

6

光線をシーンに放つには、射影行列が適用された後の世界に自分自身を (精神的に) 配置することから始めます。これは、視錐台が 2x2x1 のボックスになったことを意味します。これは標準ビュー ボリュームとして知られています。(ボックスの反対側の角は (-1, -1, 0) と (1, 1, -1) です。) 生成する光線は (投影後の変換された世界で) 原点から始まり、背面に当たります。クリッピング プレーン (z=-1 にあります)。最初の光線の「宛先」は (-1, 1, -1) - ファー クリッピング プレーンの左上隅である必要があります。(後続の光線の「宛先」は、ビューポートの解像度に基づいて計算されます。)

この光線が正準ビュー ボリュームにあるので、それを標準の世界座標に入れる必要があります。これどうやってやるの?シンプル - 射影行列の逆数を掛けるだけで、しばしば表示変換と呼ばれます。これにより、光線がシーン内のオブジェクトと同じ座標系に配置され、光線の衝突テストが簡単になります。

于 2010-03-04T14:32:47.543 に答える
1

光線を変更しようとしないでください。代わりにこれを行います:

a) カメラの位置/回転を使用してマトリックスを作成します。b) マトリックスを反転します c) シーン内のすべてのモデルに適用します d) 通常の方法を使用してレンダリングします。

これは、実際に OpenGL が行う方法でもあります。カメラを右に回転させることは、ワールドを左に回転させることと同じです。

于 2010-03-02T20:28:02.883 に答える
0

Google検索からここにたどり着いた後、これに答えます。

既存の回答は、元の質問の理解の欠如を見逃しているようです。

レイキャスティングがナンセンスなときに射影行列を適用する必要があるという考え

ビュー プレーンから開始し、各ピクセルに対して同じ方向にレイトレーシングすることにより、直交レイキャストを作成します。光線の原点はピクセルごとに変化します

ビュー プレーンの後ろの目の位置から開始し、各ピクセルに固有の方向をレイトレーシングすることによって、パースペクティブ レイキャストを作成します。つまり、光線の原点は固定されており、すべてのピクセルで同じです。

射影行列はそれ自体であり、それらが通常関与するプロセスはレイキャスティングから派生したものであることを理解してください。遠近法マトリックスは、私が説明した種類のレイキャストをエンコードします。

画面上にポイントを投影することは、目/ビュー プレーンからポイントに光線をキャストし、ビュー プレーンとの交点を見つけることです...

于 2013-10-29T16:08:04.283 に答える