查找立方体内光线的长度

时间:2010-11-22 17:10:18

标签: algorithm math shader

我有一条光线,从相机向外走,我需要找到立方体内光线的长度。请注意,相机可能位于立方体内部,在这种情况下,它应该返回到立方体边缘的距离。

这是一个着色器,所以它应该相对较小并且涉及最少的分支。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

要使光线与凸多面体相交,请将光线与包含每个面的平面相交。

假设光线从 q 开始并且方向 r 。然后,对于标量参数 t ,光线上的任何点都可以表示为 q + t r 。现在假设我们想要将此光线与等式 p · n = k 给出的平面相交(其中 n 是一个垂直于脸部的向外指向的单位)。

时光线与平面相交
  

q + t r )· n = k

  

q · n + t r · n = ķ

等等

  

t =( k - q · n )/ r · <强>名词

r · n 为负时光线进入面部,当 r · n 为正时退出光线。当 r · n 为零时,光线与脸部平行。您需要检查此案例以避免被零除;在这种情况下,如果 q · n &gt; k ,光线完全错过了多面体。

为多面体的所有面找到 t ,并让 t in 为最大 t 光线进入面部的点, t out 是光线射出面部的点的最小 t 。那么多面体内光线的长度是

  

max(max( t out ,0) - max( t in ,0),0 )/ | r |

如果 r 是单位矢量,则可以避免此处的除法。两个内部最大值( t ,0)是处理相机位于立方体内或立方体位于相机后面的情况所必需的。外部最大值(...,0)用于处理光线完全错过立方体的情况(在这种情况下, t 中将大于 <子>出)。

我担心我不知道如何用着色器语言表示这个计算,更不用说如何无分支地表示。

答案 1 :(得分:2)

如果你告诉我们你到底需要什么,那就好了。您可以通过渲染立方体然后读取包含从摄像机到立方体的每个可见点的距离的z缓冲区来轻松完成。中间的点是相机正在寻找的位置。

否则,您需要为立方体的每个平面执行ray-plane intersection,检查交叉点是否在立方体的范围内,并检查它是否在摄影机后面。您可以获得以下三种情况之一:

  1. 没有交叉点
  2. 一个交叉点 - 您在立方体内部,计算交叉点与摄像机位置之间的距离
  3. 两个交叉点 - 您在立方体之外,计算两个交叉点之间的距离
  4. 无限多个交叉点 - 视图矢量是立方体的切线,只是扔掉切线平面交点并且只占两个相邻平面的两个交点
  5. 您需要将多维数据集信息发送到着色器单元。所有着色器的计算都是相同的,所以我没有看到将它放在着色器中的一点 - 在CPU上计算一次会更好。此外,它涉及分支(我不知道如何避免它)。