首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在三维三角形网格上计算和显示带状的算法

在三维三角形网格上计算和显示带状的算法
EN

Stack Overflow用户
提问于 2016-03-14 13:23:23
回答 1查看 599关注 0票数 0

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

给予:

  1. 三维三角形网格。网格代表了地球表面的一部分。
  2. 一种多边形(连接的一系列线段),其顶点总是在网格三角形的边缘或顶点上。这条折线代表了地面上道路的中心线。

我需要计算和显示道路,即在中线两边增加一半的道路宽度,在网格的相应三角形中计算得到的顶点,填充道路的面积并勾勒出道路的两侧。

要做到这一点,最简单和/或最有效的策略是什么?如何最有效地存储道路数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-15 09:04:58

我在这里看到两种选择:

  1. 用道路纹理渲染粗折线 在渲染polyline时,您需要TBN矩阵,所以请使用
代码语言:javascript
复制
- polyline tangent as `tangent`
- surface normal as `normal`
- `binormal=tangent x normal`

将实际点p位置移到

p0=p+d*binormal p1=p-d*双正规

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

  1. 通过将折线移动到半边的来创建网格。 这会产生网格精确的道路拟合,但由于你的限制,道路的形状可能会非常扭曲,没有网格重新三角剖分在某些情况下。我是这样看的:
代码语言:javascript
复制
1. for each segment of road cast 2 lines shifted by half of road size (green,brown)
2. find their intersection (aqua dots) with shared edge of mesh with the current road control point (red dot) 
3. obtain the average point (magenta dot) from the intersections and use that as road mesh vertex. In case one of the point is outside shared mesh ignore it. In case both intersections are outside shared edge find closest intersection with different edge.

如您所见,在某些情况下,这会导致严重的道路厚度扭曲(交点之间的差异很大,或者交点之一在表面网格边缘外)。

如果您需要准确的道路厚度,然后使用相交的铸造线作为道路控制点。为了使它成为可能,要么使用混合或禁用深度,同时渲染或添加这一点到网格的表面重新三角剖分表面网格。粗的,这样的动作也会影响道路网,你需要迭代几次.

另一种方法是将混合纹理用于道路(如精灵),并计算控制点的纹理坐标。如果道路太厚,那就通过移动纹理坐标来细化它.为了完成这项工作,你需要选择最远的交点,而不是平均.计算道路的实际一半大小,并由此计算纹理坐标。

如果您摆脱了道路网格的限制,即道路顶点点位于表面网格段或顶点,那么您可以单独使用移位线的交点。这将消除厚度的工件,并简化很多事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35988791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档