查找网格中的所有四边形

时间:2013-10-15 03:29:54

标签: javascript three.js mesh quad

我正在通过Three.js加载一个网格,我正在尝试单独纹理每个四边形。现在我可以纹理每个面(三),但我不知道如何确定当前和最后一个三角形是否是四边形的一部分(它们将共享两个顶点,但是哪些顶点?)

如何确定两个三角形是否形成四边形?

var last = null;
for(var i in geometry.faces)
{
    var face = geometry.faces[i];
    var normal = face.normal.clone().normalize();

    if(normal.y >= 0.9999)
    {
        face.materialIndex = 1;

        //Determine if face & last are part of a quad
        if(face && last == same quad)
        {
            face.color = last.color;
        }
        else
        {
            face.color = new THREE.Color(Math.random() * 0xFFFFFF); 
        }

        last = face;
    }
}

1 个答案:

答案 0 :(得分:1)

首先,您需要意识到问题的定义不明确。在连接的三角形网格中,每个三角形都有3个邻居。它们中的每一个都可能是它的四边形。所以你只能猜测什么是四边形。您选择检查法线是一个好的开始,但是如果网格是一个平面则无法工作。

第一步是找到每个三角形的所有邻居。每个三角形恰好有3个邻居。这是一个有趣的两遍算法,应该是时间和内存的线性。每个三角形都应该有邻居[3] - 这是其他三角形的索引。

然后,您可以为每个人计算“四元”启发式算法。它们应该大致是共面的和矩形的。我会在四边用法线和内角进行评分。有了这些,你可以用这个数字对所有三角形进行排序。首先删除最佳猜测,将它们合并为四边形,然后继续操作直到完成。

这在大多数情况下应该可以正常工作,但是会出现这种情况。根据您需要四边形的原因,您可以尝试修复您的启发式功能以适合您的情况。但重要的是要记住,没有正确的解决方案。问题在于定义。