0

ここでは、実際の 3D シーンにレイキャスティングを追加しようとしています。ご存知のように、レイキャスティングでは、レイをキャストするために、レイの方向を取得する必要があります。光線の最初の点は、glLookAt から取得できる光線の開始点です。光線の 2 番目の点は、画面内の各点です。元の CUDA レイキャスティング SDK では、以下のコードによってカーネル関数でスクリーン ポイントを取得します。

uint x = blockIdx.x*blockDim.x + threadIdx.x;
uint y = blockIdx.y*blockDim.y + threadIdx.y;

(x,y) は画面空間の座標ですよね? そのため、(x, y) をワールド空間座標に変換する必要があります。親切な人が、gluUnProject を使ってこの仕事をすると言った。いい考え!ただし、CUDA カーネルで OpenGL 関数を呼び出すことはできません。

可逆行列を使用して翻訳を行うことができるかもしれません。しかし、正しい方法についてはわかりません。CUDA カーネル関数で画面座標をワールド座標に変換する方法についてヒントをくれる人はいますか?

4

1 に答える 1

1

私の解決策は次のとおりです。CUDAカーネルでは、次の方法で画面座標を取得します。

uint x = blockIdx.x*blockDim.x + threadIdx.x;
uint y = blockIdx.y*blockDim.y + threadIdx.y;

実際には、画面が Z 軸に垂直な別の座標空間を表します。gluPerspective から、画面とビュー位置の間の距離も取得できます。ビューの位置がわかるので、画面の Z 座標を計算できます。したがって、画面内の各点の座標は、この特定の座標空間の下で (x,y,z) になります。

この特定の座標空間では、ビュー方向は Z 軸に平行です。また、ワールド空間での視線方向もわかっています。したがって、Z 軸に沿ったビュー方向 (特に上の座標空間) を実際のビュー方向 (ワールド空間) に変換する変換行列を計算する必要があります。

次に、この行列を使用して、画面 (x、y、z) 内の各ポイントをワールド空間に変換します。これがワールド空間座標です。

私は今これを実装しようとしています。このアイデアは問題ないと思います。実装後、この回答を受け入れます。

于 2012-05-29T02:54:23.760 に答える