两个相交多边形之间的平滑过渡(有趣的问题)

时间:2011-08-02 04:19:18

标签: graphics polygons

我有一个有趣的问题,我一直试图解决。没有“正确”的解决方案,因为没有严格的成功标准。我想要完成的是两个简单多边形之间的平滑过渡,从多边形A到多边形B.多边形A完全包含在多边形B中。

我对这种转变的标准是:

  1. 过渡在时间和空间上是连续的
  2. 从多边形A“填充”到多边形B的区域应该被填充,好像A中的液体倾泻成B形状
  3. 重要的是,这个动画可以动态计算,也可以由一组需要很小空间的参数定义,比如少于几Kb。
  4. 作弊是完全正常的,任何解决这个问题的方法都是可行的解决方案。

    我考虑过的解决方案,并且大多数都被排除在外:

    • 在A和B中配对顶点并简单插值。看起来不好看,在凹面多边形的情况下不起作用。
    • 将区域B-A划分为凸多边形,可能是Voronoi图,并通过在较小的凸多边形上执行BFS来计算多边形的离散状态。然后我在离散状态之间进行插值。注意:如果多边形B-A是凸的,则转换相当简单。我没有采用这种解决方案,因为将B-A分成相同大小的小凸多边形是非常困难的
    • 模拟:细分多边形A.沿着多边形线以离散但小的步长移动每个顶点法线(向外)。对于每个步骤,检查顶点是否仍在B内。如果不是,则移回到先前位置。重复直到A等于B.我不喜欢这个解决方案,因为检查顶点是否在多边形内部是很慢的。

    有人有任何不同的想法吗?

1 个答案:

答案 0 :(得分:0)

如果你想保持这个简单而有点快,你可以继续你的最后一个想法,你考虑缩放多边形A,以便它逐渐填充多边形B.你不必检查是否缩放 - 向外顶点仍在多边形B内。根据您的代码环境和API的不同,您可以使用多边形B的轮廓屏蔽扩展多边形A的像素。

在现代OpenGL中,您可以在片段着色器中执行此操作。您必须将多边形B渲染到纹理,将该纹理发送到着色器,然后使用该纹理查找正在渲染的当前片段是否映射到由多边形B设置的纹理值。如果不是,片段被丢弃了。您需要使纹理与屏幕一样大。如果没有,您需要在着色器中包含一些相机计算,以便您可以#34;渲染"片段测试到纹理的方式与将多边形B渲染到该纹理中的方式相同。