我的想法是将3D地形的坐标存储在nxn矩阵中。然后基于地形网格对该线进行分段。接下来,我将从最靠近线的网格开始,并尝试计算该平面是否与线相交,如果是,则获取该坐标并退出。如果没有,则继续下一个片段。
但是,我的算法是否最佳或最优解?或者是否存在已经实现此功能的库?
并非直接优化,只是一些提示:
如果您的网格很大,建议从地形中构建八叉树,以便快速减少您必须检查线路的网格节点数。这在巨大的网格(如512 * 512个节点)中可能更有效,因为只有通过射线的叶节点必须考虑。
此外,八叉树可以用作决定哪些部分的网格是可见的,因此必须绘制,方法是检查哪些叶节点在视锥体内。
然而,有一个问题:必须提前构建八叉树,需要一些时间,并且该树是静态的。一旦构建完成后,它不能轻松修改,因为对一个节点的修改可能会影响其他几个节点,不一定是相邻的节点。
但是,如果您不打算在创建网格后修改它,则八叉树将非常有用。
更新
现在我理解了你计划如何存储网格,我相信空间分割将是一种有效的方法来查找交叉线的最近邻居。
线性查找最近邻居的运行时间复杂度为O(N),而空间分割方法的平均运行时间复杂度为O(log N)。
如果地形不是通过一个好的函数建立的,那么你将不得不进行光线追踪,即逐步遍历该线以找到交点。这个过程可能需要一些时间。
该过程有几个参数。例如,有一个偏移量,你在每一步沿着该线行走。如果你取一个太大的偏移量,你可能会忽略地形的一些“高度”,从而无法得到正确的交点。如果偏移量太小,它会减慢你的过程。
然而,有一个很好的技巧可以节省时间。它在这里或这里中进行了描述。它使用某种优化结构来处理地形,即按以下方式构建几个细节级别:最精细的细节级别仅是地形本身。下一个(更粗糙的)细节级别仅包含地形纹理中原始“像素”数量的四分之一,并将4个像素组合成一个,取最大值。下一个细节级别类似地构建:
. . . .
... . ... .. .
....... .... .. .
........ => .... => .. => .
01234567 0246 04 0
1357 26 4
fine => => => => => coarse
如果现在进行光线投射,则首先检查较粗的细节级别:
/
/
/.
.
.
.
如果光线已经错过了粗略的细节级别,就不必检查更细的级别。这只是优化工作的一个非常粗略的想法。但它运行得相当不错。实现它需要相当多的工作,但这篇论文是一个很好的帮助。