【houdini】CG猎人第003期houdini完全基础入门学习笔记
—— 微资讯 · 微课程 ——
利用零碎时间,走上超神之路!
课程概述
01sin三角函数02noise紊乱控制03瀑布制作04继承速度发射05点法线06场判定碰撞
学习建议
教程难度 ★★
教程质量 ★★★★
入门教程(中级卷)涵盖信息量比较多,而且结合大量案例制作,技术讲解非常好(可惜是houdini12的,扣了一星)小编计划分为4部分学习。在第二部中你将会学习到程序化建模,对属性控制会有更深入了解,学习粒子系统(旧版),制作瀑布和判定碰撞等知识都是非常有用的技巧,里面有相当多的重要的干货,如果大家有理解不了的欢迎留言。对于有基础的同学直接查看蓝底黑字的重点部分。
学习统计
教程观看 2倍速度
观看时间 2小时
笔记整理 2小时
练习实践:1小时
学习笔记
01sin三角函数
sin函数基本参数
y=sin(x) 最基本形态 y的取值为-1-1,正弦波动 比如 sin($FF),基于时间进行波动
变形,sin($PT)基于点序号进行波浪变形:这里使用的都是局部变量。
y=a*sin(b*x+c)+d
这里分别多了a,b,c和d的参数,分别控制。a是y取值的倍增量,d是上下曲线偏移量,b是频率倍增,c是波浪x周偏移
常用案例 把line直线编程一条波浪线(大家可以通过这个案例来验证上面的公式变形)
教程中使用了point节点控制y轴,小编这里使用的是wrangle节点,效率更好,效果都是一样的。

进行变形处理
大家可以试着调整一下abcd的值感受一下波浪的变形效果

02noise紊乱控制
方法一 mountain 预制效果
mountain节点快速设置紊乱制作,通过mountain节点了解

重点是4个参数
height 就是紊乱强度
frequency频率,这个和sin函数类似
offset偏移,这个就是类似于sin变形中的c和d的偏移
noise type 不同的紊乱类型效果不一样(算法不一样)
简单的效果制作就是大的noise叠加小的nosie两个mountain进行制作。
方法二 通过vop自定义noise
使用vop制作noise是一种非常常见的应用,也是入门vop的很好的案例
明确编程的上的一个概念 数据类型比如整形:浮点,矢量和字符等等
vop中需要保持数据类型的一致性(实现连接),虽然houdini可以自动转换(以虚线显示),但是这样经常不是我们想要的效果。
add/substruct/multiply/divide等加减乘除的节点,以第一个连接的数据类型定义输出的数据类型.所以如果是vector *float输出的就是vector类型,但是如果是float*vector输出的就是float类型。
不同点
houdini13之前使用的是vop节点,houdini13之后就细分为attributevop,pointvop,vextex vop和primitivevop,其实都是一样的节点(attributevop),只是选择不同层级。

内部链接,不能直接把aflownoise链接到P的位置,因为这是完全重新改编点的noise,实际上我们是在原有点的基础上添加noise紊乱信息,所以使用p位置叠加nosie最后输出给P
aflownoise上可以选择输出类型为1D还是3D。

03瀑布制作
教程中使用的旧粒子系统,但是制作原理是一样的,有不一样的地方小编会在下面标示出来(具体参考第001中的关于粒子的基础知识)。
制作原理
创建物体→基于模型物体随机发射→控制速度方向→添加force重力→控制粒子质量随机,生成紊乱效果→添加drag阻尼→添加force紊乱力→物体碰撞(这个在13之后有变化)。
houdini15制作方法

变化一
新版默认情况下是忽略mass粒子质量与力的影响,如果要与mass质量有影响,那么需要去掉每个力(forece和drag中的ignore mass的选项)。第二,修改mass在质量随机表达式不能直接写在mass属性输入框中,而是需要通过下面激活vex控制随机mass质量(上面mass输入框的是恒定的数值)

变化二
虽然旧版的collision可以直接加载sop模型进行碰撞,和新版的pop_collision节点相同,但是这种碰撞方式是不会有真实的反弹效果。需要添加动力学的static静态物体,使用merge加入到粒子中进行动力学的碰撞,碰撞反弹物理参数同样调整。

建议:
其实这种修改mass粒子质量来影响粒子受力不均匀的方法其实已经采用了。为了统一流体粒子与普通粒子力的行为。新版如果要控制每个粒子受到的力的效果不一样,可以直接通过每个力标签下的vex输入框对力和阻尼效果等进行随机控制,更加直观和强大。
关于粒子VEX语言或者新粒子系统的完全讲解使用请点击下面的文章进入学习
04继承速度发射
解决发射物体过快导致粒子发射出来断层(明显的纹理)问题
导入运动模型→trail计算速度→基于速度获得发射范围→scatter获得稳定的点数量→timeshit获得上一帧状态→point节点混合上下连个状态粒子位置→switch节点进行切换判定→popnet粒子发射。
1file文件加载运动模型物体,对于模型缓存数量超于当前预览帧的情况,file文件选项 1报错 2当做没有模型,一般选择后面。
2添加trail节点,选择compute veclocity获得模型点的速度属性,这个默认情况下粒子会继承这个速度属性。
3分离出发射范围,可以几乎速度的大小,使用表达式 length($VX,$VY,$VZ)可以求出速度speed,用delete节点基于一个阈值进行判定。

4重点,如何获得模型与模型之间的插值部分,这是解决粒子发射断层的核心部分。原理是使用blendshape模式,让前后两帧之间生成中间混合模式。但是blendshape需要保持混合变相两边的物体点(拓扑结构)是一样,但是目前通过表达式计算出来的手部模型时刻都在改变。
解决方法,给模型scatter撒点,而且这个撒点的数量是恒定,比如5000个;
timeshift为$F-1可以获得上一帧的状态效果,那么可以把当前的状态与上一帧状态使用point节点进行混合,混合原理使用之前的fit01函数进行随机分配 rand($PT)设置就是权重,从$TX1到$TX2的过渡其他三个通道同理。

5 处理时间的问题,因为不是所有的状态下都有点,那么需要做一个切换状态
switch节点进行切换,可以手动k关键帧,但是这个不是程序化的做法。教程中是自己接对timeshift中点的访问,如果npoints()用于访问某个节点中点的数量,如果等于0,那么返回结果是1,使用scatter节点。如果不等于0,那么返回结果是0,那么使用的就是point1节点

这里完成了发射源的处理
6popnet中的设置
这里使用了popvop节点添加nosie,这个vop中操作和之前的vop一样,添加noise控制。
添加color控制颜色,使用速度控制(上面的houdini新粒子讲解)
05点法线
新版本的物体法线已经不能直接控制粒子的初始化速度,需要的是速度属性v,不过只是一个转化而已,使用wrangle节点直接是 @v=@N;就可以了,这里关于获得圆环放射性方向的法线和随机紊乱的大小效果。
05-1通过属性P计算出法线/速度方向,可以获得这个放射性的控制。
05-2对值的随机控制,使用fit01和rand函数进行控制
05-3下面是直接使用wrangle节点可以获得速度属性辐射方向

注意
新版粒子中已经没有curlnoise紊乱节点,而是直接force中的noise或者vop中自己构建。
使用attributecreate创建对应属性进行控制也已经不需要了,还是因为有了vex输入框,都可以对里面的任意的力的属性就行控制。不过这的制作思路的学习可以让你更好对houdini是关于属性控制的理解。
06场判定碰撞
重点学习技术(在之后的流体中经常用到)
问题
粒子发射已经和模型穿插,所以用collision碰撞已经是没有用。这里要做的其实就是把在模型内部的粒子移动到模型外部,那么这里就设计两个变量
移动方向(告诉粒子要往哪里移动) 矢量值
移动距离(告诉粒子要移动多少)浮点
那么获得这两个变量的值是 SDF场 sign distance filed 也就是 方向和距离场;
把模型转化为SDF 场的方法 isooffset(旧版) vdbfrompolygon(新版)
使用vdb的运行效率更高。
这里先按教程讲解,使用iso offset节点执行。

现在是反转的效果,然后考到有出错的地方
解决办法关闭 laser scan选项,注意最后取消旋转invert sign(只是为了临时预览效果)

在新版本中的效果 统一的SDF中的现实形式,不是volume而是VDB 形态,也不需要invert sign
左边是isooffset,右边是vbd,效果很类似,但是vbd快很多

如果在粒子系统中获得需要的两个变量
节点中的设置,sop连接到popnet中,然后在粒子系统中插入pop vop节点,在input中设置input2为 second context geometry

在vop中的链接
这样就可以把在内部的点都移动到sdf的外表面了。
volume sample 进行距离采样
volume sample vector进行方向采样
然后他们之间乘积然后叠加上现在的位置信息就可以了~~

不过教程里面粒子不都是在里面,分为是三种情况,在sdf内部就需要移动,在表面和在外部都保持不变,这里就需要做一个判定。
因为SDF采样出来的float值是从负值 到0再到正数
compare节点,进行与0对比→twoway切换,如果是小于0,那么需要叠加,否则就保持位置属性不变

获得教程的方法:
