Javascript 查找网格中的所有四边形

Javascript 查找网格中的所有四边形,javascript,three.js,mesh,Javascript,Three.js,Mesh,我正在通过Three.js加载一个网格,并尝试对每个四边形分别进行纹理处理。现在我可以对每个面(tri)进行纹理处理,但我不确定如何确定当前三角形和最后一个三角形是否是四边形的一部分(它们将共享两个顶点,但哪些顶点?) 我怎样才能知道两个三角形是否构成一个四边形 var last = null; for(var i in geometry.faces) { var face = geometry.faces[i]; var normal = face.normal.clone()

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

我怎样才能知道两个三角形是否构成一个四边形

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;
    }
}

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

第一步是找到每个三角形的所有邻居。每个三角形正好有3个邻居。这是一个有趣的两遍算法,在时间和内存上应该是线性的。每个三角形都应该有类似于邻居[3]的东西,它们是其他三角形的索引

然后你可以为每一个计算一个“四边形”启发式。它们应该大致共面和矩形。我会用四条边上的法线和内角得分。一旦你有了这些,你可以按照这个数字对所有三角形进行排序。首先去掉最好的猜测,将它们合并成一个四元组,然后继续进行,直到完成为止


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

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

第一步是找到每个三角形的所有邻居。每个三角形正好有3个邻居。这是一个有趣的两遍算法,在时间和内存上应该是线性的。每个三角形都应该有类似于邻居[3]的东西,它们是其他三角形的索引

然后你可以为每一个计算一个“四边形”启发式。它们应该大致共面和矩形。我会用四条边上的法线和内角得分。一旦你有了这些,你可以按照这个数字对所有三角形进行排序。首先去掉最好的猜测,将它们合并成一个四元组,然后继续进行,直到完成为止


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

谢谢,我认为您是对的,这是一个用户定义的问题。我可能需要重新思考我是如何做到这一点的,如果没有其他的话,那就是为了更大的灵活性。顺便说一句,我记得一些3d软件包确实会将这些信息导出为所谓的“平滑组”。具有相同组id的三角形是一个原始多边形。我不知道three.js是否会暴露这一点。谢谢,我认为你是对的,这是一个用户定义的问题。我可能需要重新思考我是如何做到这一点的,如果没有其他的话,那就是为了更大的灵活性。顺便说一句,我记得一些3d软件包确实会将这些信息导出为所谓的“平滑组”。具有相同组id的三角形是一个原始多边形。我不知道three.js是否会暴露这一点。