【微答】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群的一起快速学习提高的同学请查看下面入群要求

【VIP】CG猎人VIP+CG猎人Q群建立


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

为您提供最具前景的资讯与最适合的分类技术与学习教程

(0)

相关推荐