【问题标题】:Finding all quads in a mesh查找网格中的所有四边形
【发布时间】:2013-10-22 18:16:45
【问题描述】:

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

【问题讨论】:

    标签: javascript three.js mesh


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,我认为你是对的,这是用户定义的问题。我可能需要重新考虑我是如何尝试做到这一点的,如果没有别的,我会获得更大的灵活性。
    • 顺便说一句,我只记得一些 3d 包确实将这些信息导出为所谓的“平滑组”。具有相同组 id 的三角形是一个原始多边形。我不知道three.js是否会暴露这一点。
    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 2015-08-21
    • 2012-12-06
    • 2012-11-10
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多