如何计算 3D 折线拉伸的顶点?

How to compute the vertices for a 3D polyline extrusion?

我有一条由多条线段组成的折线。这条线非常复杂,在 3D 中到处都是波浪形的,所以为了简单起见,我们假设它看起来像这样

我想用 3D 渲染它。目前,我做了一个非常简单的过程,我只为每个段生成一个圆柱体:

这很不错,但线条改变方向的地方看起来很糟糕。这也是一种浪费——每个方向变化都需要两倍于绝对必要的顶点。我会更喜欢生成这样的形状的方法:

起初我并不认为它会太难,但我对它的研究越多,我就越发现它非常不平凡。我在 C# 中工作,如果这是在 2D 中,我只会使用 Clipper,但我找不到任何库或资源来解决如何在 3D 中解决这个问题。如果解决方案并不总是完美的或者有时会导致自相交或类似的事情,那也没关系。有人有指导吗?

所以在数学意义上,两个圆柱体的交点是一个椭圆。如果我给你椭圆上半长轴点和半短轴的位置,你可以计算椭圆上的任何数量(如 numsides)节点。

取连接位于点p的两条线段的节点,定义椭圆的两个向量如下。 a是半长轴,b是半短轴

每个连接线段都有单位方向向量e_1e_2,圆柱体的半径为R.

然后相交椭圆将从向量 ab:

定义

然后在椭圆周围找到一个点 c 使用以下参数化 t = 0..1

这里有一些 C# 代码计算椭圆周围的 numsides

// Vectors p, a, b defined
for(int i=0; i<numsides; i++)
{
    double t = (1.0*i)/numsides
    Vector c = p + a*Math.Cos(2*Math.PI*t) + b*Math.Sin(2*Math.PI*t)
    // use/store c as needed for the mesh generation
}

我发现 this site 有一个优雅的解决方案。从构成折线的第一条线段周围的一些点开始,计算通过每个点的与当前线段平行的线与两条当前线段的交点形成的平面的交点。