0

在这里,我尝试将光线投射添加到真实的 3D 场景中。众所周知,在光线投射中,为了投射光线,我们需要获取光线的方向。射线中的第一个点是射线的起点,我可以从 glLookAt 获得。射线中的第二个点是屏幕中的每个点。在原始的CUDA ray-casting SDK中,它通过以下代码在Kernel Function中获取屏幕点:

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 回答