如何在单位边界框中规范化3D非彩色网格
How to normalize a 3D non colored Mesh in a unit bounding box
我有一个3D网格编码在一个。off文件。只有顶点、这些顶点的坐标和连通性被编码。我在一些论文中读到3D网格可以在单位边界框中规范化。这到底是什么意思?我们该怎么做呢?
这意味着网格将适合由大小为1
的轴对齐立方体定义的空间,例如由角定义:A(-0.5,-0.5,-0.5)
和B(+0.5,+0.5,+0.5)
。
实现:
-
获取实际边界框
所以循环通过所有使用的顶点,并记住每个轴的最小和最大坐标
A0(xmin,ymin,zmin),B0(xmax,ymax,zmax)
。 -
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
(最大网格轴大小将完全适合新的边界框),然后重新缩放网格,同时旧边界框的中心也将成为新边界框的中心。一些网格还包含它们自己的变换矩阵。在这种情况下,你可以将这个变换直接编码到这个矩阵,保持顶点不变。但通常如果需要网格归一化,那是因为一些顶点操作需要它,通常最好改变顶点…
相关文章:
- 无法将结构注册为增强几何体3D点
- OpenGL大的3D纹理(>2GB)非常慢
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 如何从 3D 曲面网格中删除自相交三角形?
- 提升区域设置规范化带状字符,但不规范化重音
- CUDA 使用共享内存平铺 3D 卷积实现
- 检查框内的 3D 点
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 使用 C++在 OpenGL 中对 3D 多边形进行纹理处理
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- 如何使用条件计算 3D 网格中从一个点到另一个点的所有路径
- 在规范化 3d 向量时,在调用 sqrt 之前检查可以节省多少
- 规范化3d点数据到原点(c++)
- 如何在单位边界框中规范化3D非彩色网格
- 3D矢量规范化问题