人气 401

[图文教程] Houdini 刚体破碎(1) - 模型切割 [复制链接]

流星的精灵 2022-4-5 21:57:35

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
前言


  • 工作中经常会使用 Houdini 来实现一些物理模拟效果,从刚体(Rigid)、柔体(Soft)、流体(Fluid)一路摸索过来,为了快(应)速(付)产(周)出(报),我个人对 Houdini 的学习都是在一种囫囵吞枣式的快速迭代中进行的,基本上都是先跟着教程连出一套框架,然后查文档和论坛帖,一通魔改加调参,看上去效果差不多了就赶紧塞到 UE 里,基本可用之后就交给美术继续调参,自己则马不停蹄地继续下一个任务。但很显然,这样的模式是完全不可持续的,如果对 Houdini 的很多设计从根本上就不理解,半个月之后再去维护之前的工作就会一脸懵比,但凡脱离了基本框架就寸步难行
  • 鉴于这种令人不安的现象,我想必须系统地梳理一下曾经做过的内容,从源头上思考一下那些天花乱坠的节点究竟是怎么一回事。另一方面,在看各种教程的过程中,似乎做教程的人自己对很多内容都闪烁其辞,说不出个所以然,只是机械地连连看,所以我隐约感到,也许和我遵循相似学习路线的 Houdini 开发者还有很多,无论如何,如果能透过自己的经验帮到其他人,肯定是一件很棒的事
  • 接下来我会从刚体破碎入手,争取把刚体、柔体和流体的常见模拟方案都总结和梳理一遍,每种类型的动画模拟都会分成多个子话题来介绍,本篇介绍的是破碎模拟中一个最基本的问题——如何切割模型
  • 由于使用 Houdini 涉及的知识和技巧太多太细,我不会着墨于 Houdini 中最基本的操作,或某个节点各种参数的详细用途,只会针对一些常见方案涉及到的重要节点,进行基本原理层面的说明
重要节点

Voronoi Fracture

vfZizoVgSOCZo70A.jpg

Fractures the input geometry by performing a Voronoi decomposition of space around the input cell points.


  • 此节点基于一种叫作 Voronoi 的空间分割算法,根据输入的 cell points,将指定 mesh 划分成若干个碎块
  • 什么是 Voronoi 算法,什么是 cell point?

    • 向一个平面上随机撒 n 个点,Voronoi 算法能够把此平面划分成对应的 n 个区块,每个区块叫作一个 cell,而这些撒下的点就叫 cell points
    • 如下图所示,每个区块都用独立的颜色标识了出来,对于某个区块内的任意一点,它与此区块对应的 cell point 的距离,是与所有 n 个 cell points 距离中最小的

Qp0jv41ILhD0LMJA.jpg



    • 把这个概念延申到三维空间,Voronoi Fracture 节点能够根据给定的空间中的 n 个 cell points,把指定的 mesh 划分成 n 个碎块
    • NOTE: 给出的 cell points 必须位于要切分的空间内部,否则对于模型本身的破碎没有意义;另外,cell points 的数量,也就决定了切分后碎块的数量




  • 输入与输出

    • 下图给出了一个使用 Voronoi Fracture 节点的简易示例,接下来依次解释各输入输出的含义

ESCdD23jzuI3BDCB.jpg



    • Input1: 要切分的 mesh,这里用了最简单的 box 作为要切割的模型
    • Input2: 生成碎块的 cell points(暂时不用关心这些点是怎么生成的,后面会讲到),而这些点的数量就是最终生成碎块的总数
    • Output1: 经过切分后的 geometry,用一个 null 节点来接收

      • 为了验证切分结果,把 Output1 的蓝色(Display)和粉色(Template) 标识都选中,可是这个 box 看上去似乎没有任何变化?


YjoLOUfXiiJafm09.jpg




      • 而如果此时比较一下 VoronoiFracture 前后节点的 Geometry Spreadsheet 数据,会发现明显不同,可为什么破碎效果没体现出来?

        • 因为所谓的 “切割”,只是把模型分成了多个部分,但并没有把这些碎块分离开,所以这些碎块实际上还紧密地贴合在一起
        • 除非对这些碎块施加外力,才能使它们分离,拖动时间轴就能看到破碎的动态过程;而对于静态的某一帧,要想看到切分的结果,就需要用其他的 Debug 方法,把数据的变化可视化,这里我们使用 ExplodedView 节点,就能预览模型的破碎情况



u6DPCu89dO65BoZN.jpg





    • Output2: 将相邻碎块的中心点相连后形成的 geometry。如下图,查看 Output2 节点时,看到的点都是各碎块的中心点。视窗中看到的多边形,表征了碎块之间的连接关系,利用这个 geometry 可以定制碎块的约束条件,比如希望某些碎块连接得牢固一些,另一些松散一些,就可以设置不同的阈值,规定在受力超过阈值时就打破特定碎块之间的连接

f77S4m91hSTWqCap.jpg

Scatter

e4B4B95Rvuzq4fRE.jpg

Scatters new points randomly across a surface or through a volume.


  • 前面提到,使用 Voronoi Fracture 节点时需要给定一些 位于模型内部空间 的 cell points,那这些 cell points 又应该怎么生成呢?比较容易联想到的是:直接对这个模型撒点,把它们作为 cell points 传给 Voronoi Fracture。而撒点这件事,可以借助 Scatter 节点来实现
  • Scatter 节点会对输入的平面(surface)或空间(volume)以 大致均匀 的方式进行撒点,然后把这些点输出。面板中的 Force Total Count 就是撒点的总数
q1ONxoP9ZbZpx00p.jpg


  • 现在再查看 ExplodeView 节点,预览一下破碎结果,可以看到碎块的形态呈现出一种怪异的 向心趋势,当把撒点的数量增大到 1500,向心现象就非常明显了;另外,还能看到 模型表面的碎块密度明显大于内部的碎块密度。这是因为直接把模型连入 Scatter,实际输入的是 box 的 6 个表面(surface),而非体积(volume),Scatter 生成的 cell points 全部位于 box 的表面,对于靠近中心点的部分,Voronoi 算法其实是在 沿各个表面朝着中心点 作划分,这就导致整个形态显得非常规则
DB6zk6qdNHNPQb01.jpg

TV5UEivVQT71GStV.jpg


  • 为了解决上述问题,关键在于怎样让 Scatter 撒出的点填充到模型的内部,而这可以通过 IsoOffset 节点来实现
IsoOffset + Scatter

o3Uzwt53duhk1cCU.jpg


  • 在 Scatter 之前加入 IsoOffset 节点,可以 把 mesh 以 volume 的形式传给 Scatter,使它生成的 cell points 不局限于表面,还能充斥 box 内部
PFxVP2PD3qmZ83L7.jpg




  • 为了对比使用 IsoOffset 前后的破碎形态,这里增加了一个 switch 节点作为开关,为 0 时不使用 IsoOffset,为 1 时使用 IsoOffset
msMkOKmGGYROuYoG.jpg




  • 使用 IsoOffset 前后的破碎结果对比,可以看到使用 IsoOffset 后的各处的碎块密度基本一致,奇怪的向心现象也消失了
irGzdDUbmn7GDubX.jpg




  • 看来 IsoOffset + Scatter 的方案表现不错,但多看几眼就很难不注意到:碎块分布得太均匀、单调,缺乏层次感,这本质上还是由于生成的 cell points 在各处的密度都基本一致,这时就可以引入一个更加强大的节点:Voronoi Fracture Points
DgH4lU4F4e2Hkus2.jpg



Voronoi Fracture Points

AEm7SvgVm3zEneEH.jpg

Given an object and points of impact on the object, this SOP generates a set of points that can be used as input to the Voronoi Fracture SOP to simulate fracturing the object from those impacts.


  • 此节点将根据传入的 mesh(Input1) 和 impact points(Input2),生成一个 impact volume,然后用这个 impact volume 和要破碎的 mesh 进行一些计算,生成最后的 cell points



  • 什么是 impact point?什么是 impact volume?
Dp6OKL67w4kzl2lK.jpg



    • impact point 就是指定的在 mesh 上的撞击点,impact volume 就是基于撞击点生成的撞击体(相当于撞击范围)





    • Voronoi Fracture 生成的 impact volume 是以 metaball 的形式存在的,那么,什么又是 metaball?

      • 联系 meta-universe,metaball 直译过来就是 “元球”,单拎出来就是一个球,但是多个 metaball 可以融合、聚集在一起,组成任意形态的模型,就像原子作为一种构成物质的基本元素而存在,所以叫 "meta"
      • 视觉上可以把一个 metaball 理解成一滴圆润的露珠,下图就是两个 metaball 靠近时结合在一起的形态


d1y18ooxX6777Cs8.jpg


  • 有了 impact volume 之后呢?它怎么生成最终的 cell points?又怎么解决碎块分布过于均匀的问题?

    • impact volume 会把要破碎的 mesh 分为 3 个区域,然后依次往这 3 个区域(region)上撒点(密度可调),这 3 类点的并集,就是最终传给 Voronoi Fracture 节点的 cell points





    • 如下图,蓝色线框表示一个 impact volume,黑色线框表示我们要破碎的 mesh,impact volume 首先会和 mesh 的 volume 求交,交集中位于 mesh 表面的部分称作 Surface(黄色),位于 mesh 内部的称作 Interior(红色),而不在交集中、但位于 mesh 内部的,称作 Exterior(蓝色),这就是上述所说的 3 个区域

WdsvONXn0PToAY04.jpg



    • 这三种颜色的点加起来,就是输出的 cell points,而每个区域的点密度、impact volume 的大小、位置,都是可调的,这可以大大提高我们调整破碎形态的灵活性




  • 这里我用 IsoOffset + Scatter 的方式在 mesh 上生成一个 impact point,再加上一个 transform 来移动 impact point 的位置,可以看到破碎形态将随 impact point 的位置移动而发生显著变化
rg1bdGBw3Y7d2wIv.jpg




  • 现在再将 Voronoi Fracture Points 方案加入 switch 分支中,对比 3 种方案的破碎结果
v4IeEDGpIPIxcDDG.jpg


  • 关于密度的调节

    • 这种方案结合了 IsoOffset, Scatter 以及 VoronoiFracturePoints 三个节点来生成 cell points,其中与密度相关的属性包括 Scatter 节点的 Force Total Count 、VoronoiFracturePoints 中的 PointsPerArea 、Impact Radius 以及各个区域对应的 Point Density
    • Scatter

      • 注意 Scatter 的结果是传给 VoronoiFracturePoints 的 input2 的,它的 Force Total Count 决定的是 impact volume 的数量,和最终碎块的数量没有直接关系


BfoUM5VzuzwVYvC1.jpg



    • VoronoiFracturePoints

Hk4rw9954703tWjr.jpg




      • Impact Radius: 对应着 Impact Volume 的大小,一般来说尺寸越大,与几何体的交集越多,cell points 的数量也会越多
      • Point Density: Surface, Interior, Exterior 3 个页签下都有对应的 Point Density,调整该值只会影响对应区域的点的密度
      • Points Per Area: 相当于所有 3 个 Point Density 的 ScaleFactor,调整该值会整体影响所有区域的点密度


总结


  • 本篇主要浅析了在 Houdini 实现刚体破碎过程中的模型切割部分,首先介绍了切分模型的最基本节点:Voronoi Fracture,然后分别介绍了生成 cell points 的三种方案:从最简单的、直接对模型表面应用 Scatter 节点,到加入 IsoOffset 实现对模型内部进行撒点,最后使用 Voronoi Fracture Points 节点实现更加丰富的破碎形态,阐述了三类方案的基本原理、使用方法和优缺点
  • 到目前为止,所有的预览结果都是静态的,对应地,所有描述到的节点都属于 SOP(Surface Operator),一下篇会讲到 DOP(Dynamic Operator),让破碎效果真的动起来
Reference


  • Voronoi diagram
  • SideFX - Voronoi Fracture
  • SideFX - Voronoi Fracture Points
  • SideFX - IsoOffset
  • SideFX - Metaball
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-5-5 16:29 , Processed in 0.106996 second(s), 26 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.