学会这 6 个技巧,分分钟搭建炫酷场景 | Taichi 进阶秘籍

您好,欢迎访问我们的网站,我们将竭诚为您服务!

学会这 6 个技巧,分分钟搭建炫酷场景 | Taichi 进阶秘籍

时间:2022-10-23 22:56:55 阅读:89
距离Taichi体素创意大赛截止提交仅剩2天,我们已经收到近90份精美的体素作品。目前小伙伴们都进入到作品修改阶段,编辑部特意请来两位社区中的体素高手,分享他们的创作心得,希望在最后冲刺阶段,助力大家打磨出最满意的作品!

  关于坐标系的说明

  API中有一个可能产生困惑的地方是:整个空间的坐标范围是[-1,+1]³,但是在调用set_voxel函数时你传入的并不是它们的绝对坐标(x,y,z),而是三个整数(i,j,k),它们是voxel的下标。下标为(-64,-64,-64)的voxel的实际占据的位置是左下角为(-1,-1,-1),右上角为(-1+1/64,-1+1/64,-1+1/64)的立方体空间,下标为(63,63,63)的voxel实际占据的位置是左下角为(1-1/64,1-1/64,1-1/64),右上角为(1,1,1)的立方体空间。其它同理。

  快速搭建复杂场景的Tips

  在搭建比较复杂的场景时,一个一个手动摆放体素实在是太低效了,那么有哪些方法可以帮助我们高效地实现一些好玩的效果呢?这些小贴士请收好!

  使用隐函数绘制几何体

  如果一个几何体可以用隐函数来表示,其中为几何体的内部,为几何体的外部,那么你可以将一个voxel(i,j,k)首先变换到对应的坐标系下,然后代入的表达式,通过符号来判断它是否属于这个几何体。我们用球面作为例子来说明。

  思路:我们在sphere这个函数内遍历在x,y,z三个方向(-64,64)允许区间范围内的所有点,计算其到pos参数(在这里pos是一个三维向量,代表球心位置)的距离,当距离小于某个定值r时就放置一个体素。这样在initialize_voxels里执行sphere的结果就会出现一个以pos为球心,r为半径的球体。用类似的思路也可以实现不同的几何体,随后在kernel中就可以反复调用,达到节省代码减少重复的目的。(关于ti.kernel和ti.func的概念和详细释义请参考Taichi语言官方文档¹)

  示例代码见下:

  import taichi as ti

  from taichi.math import*

  ti.func

  def sphere(pos,r,mat,color):

  for i,j,k in ti.ndrange((-64,64),(-64,64),(-64,64)):

  v=vec3(i,j,k)

  if dot(v-pos,v-pos)<r*r:

  scene.set_voxel(vec3(i,j,k),mat,color)

  ti.kernel

  def initialize_voxels():

  pos=vec3(0,0,0)

  color=vec3(213.255,255./255,13./255)

  sphere(pos,15,1,color)

  这部分代码运行后,将得到这样的一个以原点为球心的球体:

  构造波浪曲面

  我们可以巧妙借助三角函数的力量,利用正弦函数在三维坐标系内构建波浪的形状,基本思路是两个函数相乘,所用的公式是:

  taichi代码还是类似前述放置球体的思路:我们先让程序遍历空间中的点,计算每个点所对应的波浪曲面高度h,当其位置处于这个高度之下时就放置一个体素,结果就会出现一个类似波动水面的实体。我们也可以调整三角函数的振幅和相角等参数,就可以构建不同的曲面形状了。taichi https://taichi-lang.cn/
郑重声明:文章内容来自互联网,纯属作者个人观点,仅供参考,并不代表本站立场 ,版权归原作者所有!

上一篇:如何用很短的代码创造「秋日氛围感」?

下一篇:Taichi & Torch 进阶篇详解二者的数据容器

相关推荐

返回顶部