如何在单位边界框中规范化3D非彩色网格

How to normalize a 3D non colored Mesh in a unit bounding box

本文关键字:规范化 3D 非彩色 网格 单位 边界      更新时间:2023-10-16

我有一个3D网格编码在一个。off文件。只有顶点、这些顶点的坐标和连通性被编码。我在一些论文中读到3D网格可以在单位边界框中规范化。这到底是什么意思?我们该怎么做呢?

这意味着网格将适合由大小为1的轴对齐立方体定义的空间,例如由角定义:A(-0.5,-0.5,-0.5)B(+0.5,+0.5,+0.5)

实现:

  1. 获取实际边界框

    所以循环通过所有使用的顶点,并记住每个轴的最小和最大坐标A0(xmin,ymin,zmin),B0(xmax,ymax,zmax)

  2. Normalize to bounding box A,B

    所以再次循环遍历每个顶点并重新计算它们(通过线性插值)。例如:

    Vertex[i].x=A.x + (B.x-A.x)*(Vertex[i].x-A0.x)/(B0.x-A0.x)
    Vertex[i].y=A.y + (B.y-A.y)*(Vertex[i].y-A0.y)/(B0.y-A0.y)
    Vertex[i].z=A.z + (B.z-A.z)*(Vertex[i].z-A0.z)/(B0.z-A0.z)
    

    问题是,这将不尊重纵横比。如果你需要网格保留它,那么你需要将其更改为:

    scale = min((B.x-A.x)/(B0.x-A0.x)),
                (B.y-A.y)/(B0.y-A0.y),
                (B.z-A.z)/(B0.z-A0.z))
    Vertex[i].x=(Vertex[i].x-0.5*(A0.x+B0.x))*scale+0.5*(A.x+B.x)
    Vertex[i].y=(Vertex[i].y-0.5*(A0.y+B0.y))*scale+0.5*(A.y+B.y)
    Vertex[i].z=(Vertex[i].z-0.5*(A0.z+B0.z))*scale+0.5*(A.z+B.z)
    

    希望我没有犯任何错误,因为我在SO/SE编辑器中导出了它。我们的想法是计算不超过新边界框大小的最大scale(最大网格轴大小将完全适合新的边界框),然后重新缩放网格,同时旧边界框的中心也将成为新边界框的中心。

    一些网格还包含它们自己的变换矩阵。在这种情况下,你可以将这个变换直接编码到这个矩阵,保持顶点不变。但通常如果需要网格归一化,那是因为一些顶点操作需要它,通常最好改变顶点…