1

特定の深度に基づいて、2D マウス座標を 3D 世界座標に変換する必要があります (レイキャスティング用です)。私は C++ で DirectX を直接使用しているわけではなく、独自の言語を使用していますが、C++ または疑似コード (C++ を推奨) で回答をいただければ、変換できます。

世界行列、ビュー行列、射影行列、およびさまざまな行列操作関数にアクセスできます。

vector4 を matrix4 で乗算する必要がある場合、vector4 と matrix4 の両方を使用できる唯一の関数は ですtransformVector4(vector4Source,matrix4Source)。それが重要な場合、どの順序でそれらを乗算するかわかりません。

どんな助けでも大歓迎です:)私はこれに何時間も取り組んできましたが、3D数学が得られません...

4

1 に答える 1

5

マウスをレイに変換するには、次のプロセスを実行します。

マウス座標をピクセル座標から -1/1 座標に変換します (-1、-1 は左下です)。

光線の原点は (近平面でのベクトル)

vector3 origin = vector3(mousex,mousey,0);

レイ エンドは (ファー プレーンでのベクトル)

vector3 far = vector3(mousex,mousey,1);

次に、これらのベクトルに変換を適用する必要があります。まず、そのための変換マトリックスを作成する必要があります。

matrix4x4 inverseviewproj = invertmatrix(view * proj)

この変換を両方のベクトルに適用します。

vector3 rayorigin = transform(origin, inverseviewproj);
vector3 rayend = transform(far, inverseviewproj);

光線の方向は :

vector3 raydirection = normalize(rayend-rayorigin);

以上で、レイキャスト機能を使用できるようになりました。

ベクトルを行列で変換するために vector4 にしかアクセスできない場合は、次のように w コンポーネントを 1 にする必要があります。

vector4 origin = vector3(mousex,mousey,0,1);
vector4 far = vector3(mousex,mousey,1,1);

方向を抽出するには、最初に vector4 を vector3 に変換してください (それ以外の場合は正規化に影響するため)。

于 2013-10-03T07:18:10.787 に答える