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

背景

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

主要步骤

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

hit

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

效果

可以应用的场景

  • 体素制作

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

metling

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

taichi

8 个赞

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

1 个赞

楼主你好,在跑你的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实现一个基于粒子的固液气均有的物理引擎,现在还在初初初初级阶段

楼主你好,我把你的项目下载(也确实没有类似pywavefront的文件)后,跑了一下Genvoxel.py,提示我说没找到pywavefront这个模块,请问是不是楼主您忘记打包这个文件了 ps:D:\Jupyter是工作目录


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

D:\Jupyter\Mesh2Particle.py in
5 import math
6 import numpy as np
----> 7 import pywavefront
8 import SceneData as SCD
9 import UtilsFunc as UF

ModuleNotFoundError: No module named ‘pywavefront’

我很喜欢你这个想法,非常好,所以很想复现你的示例

  • pip install pywavefront

  • 遇到什么包不存在,就pip一下

  • 另外你仔细看我的github里面有步骤的,pip install -r requirements.txt

  • requirements.txt包含了我当前电脑上所有的依赖

找到原因了,打扰了

是的,问题出在requirement里的一个依赖,anaconda的anaconda-navigator,我把这句删了,现在正在安装其他的依赖

太暴力了,不需要安装这么多依赖包 :sweat_smile: