计算和显示3D三角形网格上的色带的算法

时间:2016-03-14 13:23:23

标签: graphics geometry computational-geometry mesh vector-graphics

我正在寻找以下问题的算法:

假设:

  1. 3D三角网格。网格代表地球表面的一部分。

  2. 折线(连接的一系列线段),其顶点始终位于网格的三角形的边缘或顶点上。折线代表地球表面道路的中心线。

  3. 我需要计算并显示道路,即在中心线的每一侧添加道路宽度的一半,计算网格的相应三角形中的结果顶点,填充道路区域和轮廓道路的两侧。

    最简单和/或最有效的策略是什么?如何最有效地存储道路数据?

1 个答案:

答案 0 :(得分:2)

我在这里看到两个选项:

  1. 使用道路纹理渲染粗多段线

    在渲染折线时,您需要TBN矩阵,因此请使用

    • 折线切线为tangent
    • 表面法线为normal
    • binormal=tangent x normal

    将实际点p位置移至

    p0=p+d*binormal
    p1=p-d*binormal
    

    并渲染纹理线(p0,p1)。这种方法与表面网格不精确匹配,因此您需要禁用深度或使用某种混合。同样在急转弯时,它可能会错过曲线的某些部分(在这种情况下,您可以渲染矩形或圆盘而不是线。

  2. 通过将折线移动到两半路径来创建网格

    这会产生网格精确的道路适应性,但由于您的限制,在某些情况下,如果没有网格重新三角测量,道路的形状可能会非常扭曲。我觉得这样:

    road

    1. 对于每一段道路施放2条线路移动了一半的道路规模(绿色,棕色)
    2. 找到与当前道路控制点(红点)共用的网格边缘的交点(浅绿色点)
    3. 从交叉点获得平均点(品红点)并将其用作道路网格顶点。如果其中一个点在共享网格之外,则忽略它。如果两个交叉点都在共享边缘之外,则找到与不同边缘最近的交叉点。
    4. 正如您所看到的,在某些情况下,这会导致严重的道路厚度扭曲(交叉点之间的差异很大,或者其中一个交叉点位于表面网格边缘之外)。

      如果您需要精确的道路厚度,请使用铸造线路的交叉点作为道路控制点。要使渲染时使用混合或禁用深度,或者通过重新三角化曲面网格将此点添加到曲面的网格中。粗糙的这样的动作也会影响道路网格,你需要迭代几次......

      另一种方法是使用混合纹理用于道路(如精灵)并计算控制点的纹理坐标。如果道路太厚,那么通过移动纹理坐标来缩小它...为了使这项工作,您需要选择最远的交叉点而不是平均值...计算道路的实际半尺寸并从该计算纹理坐标

      如果你摆脱了道路顶点指向表面网格段或顶点的限制(对于道路网格),那么你可以简单地单独使用移动线的交点。这将消除厚度伪影并简化很多事情。