首页 > 解决方案 > 如何计算 3D 折线拉伸的顶点?

问题描述

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

线

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

带拉伸段的线

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

带有单个挤压多缸的线

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

标签: c#3dmeshpolyline

解决方案


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

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

图。1

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

然后从向量ab定义相交椭圆:

图2

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

图3

这是一些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
}

推荐阅读