我有一个以.OFF文件编码的3D网格物体。仅编码顶点,这些顶点的坐标和连通性。我在一些论文中读到3D网格可以在单位边界框中标准化。这究竟意味着什么?以及我们如何做到这一点?
答案 0 :(得分:1)
这意味着网格将适合由大小为1
的轴对齐多维数据集定义的空间,例如由角点A(-0.5,-0.5,-0.5)
和B(+0.5,+0.5,+0.5)
定义。
实现这一目标:
获取实际的边界框
循环浏览所有使用过的顶点并记住每个轴A0(xmin,ymin,zmin),B0(xmax,ymax,zmax)
的最小和最大坐标。
标准化为边界框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
(最大网格轴大小将完全适合新的边界框)然后重新缩放网格,而旧边界框的中心将是新的边界框的中心边界框也是。
一些网格还包括它们自己的变换矩阵。在这种情况下,您可以将此变换直接编码到此矩阵,使顶点保持原样。但通常如果需要网格规范化,那是因为一些顶点操作需要它并且通常更好地改变顶点...