我正在寻找以下问题的算法:
假设:
3D三角网格。网格代表地球表面的一部分。
折线(连接的一系列线段),其顶点始终位于网格的三角形的边缘或顶点上。折线代表地球表面道路的中心线。
我需要计算并显示道路,即在中心线的每一侧添加道路宽度的一半,计算网格的相应三角形中的结果顶点,填充道路区域和轮廓道路的两侧。
最简单和/或最有效的策略是什么?如何最有效地存储道路数据?
答案 0 :(得分:2)
我在这里看到两个选项:
使用道路纹理渲染粗多段线
在渲染折线时,您需要TBN矩阵,因此请使用
tangent
normal
binormal=tangent x normal
将实际点p
位置移至
p0=p+d*binormal
p1=p-d*binormal
并渲染纹理线(p0,p1)
。这种方法与表面网格不精确匹配,因此您需要禁用深度或使用某种混合。同样在急转弯时,它可能会错过曲线的某些部分(在这种情况下,您可以渲染矩形或圆盘而不是线。
通过将折线移动到两半路径来创建网格
这会产生网格精确的道路适应性,但由于您的限制,在某些情况下,如果没有网格重新三角测量,道路的形状可能会非常扭曲。我觉得这样:
正如您所看到的,在某些情况下,这会导致严重的道路厚度扭曲(交叉点之间的差异很大,或者其中一个交叉点位于表面网格边缘之外)。
如果您需要精确的道路厚度,请使用铸造线路的交叉点作为道路控制点。要使渲染时使用混合或禁用深度,或者通过重新三角化曲面网格将此点添加到曲面的网格中。粗糙的这样的动作也会影响道路网格,你需要迭代几次......
另一种方法是使用混合纹理用于道路(如精灵)并计算控制点的纹理坐标。如果道路太厚,那么通过移动纹理坐标来缩小它...为了使这项工作,您需要选择最远的交叉点而不是平均值...计算道路的实际半尺寸并从该计算纹理坐标
如果你摆脱了道路顶点指向表面网格段或顶点的限制(对于道路网格),那么你可以简单地单独使用移动线的交点。这将消除厚度伪影并简化很多事情。