近似平滑多边形网格的最佳曲线类型是什么
What is the best type of curve to approximate a smoothed polygonal mesh
我有一个由顶点和三角形组成的 3D 网格。我知道顶点的位置和平滑法线,以及三角形的平面法线。
我想计算通过 2 个给定顶点的曲线段,仅使用它们的位置和法线。
现在,我正在使用 Catmull Rom spline,但它需要 4 个点来绘制 1 个曲线段,如这张简单网格的切片视图所示:
要绘制B和C之间的黄色曲线段,对应于红色边缘的估计曲率,我必须使用顶点A、B、C和D的位置
其他青色段用同样的方法绘制。
我想仅使用线段顶点中的数据来计算每个曲线线段。这里只使用B和C的位置和法线作为输入数据来计算黄色曲线段......并且在计算所有段的曲线时仍然保持均匀的整体形状
我不确定这条曲线是否适合表示在使用简单的 3D 漫反射着色渲染时由网格的平滑法线显示的模拟曲率,因此我想知道在这种精确情况下,哪种其他类型的曲线可能更匹配。
也许还有一个更适应于仅使用两点的位置和法线作为输入的约束。
谢谢! :)
编辑:
按照 Fang 的建议使用 Hermite 样条的结果:
这对我来说是完美的。再次感谢:)
如果你只是想在两个端点和两个端点法向量之间进行插值,你可以使用三次Hermite曲线。 Cubic Hermite curve 由两个端点和两个端一阶导数定义。由于顶点处没有一阶导数,因此可以从顶点 normal
推断它们
给定顶点 B 和 C 以及顶点法线 Nb 和 Nc,
- 通过将向量 S = 1/3* (C - B) 投影到由顶点 B 及其顶点法线 Nb 定义的平面上,在顶点 B 构造一阶导数。
- 通过将相同的向量 S 投影到由顶点 C 及其顶点法线 Nc 定义的平面上,在顶点 C 处构造一阶导数。
- 三次 Hermite 曲线现在已完全定义,因为我们有两个端点(顶点 B 和 C)和两个一阶导数。它将插入顶点 B 和 C,其在 B 和 C 处的切线将垂直于法线。
如果vector(BC)已经垂直于法线Nb和Nc,则三次Hermite曲线将变为直线
这样构造的三次Hermite曲线只利用了顶点B和C之间的线段内的数据,因此很可能无法平滑地连接到相邻的曲线段。如果您想避免这个问题,那么您将不得不利用来自相邻段的数据。不是将向量 S = 1/3*(C-B) 投影,而是将向量 Sb 和 Sc 分别投影到顶点 B 和 C 的平面上,其中
Sb = m*(A + C - 2*B)/2,
Sc = m*(B + D - 2*C)/2.
并且 m 是常数(通常 < 1.0)以调整一阶导数的大小。
这样BC段和AB段在顶点B处的一阶导数相同,保证BC段和AB段顺利连接
我有一个由顶点和三角形组成的 3D 网格。我知道顶点的位置和平滑法线,以及三角形的平面法线。 我想计算通过 2 个给定顶点的曲线段,仅使用它们的位置和法线。
现在,我正在使用 Catmull Rom spline,但它需要 4 个点来绘制 1 个曲线段,如这张简单网格的切片视图所示:
要绘制B和C之间的黄色曲线段,对应于红色边缘的估计曲率,我必须使用顶点A、B、C和D的位置 其他青色段用同样的方法绘制。
我想仅使用线段顶点中的数据来计算每个曲线线段。这里只使用B和C的位置和法线作为输入数据来计算黄色曲线段......并且在计算所有段的曲线时仍然保持均匀的整体形状
我不确定这条曲线是否适合表示在使用简单的 3D 漫反射着色渲染时由网格的平滑法线显示的模拟曲率,因此我想知道在这种精确情况下,哪种其他类型的曲线可能更匹配。 也许还有一个更适应于仅使用两点的位置和法线作为输入的约束。
谢谢! :)
编辑:
按照 Fang 的建议使用 Hermite 样条的结果:
如果你只是想在两个端点和两个端点法向量之间进行插值,你可以使用三次Hermite曲线。 Cubic Hermite curve 由两个端点和两个端一阶导数定义。由于顶点处没有一阶导数,因此可以从顶点 normal
推断它们给定顶点 B 和 C 以及顶点法线 Nb 和 Nc,
- 通过将向量 S = 1/3* (C - B) 投影到由顶点 B 及其顶点法线 Nb 定义的平面上,在顶点 B 构造一阶导数。
- 通过将相同的向量 S 投影到由顶点 C 及其顶点法线 Nc 定义的平面上,在顶点 C 处构造一阶导数。
- 三次 Hermite 曲线现在已完全定义,因为我们有两个端点(顶点 B 和 C)和两个一阶导数。它将插入顶点 B 和 C,其在 B 和 C 处的切线将垂直于法线。
如果vector(BC)已经垂直于法线Nb和Nc,则三次Hermite曲线将变为直线
这样构造的三次Hermite曲线只利用了顶点B和C之间的线段内的数据,因此很可能无法平滑地连接到相邻的曲线段。如果您想避免这个问题,那么您将不得不利用来自相邻段的数据。不是将向量 S = 1/3*(C-B) 投影,而是将向量 Sb 和 Sc 分别投影到顶点 B 和 C 的平面上,其中
Sb = m*(A + C - 2*B)/2,
Sc = m*(B + D - 2*C)/2.
并且 m 是常数(通常 < 1.0)以调整一阶导数的大小。
这样BC段和AB段在顶点B处的一阶导数相同,保证BC段和AB段顺利连接