【问题标题】:Filling a 2D curved concave shape in libgdx在 libgdx 中填充 2D 弯曲凹面形状
【发布时间】:2018-08-13 02:45:30
【问题描述】:

在 libgdx 中对弯曲凹形进行颜色填充的方法是什么?

让我们假设:

1) 要渲染的形状由一组彼此靠近的顶点构成。

2) 顶点之间的边是已知的。

3) 顶点的位置可能会随时间动态变化。我们保证不会发生自相交(并且形状不会是空心的)。

最右边的图片是我试图在 libgdx 中渲染的(有或没有轮廓)。

根据我的阅读,三角剖分是一种流行的非弯曲形状的方法,但为了让它看起来对有曲率的形状有好处,我想我们需要大量的顶点(这样很多线“缩小”类似于平滑曲线)。

【问题讨论】:

  • 你只有顶点还是它们的连通性?
  • @NicoSchertler 边缘也是已知的。
  • 然后三角测量就可以正常工作了。如果结果太粗糙,可以应用细分方案使结果更平滑。
  • @P.Lance:如果边缘已知,为什么要显示孤立的点?这是误导。
  • @P.Lance:如果您想要比给定折线更平滑的曲线,请尝试使用“闭合曲线”限制条件进行三次样条插值。

标签: java graphics libgdx


【解决方案1】:

Triangulatin 并不是唯一的方法。我不熟悉您的 gfx 库,但我会在低级别执行此操作:

  1. 将折线细分为一组凸折线

    您需要知道哪一段是直线,哪一段是曲线,对于曲线,您还需要知道相邻面片的控制点,以便连接平滑。凹形边界可以通过角度变化交换符号这一事实来检测,所以如果你得到具有一致宽度规则的结果点p(0)...p(n),那么

    d(i  ) = p(i+1)-p(i  )
    d(i-1) = p(i  )-p(i-1)
    n(i) = cross( d(i) , d(i-1) )
    n(i).z * n(i-1).z < 0.0
    

    因此叉积将为您提供法线,如果法线的方向交换,则表示绕组已更改...该等式假设点位于xy 平面或平行于它。如果不是这样,最后一行应该是

    dot( n(i) , n(i-1) ) < 0.0
    

    如果p(i) 是你的凹边界,你应该用它分割你的形状

  2. 填充折线

    您可以使用与三角形或凸多边形相同的方法,请参阅:

  3. 渲染折线轮廓

如果您没有快速像素访问或可用的水平线渲染,这不是一个好方法。有一个简单但不那么快的选择:

  1. 渲染轮廓

  2. 内填水

    这一步很慢,可能会导致更大的分辨率出现问题。

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多