【微答】houdini16中的属性调用方法总结:新人容易混淆的知识
—— 微资讯 · 微课程 ——
利用零碎时间,走上超神之路!
前天CG猎人vip群里有同学提了一个问题,为什么使用transform中位移属性使用点属性没起作用?
他的做法如下
attribute wrangle中创建了属性 trans,基于点序号随机创建值为0.5-3范围的数值
f@trans=fit01(rand(@ptnum),0.5,3);
在geometry spreadsheet的point层级也能看到这个属性值
在transform中的y轴的使用了point()函数进行访问调用
point("../attribwrangle1",@ptnum,"trans",0)
结果并不是预想中的每个点偏移不同参数,而是整体向上移动数值,而这个数值不是0.5,3或者是平局值,到底这里发生了什么?
如果在transform中直接使用@trans vex变量进行调用,小球不会有任何位移变化。
到底发生了什么?
再wrangle节点后面添加了一个attribute promote节点,把trans属性从point层级提升到detail层级,注意提升方法是使用 first match第一个匹配的的数值
然后再链接transform节点,同样在y轴上使用detail函数进行进行调用,你会发现结果和使用point()调用的结果是一样的。
也就是说,即使你再point层级使用了随机的值,调用point层级的函数,transform只识别了第一个匹配的值,也只能识别一个值。
为什么不能让每个点随机的偏移呢?下面小编就来讲解一下这些概念
新人对于属性(变量/函数)容易犯错的两个错误。
一 houdini不是所有节点都可以单独对元素调整
上面那个案例不是表达式或者属性的问题,而是houdini中的节点类型问题。
transform就是其中一个常用的代表,它的作用就是对物体进行transform,但是不可以对每个点进行单独操作。
当然,有人说,不对啊,我可以分组,然后单独对组里面的点进行transform。这个其实概念是一样的,分组是没错,但是你对组里面的点还是整体移动,无法对组里面的点进行不同的transform对吧。如果你要每个点单独分组调整,那么实际上没什么意义。
那么如果要实现对每个点进行属性的单独控制可以使用那些节点呢?
vex或者vop类节点都可以
point节点(point_old)节点
wrangle节点
vop节点等等
这些都可以实现对每个点单独控制的作用
二 没注意到层级要求
houdini对于多边形一共有4个层级
1point层级
2vex层级
3prim层级
4detail层级
属性可以存储在上面4个层级上,不同的模块/节点对于属性又不同层级的识别要求。很多初学者会经常忘记层级的存在。
下面常用类型举例
1polyextrude节点,对于面属性随机挤出要设置的面属性,很多新人设置了点属性,然后怎么调用都没有效果;
2bullet刚体约束中对于 constraint name和type等都是primitive层级,写在point层级同样是没有任何效果。
下面节点特别需要注意切换层级
wrangle和vop节点,需要选择对应的层级进行操作
下面讲解一下houdini中属性调用的类型和方法
其实就两大类型
一直接读取属性
二通过编程语言
一 直接读取属性类型
旧版houdini中sop比较少用,新版越来越多,并且在dop动力学中最常用。
sop中的节点举例
输入框模式
也就是给你一个属性框,自己手动输入属性(右边没有小三角下拉选项),这种输入模式的特性就是默认会有一个预制属性名字(但是不代表默认存在这个属性),当然你可以进行修改这个属性为自己定义的属性名字
polyextrude节点中的local局部模式,需要注意的是这个是primitive层级的属性
polybevel节点。控制不同点倒角的大小,这个是点属性
copy to point/copy stamp节点关于属性传递等等
另外一种类型就是右边小三角有下拉菜单选项的,其实这种类型很常见
scatter节点中基于属性撒点
attribute promote
attributetransfer
节点中的group其实也是这种类型
当然,以上两种输入方法没有本质上的区别,展示在选择封装hda(数据资产中的方法习惯不一样而已)
他们都是string类型,然后再menu菜单中选择对应的选择方式
dop中的识别
在dop中很多属性都可以直接识别sop中定义的属性
比如在flip流体中的大部分属性都是直接读取sop中的定义属性,用的也是上面的模式
刚体中的约束之类的
上面都只是简单的举例,houdini中动力学大部分都是使用这种属性输入方法。
方法二 使用编程语言
当然,之前CG猎人有篇文章已经讨论过属性和编程语言的关系
houdini常用支持的编程语言有 expression,hscript,vex和python,这些都可以用来调用属性。可以使用表达式,或者使用局部变量和vex变量。
当然,这些概念如果还搞不清楚的话可以查看下面这篇文章:
【微课程】houdini中的属性 数据 vs 参数 变量(局部+全局)_CG猎人
首先,选择很多,那么该选择哪个编程语言呢?houdini官方推荐的是vex,后续更新的节点也越来越多支持vex语言,因为运行效率高,编写简洁等优势,而且对于习惯用vop的节点编程人员来说其实书写都一样。而之前的表达式和局部变量$写法越来越少用,所以这里也推荐大家使用vex。
直接使用@变量的调用属性的方法
houdini大部分节点都支持这种方法(除了一中提到的部分节点)
polywire中知己使用vex变量调用pscale属性
@p.y调用y轴高度进行delete删除
这类的节点还有很多很多
但是这里会存在一个问题,也就是实际上我们在调用的大部分都是点的属性,对于vextex,prim和detail层级的属性调用一个简单的变量无法表现出来。而且关于调用什么层级的属性反而是由使用的节点决定的。比如delete节点,当你选择删除point和删除面的时候,定义你使用的属性是哪个层级上的。
另外一种就是使用表达式进行访问
使用表达式可以清晰的访问不同层级的属性,并且可以跨层级使用。
point()
vextex()
prim()
detail()
使用这类表达式的时候需要注意里面的输入参数的要求
一般都是下面几个参数
“属性所在的节点路径”,“元素序号”,“属性名”,”属性序号“
元素:需要只有当你再point,vextex,prim中才会用到,因为不同的点,顶点和面有不同的属性值,如果要访问搜有的元素属性,那么就是@ptnum,@primnum,@vertexnum
属性序号:如果你是浮点,那么直接0就行了,如果是矢量,0,1,2分别分别代表xyz或者rgb;这也说明,上面三个函数返回的都是浮点值。如果你想获得矢量,那么实际上你需要访问3遍,最后面分别是0,1,2序号。
总结
很多庞大而负责的东西都是由这些基本的原理性东西构成的,当你能够从基础面上理解这些的时候,遇到问题也是很容易解决的~
如果想加入CG猎人VIP群的一起快速学习提高的同学请查看下面入群要求
CG猎人(Hunter_CG)专注于CG微资讯与微课程的分享(10分钟以内)。让广大CG爱好者与从业人员能够利用零散时间了解最新最具前景的资讯,了解国际技术发展动向与前沿市场动向。提供精挑细选实用微课程,从入门到高级循序渐进。通过知识总结与分享,共同进步。
分享教程和学习笔记,同时设计maya,3dsmax,softimage,houdini,cinema4D blender,modo和lightwave等常用三维软件,也包含reallow,naaid专门制作特效的三维软件;包含fumefx,rayfire,karakato和thinkingparticles等插件教程和学习笔记。
—— CG猎人——
微信号:Hunter_CG
QQ-540710114
为您提供最具前景的资讯与最适合的分类技术与学习教程