小妙招:如何将网格体转为体素

背景

  • 最近看到太极图形举办了一个体素创意的比赛
  • 正好我在实现一个任意网格体转体素的小程序,Genvoxel.py
  • 算法的原型来自gpu-gems3中的刚体仿真示例

主要步骤

  • 先构建三角网格的加速结构,如bvh,kdtree等
  • 计算出网格的aabb,得到网格的最大最小边界
  • 根据想要的体素最小单位,将aabb(长方体)空间切割成众多的小立方体
  • 从长方体空间的任意一个面出发,向对面射出光线,使用raymarching判断每个体素是否在网格之中

hit

  • 上图用了光栅化的方式,从两面渲染,得到两个深度图,从而计算出了哪些深度在体素内
  • 但实际上如果存在复杂的中空结构,就只能用raymarching了

效果

可以应用的场景

  • 体素制作

  • 流体仿真时的初始液体条件,每个体素都是一个粒子,就可以把小兔子变成液体了

metling

  • 固体边界条件的生成,复杂的网格体边界用体素(粒子)填充,从而实现刚体仿真(后面有时间了,单独开一个话题)

taichi

7 Likes

很棒,学习啦。刚好最近我也在做类似的工作。

1 Like

楼主你好,在跑你的Genvoxel.py时,提示错误,如下:

ModuleNotFoundError Traceback (most recent call last)
in
2 import taichi as ti
3 import numpy as np
----> 4 import Mesh2Particle as M2P
5 import Simulation as Sim
6 import sys, getopt

想请教一下 Mesh2Particle 、Simulation 、getopt这些模块包在哪里可以下载到,或者有源文件吗?

  • 该文件是嵌入在我的一个项目里的,直接把这个repository里面的代码下载就行了

  • 最终目的是我想用taichi实现一个基于粒子的固液气均有的物理引擎,现在还在初初初初级阶段