【问题标题】:How to compute the vertices for a 3D polyline extrusion?如何计算 3D 折线拉伸的顶点?
【发布时间】:2021-06-02 13:36:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能否展示一些关于如何定义线段以及如何计算每个圆柱体的几何形状的代码。
  • @AndréPopovitch 这是一个非常聪明的代码,尽管生成的圆柱体是一个内接在圆柱体上的挤压 n 边形网格。下一步将是扩展/修剪网格的附加循环,以便两个段共享节点。这里的复杂性是 n 边形的方向是随机的(请参阅normal 向量),因此两个连续的“圆柱体”将彼此成任意角度,从而使两个 n 边形的交点更加复杂。

标签: c# 3d mesh polyline


【解决方案1】:

所以在数学意义上,两个圆柱的交点是一个椭圆。如果我给你椭圆上的半长轴点和半短轴的位置,你可以计算椭圆上的任意数量(如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
}

【讨论】:

  • 哇,谢谢!自从发布这个问题以来,我遇到了这个链接:songho.ca/opengl/gl_cylinder.html#pipe,我认为这是一种类似的方法(计算棱镜的每条线与两个圆柱体应该相遇的平面的交点)。不过,我认为您的解决方案会更好地工作,我将立即尝试实施,并在完成后将其标记为已解决
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2013-05-20
    • 2014-09-25
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多