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

时间:2016-08-14 07:26:31

标签: c++ 3d mesh

我有一个以.OFF文件编码的3D网格物体。仅编码顶点,这些顶点的坐标和连通性。我在一些论文中读到3D网格可以在单位边界框中标准化。这究竟意味着什么?以及我们如何做到这一点?

1 个答案:

答案 0 :(得分:1)

这意味着网格将适合由大小为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. 标准化为边界框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(最大网格轴大小将完全适合新的边界框)然后重新缩放网格,而旧边界框的中心将是新的边界框的中心边界框也是。

    一些网格还包括它们自己的变换矩阵。在这种情况下,您可以将此变换直接编码到此矩阵,使顶点保持原样。但通常如果需要网格规范化,那是因为一些顶点操作需要它并且通常更好地改变顶点...

相关问题