如何计算 3D 折线挤出的顶点?

问题描述

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

enter image description here

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

line

这很不错,但在线条改变方向的地方看起来很糟糕。这也是一种浪费——每次改变方向都需要两倍于严格要求的顶点。如果采用生成这样的形状的方法,我会更高兴:

line with extruded segments

起初我并不认为它会太难,但我越努力,我就越发现它出奇的不平凡。我正在使用 C#,如果这是在 2D 中,我只会使用

line with a single extruded polycylinder

,但是我找不到任何库或资源来解决如何在 3D 中解决这个问题。如果解决方案并不总是完美的,或者有时会导致自相交或这种性质的事情,那也没关系。任何人有任何指导吗?

解决方法

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

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

fig1

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

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

fig2

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

fig3

这是一些计算椭圆周围 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 有一个优雅的解决方案。从构成多段线的第一条线段周围的一些点开始,计算平行于穿过每个点的当前线段的线与由两条当前线段相交形成的平面的交点。

enter image description here

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...