Algorithm 求立方体中光线的长度

Algorithm 求立方体中光线的长度,algorithm,math,shader,Algorithm,Math,Shader,我有一条光线,从相机向外,我需要找到立方体内部光线的长度。请注意,相机可能位于立方体内部,在这种情况下,相机应返回到立方体边缘的距离 它是用于着色器的,因此它应该相对较小,并且涉及最少的分支 有什么想法吗?要使光线与凸多面体相交,请使光线与包含每个面的平面相交 假设光线从q开始,方向为r。然后,对于标量参数t,射线上的任何点都可以表示为q+tr。现在假设我们想让这条光线与方程p·n=k给出的平面相交(其中n是一个垂直于面的向外指向单位)。光线与平面相交时 (q+tr)·n=k 就是什么时候, q

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

它是用于着色器的,因此它应该相对较小,并且涉及最少的分支


有什么想法吗?

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

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

q+tr)·n=k

就是什么时候,

q·n+tr·n=k

诸如此类

t=(k− q·n)/r·n

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

因此,为多面体的所有面求t,让tin为光线进入面的点的最大t,为光线离开面的点的最小t。那么光线在多面体中的长度是

最大值(最大值,0)− 最大值(锡,0),0)/|r|

如果r是一个单位向量,您可以在这里避免除法。两个内部最大值(t,0)是处理相机位于立方体内部或立方体位于相机后面的情况所必需的。外部最大值(…,0)用于处理光线完全未命中立方体的情况(在这种情况下,tin将大于tout)


恐怕我不知道如何用着色器语言表示此计算,更不用说如何无分支地表示了。

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

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

q+tr)·n=k

就是什么时候,

q·n+tr·n=k

诸如此类

t=(k− q·n)/r·n

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

因此,为多面体的所有面求t,让tin为光线进入面的点的最大t,为光线离开面的点的最小t。那么光线在多面体中的长度是

最大值(最大值,0)− 最大值(锡,0),0)/|r|

如果r是一个单位向量,您可以在这里避免除法。两个内部最大值(t,0)是处理相机位于立方体内部或立方体位于相机后面的情况所必需的。外部最大值(…,0)用于处理光线完全未命中立方体的情况(在这种情况下,tin将大于tout)


恐怕我不知道如何用着色器语言表示此计算,更不用说如何无分支地表示了。

如果您告诉我们您需要此计算的确切目的,那就好了。通过渲染立方体,然后读取z缓冲区(其中包含从摄影机到立方体每个可见点的距离),可以轻松完成此操作。中间点是摄像机所在的位置。

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

  • 无交叉路口
  • 一个交点-您在立方体内部,计算交点和摄影机位置之间的距离
  • 两个交点-您在立方体外部,计算两个交点之间的距离
  • 无限多个交点-视图向量与立方体相切,只需扔掉相切平面交点,只与两个相邻平面相交两次即可

  • 您需要将立方体信息发送到着色器单元。所有着色器的计算都是相同的,因此我认为将其放入着色器没有任何意义-最好在CPU上计算一次。此外,它还涉及到分支(我不知道如何避免它)。

    如果您告诉我们您到底需要它做什么就好了。通过渲染立方体,然后读取z缓冲区(其中包含从摄影机到立方体每个可见点的距离),可以轻松完成此操作。中间点是摄像机所在的位置。

    否则你