【问题标题】:Project a line segment onto a mesh将线段投影到网格上
【发布时间】:2018-07-25 22:25:46
【问题描述】:

为了实现下图中的红线,我必须寻找哪些图形/数学算法?

更好地解释它:我需要在网格上绘制两个点,然后生成从一个点到下一个点的直线段。这条线段将由沿其路径的每条边创建的新顶点形成。

我目前正在与CGALLibigl 合作,但他们似乎都没有解决方案。我尝试过CGAL::Surface_mesh_shortest_path,但它增加了太多开销(代码运行非常缓慢),并且根据网格变形,不能保证线是直的。

【问题讨论】:

  • IANAE,但我尝试解决此问题的基础是查找 projective texture mapping 的算法。你并不关心计算纹理坐标 (u,v) 的算法,但如果你想一想,计算正方形纹理边缘的模型空间坐标 (s,t) 的算法正是你在找什么。
  • 你说的是什么意思?您似乎在寻找测地线,这正是Surface_mesh_shortest_path 计算的结果。它不会比这更直(假设您的意思是曲线在切线空间中是直的)。计算表面上的测地线是一项相当艰巨的任务。这可能是它如此缓慢的原因。但是你可能会发现一些其他的使用关键字的实现;有一些近似算法,速度更快。
  • 你不需要一个法线(可能垂直于 p0-p1 向量)来投影线吗?
  • 如果你不需要坐标,只是为了渲染线条,为什么不使用着色器呢?如果渲染的片段相交(在附近)一些(半)平面或区域将其重新着色为红色......类似于Analysis of a shader in VR。如果您还需要折线,您可以从帧缓冲区中提取它...或使用计算着色器并直接存储它...

标签: c++ graphics geometry mesh cgal


【解决方案1】:

忽略您所说的“直接”,这是我能想到的一种简单算法,它会产生与问题中所示类似的图像。不能保证生成的路径是最短路径。我只是在这里吐口水,对该主题一无所知,可能有更好的方法。

选择 4 个变量:

  1. 起点
  2. 终点
  3. 线路正常
  4. 行进常数

让我们从变量中计算一些常数:

  1. 方向 = 终点 - 起点
  2. 增量向量 = normalize(Direction) * 行进常数。

从起点开始,通过某个常数向终点前进,检查当前位置的上方和下方,了解您在网格上的位置。您可以使用线的法线来了解“向上”和“向下”方向,以便执行相交测试。

在每个相交测试中,如果您在上下方向上都没有相交,那么您选择的法线将不适用于给定的两个点和网格,您必须尝试不同的法线。如果您最终与其中一个方向相交,则需要在最后一条线上添加 2 个点:计算的方向线上的一个点最靠近位于三角形上的起点,以及计算的方向线上的一个点最远从位于三角形上的开始。如果上方向和下方向都有交叉点,请选择要使用的上方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多