在这里,我正在尝试将光线投射添加到真实的3D场景中。众所周知,在光线投射中,为了投射光线,我们需要获得光线的方向。光线中的第一个点是光线的起点,我可以从glLookAt获得。光线中的第二个点是屏幕中的每个点。在最初的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内核函数中将屏幕坐标转换为世界坐标的提示?
答案 0 :(得分: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)转换为世界空间。那就是世界空间坐标。
我现在正试图实现这一点,我认为这个想法没问题,实施后我会接受这个答案。