3D模型体素化(Voxelization)过程实现与分析(一)

文章目录

  • 体素化方法
    • 基于CPU的体素化方法
      • 三角面片距离方法
      • 三角面片插值点
      • 总结
    • 基于渲染的体素化方法

体素化方法

体素化能够对模型进行简化,得到均匀的网格,在求模型的测地线,求交等过程中有较好的应用。个人理解,把体素化分为基于CPU的方法和基于GPU渲染的方法。输入是三角面片,输出体素化格子。
其它文章:3D模型体素化(Voxelization)过程实现与分析(二)

基于CPU的体素化方法

体素化无非是对模型所在空间进行划分成网格,并决定网格是否有被模型覆盖。CPU的方法即不需要通过模型渲染,直接对网格进行统计得到是否占有该格子。
体素化的第一步首先是计算模型的包围盒,然后决定划分的网格数量,划分出xyz三个方向的网格。

三角面片距离方法

建立网格后,我们确定每一个网格是否被占用采取的是遍历所有的三角形,计算三角形到体素化网格中间的距离,设定阈值进行判断是否覆盖该格子。计算空间点与三角形的方法如下:

  1. 首先计算该点在三角面片所在平面的垂足点p1
  2. 垂足点在三角面片内:则最短距离是空间点到垂足点距离d1
  3. 垂足点不在三角面片内:则求垂足点到三角面片的最短距离s1,最短距离是s1d1构成的直角三角形的斜边。
  • 茶壶模型
    3D模型体素化(Voxelization)过程实现与分析(一)_第1张图片

  • 两个长方体
    3D模型体素化(Voxelization)过程实现与分析(一)_第2张图片

三角面片插值点

前者需要对三角面片进行多次遍历,耗时较长。获得体素化的关键在于我们需要有足够的随机点,能够判断一个体素化格子是否被占用。这时候我们可以对三角面片进行插值:
假设三角形三个点分别是A,B,C
三角形内任意点:D = t1*A+t2*B+(1-t1-t2)*C其中t1 t2的范围在0-1
这样插值出来的点在横纵两个方向不是完全均匀的,因此有一定的误差。如下图是对三个顶点插值得到的三角形内部点。
3D模型体素化(Voxelization)过程实现与分析(一)_第3张图片

总结

基于CPU的方法运算较慢,可以通过建立预定的索引,如八叉树,kd树简化计算过程,由于需求不需要很大量的网格,因此没有尝试。

基于渲染的体素化方法

由于在渲染管线中,GPU会自动对三角面片进行光栅化,如果关闭深度缓存,在片段着色器中,我们可以得到所有插值后的片元,这些片元是均匀的,我们将他写入到buffer中,然后在CPU中读取,经过投影过程的反变换,获得三维坐标,可以参考前面的博文
OpenGL渲染管线以及二维到三维坐标之间的相互变换,然后确定每一个网格中是否被覆盖,达到体素化的效果。这样的速度会比用CPU算快很多,GPU的插值是并行的。
以下是同学程序的效果,本人没有实践。以下是效果图:
3D模型体素化(Voxelization)过程实现与分析(一)_第4张图片

方法的具体实现见3D模型体素化(Voxelization)过程实现与分析(二)
如有错误,欢迎指正~

你可能感兴趣的:(图形学,日常总结)