光线投射的优化

时间:2019-01-16 00:00:12

标签: graphics 3d raycasting

我一直想从头开始构建3D引擎,这是编码方面的挑战,最终目的是在幻想控制台上实现它。 我发现的最佳方式(即最简单?)是光线追踪/光线投射。在网上寻找射线投射算法并仅找到多边形点问题(只能告诉我射线是否与多边形相交,我并没有太多兴趣,因为我没有关于第一个交点的信息),也没有交叉点。

我能想到的唯一解决方案是通过以较小的间隔移动射线来强行强制射线,并每次检查该点是否被某物占据(这将需要填充形状并且不会让我具有2D形状)因为它们永远不会被渲染,尽管这些都不是问题)。尽管如此,从性能角度来看,它看起来还是太复杂了。

据我所知,大多数问题都是使用线性代数解决的,但我没有能力自己建立一个解决方案。这个问题有切实可行的解决方案吗?

编辑:我刚刚找到了2D的代数解决方案,可以在3D中进行扩展。这个想法是:

  • 对于每个边缘,检查两个顶点之一是否在视场中(即,如果O是每条射线的原点,P是顶点,则必须首先检查该点是否在该点的远点之内视线,然后与前向矢量的角度是否小于视角。如果两个顶点中的至少一个在视场内,则将它们添加到数组E中。
    • 如果我们有一个要发射的射线阵列R和一个关于命中点信息的阵列阵列I,我们可以为R中的每个射线以及E中的每个边缘循环,然后在I中存储f(ray,edge) ,其中f是一个函数,可为我们提供有关射线和边缘是否碰撞以及它们在哪里碰撞的信息。
    • f使用基本的线性代数:出于所有目的,射线和边缘都是两个部分。两个线段只是两条线的一部分。假设如果边具有顶点A和B(AB是从A到B的向量),而远点称为P(OP是从O到P的向量)。我们可以创建由A +ηAB和O +λOP定义的两条线r和s。在检查r和s是否平行之后(检查AB和OP的点积的绝对值是否等于AB的范数乘以OP的范数),获取η和的值很简单。 λ。
    • 现在,如果η<0或η> 1,我们认为这两个段没有碰撞。
    • 对每条光线和每条边完成此操作后,我们比较I中每个数组i中的每个元素,以查看哪个元素具有最低的λ。最低的λ发生第一次碰撞,因此数据显示在屏幕上。

这里的一切都是线性代数,尽管我担心它可能在计算上仍然很繁琐,因为正在进行的工作很多,而且仍然只有2D。

0 个答案:

没有答案