2013-06-27 62 views
4

我正在尝试使用Three.js将一个几何体变形为另一个几何体。这是我迄今为止所做的(参见http://stemkoski.github.io/Three.js/Morph-Geometries.html了解实例)。Three.js - 变形几何体和细化三角网格

我正在尝试从一个小多面体转变为一个更大的立方体(既是三角形的,也是以原点为中心)。动画是通过着色器完成的。较小多面体上的每个顶点都有两个关联的属性,它们的最终位置和最终的UV坐标。为了计算每个顶点的最终位置,我从原点通过较小的多面体的每个顶点发射光谱,并找到与较大立方体的交点。为了计算最终的UV值,我使用重心坐标和较大立方体的相交面的顶点处的UV值。

这导致了一个不可怕但不是很好的第一次尝试。由于(通常)较大立方体的顶点没有一个是较小多面体的任何顶点的最终位置,因此立方体表面的大块缺失。所以接下来我通过添加更多的顶点来细化较小的多面体,如下所示:对于较大立方体的每个顶点,我朝向原点发射光线,并且每条光线与较小多面体的一个面相交,然后移除该三角形面并添加点十字路口和三个较小的面来代替它。现在变形更好(这是上面链接的活动示例),但变形仍不会填充整个体积。

我最好的猜测是,除了将较大的立方体的顶点投影到较小的多面体之外,我还需要投影边 - 如果A和B是由较大立方体上的边连接的顶点,则这些顶点在较小的多面体上的投影也应该通过边缘连接。但是,当然有可能投影的边将会跨过多个已存在的小三角形的网格中的多边形,需要添加多个新的顶点,retriangularization等。看来,我真正需要的是一种算法计算两个三角网格的共同细化。有没有人知道如上所述的变形(具有不同三角形化的两个网格之间)的这种算法和/或示例(带有代码)?

回答

7

事实证明,这是一个复杂的问题。在技​​术文献中,我感兴趣的算法有时被称为“地图叠加算法”。我正在构建的网格有时被称为“超级网格”。

一些有用的作品我一直在阅读有关此问题包括:

我已经开始写了一系列的演示,建立以实现上面提到的要解决我原来的问题文献讨论的算法所需要的机械。到目前为止,这些包括:

还有还需要做更多的工作;我会在我额外取得进展的同时定期更新这个答案,并且仍然希望其他人有信息作出贡献!