1

我正在通过 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;
    }
}
4

1 回答 1

1

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

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

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

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

于 2013-10-15T04:33:31.377 回答