CG世界 发表于 2023-5-4 18:40:55

Houdini树木生长

本文转自公号:华强方特深圳电影有限公司



大家好,我是L小步。今天分享一下,houdini树木程序化生长的工具,先看视频wxv_2880224398568456196


介绍Tree sim是本公司内部开发的树木生长模拟工具。可以实现任意层级的树木生长;工具完全基于程序化,不需要模拟。



本文就单独摘出Tree sim工具生长的核心技术点分享一下
生长的基本原理:基于模型线的生长,最后线驱动模型动态。
生长技术点摘要
① 各层级线生长需要保证前后依赖性② 驱动模型的方式,如何完好驱动原模型③ 叶子数量巨大时,如何提升生长的性能
生长前的准备工作① 提取树干的中心线;方法有很多,本文后面提供一个方法供参考。


② 保证枝干的name属性和对应中心线name属性一致(name属性在prim层级)。


③ 线分好层级,给上对应的属性level(level属性在point层级);关于自动化分层级的这里先不展开。


④ 每条线根部的点给个组,组名为root


生长① 先从简单点一根线生长做起;如果使用carve节点,会导致生长过程中线上的点发生变化,后面我们会拿线驱动模型,此方式不行。


以下方式先给线加上根部到尾部从0到1变化的curveu值。


② 利用vex的primuv,配合curveu属性达到保持点不变且生长的目的。


③ 现在每根曲线都有以下属性:从0到1变化的curveu属性;
层级属性level;
对应name属性;
根部点组root。


④ 因为线的生长依赖上一层级,所以需要计算每根线对应上一层级的点,我们命名这个属性为neigh_pt,如下图:


整个计算节点如下图:



下图此处代码这么写是要保证找到的neigth_pt是上一层级的(如果仅用nearpoint,当树枝多的时候有可能找到是同一层)。


⑤ 接下来这步就是重点了,完成这步几乎就代表整个生长已经完成了,核心部分在这里。先定义每级生长时间,属性为brance_grow_frame。


再做如下操作:


原理就是,利用循环反馈迭代,依次计算每层级生长的开始和结束时间
(grow_frame、@grow_frame_end)
生长效果如下:



⑥ 基本的生长已经完成。但生长有些单调,正常生长的子枝干会跟着父枝干运动的,具体操作增加,如下图节点。


Attibvop2 里连接如下:


效果如下:



⑦ 接下来就是驱动模型了,用传统point deform、wire deform 、cloth deform都不能保证完好的驱动原模型。这里用kindeFX的功能做驱动(运用里面的矩阵功能)。


Bone Capture Proximity 节点的参数根据模型大小自行调节
驱动效果如下:


刚开始生长模型有穿插的,可以加delta mush节点控制模型平滑(比传统smooth更快)


每根线都有生长开始和结束时间帧属性,可以做到枝干刚出现是平滑最后过渡到原模型,这里不再演示。此驱动模型的方法:如果枝干数量多时会算的比较慢,特别是前两个节点,但有个好处是只算一帧就可以了。这种方法在Tree sim工具中并没有用到,因为当枝干多达几万时,rig doctor和Bone Capture Proximity节点会异常的卡。Tree sim工具内部是使用自定义矩阵驱动模型的,有机会下次分享一下。
⑧ 最后一步,叶子的生长为了保证叶子生长的性能,用了PrimIntrinsics的方法,这里只介绍使用方法,原理就不展开说了。


准备工作给每一片叶name属性,然后根部点打一个点组root。


计算叶子离线最近的点nearpt,根部的位置属性root_P。


pack每片叶子,并且把中心点移动到根部,因为叶子生长要基于根部点。




接下来就让叶子跟随生长曲线运动。我们用上面驱动模型的方法。


此方法带有旋转,而不是简单的位移跟随



最后把叶子从小变大,基于之前线生长的属性




最终效果如下:



end

公众号链接:https://mp.weixin.qq.com/s/zIhWT3srAvmPGMw-owrDcw

机皇天下 发表于 2023-8-13 14:35:58

6666666666666666666666666666666666666666666

qq_欣欣_wUj 发表于 2023-10-13 10:50:40

{:1_236:}
页: [1]
查看完整版本: Houdini树木生长