【微课程】houdini中的属性 数据 vs 参数 变量(局部+全局)_CG猎人
—— 微资讯 · 微课程 ——
利用零碎时间,走上超神之路!
从其他三维软件转到houdini的用户往往会被下面词汇所吓倒,特别是没有编程基础的同学:
属性(attribute)和数据(data),当然还有参数(parameter)变量(variable)局部变量(local vairable)和全局变量(global variable)等。特别是houdini还支持houdini表达式expression,hscript,python,vex和C++等语言,各种语言使用方法又不一样,新旧版本houdini变化有比较大,让人无所适从。
这些名词到底指代什么,很可能需要从计算机发展和一些内部原理解释,不过我们是学习如何使用houdini(当然,如果你要从事底层开发可以深入研究的话,欢迎去研究里面的差别),所以对我来说,几乎是一样的。
昨天文章中,有热心的同学指正了小编的错误,具体如下
1局部变量是map,翻译为映射或者适配,小编说成是转换(至于大家是否更好理解就不得而知了)
2vex中应该是属性,而不是变量。(不过这个其实有点混淆了概念)
首先感谢这位同学的留言,如果还有其他问题欢迎大家指正,在后面的文章我会继续更新的。但是还是会坚持这样写,主要原因有二:
第一,作为对于刚入门还对变量,属性之类不太理解的同学,直接解释里面核心差异无异于听天书,解释了反而让大家更晕乎。有点类似与听程序员讲了一堆程序语言,最后你只希望对方说人话。
第二,其实在最终的使用上是非常类似的,当然,如果都能够非常熟练地使用, 希望更上一层楼,可以再去追究其差异。有句话说得好:听了很多道理,却依然过不好这一生。我们定义各种名词,各种规则最终是为了用而不是为了记忆。
今天我们就来做个整体的介绍
概述
上面分了三行,这样分的原因如下
1属性和数据实际上是同样的东西,也是houdini定义的客观存在的东西。
2你要对属性/数据进行创建,访问,修改或者删除,而已通过参数/表达式/hscript/vexvop/pthon进行操作。
3节点可以用来操控属性,实际上也就是对第二点工具的可视化编程/封装
4部变量和全局变量是相对于编程语言而言的概念,也就是在expression,Hscript,vex/vop和python。所以不存在局部属性和全局属性一说。
总结,属性和数据为对象,而参数,表达式,Hsript,vex,pythton使我们如何操控对象的工具/方法。昨天小编介绍的就是在工具/方法中的 表达式VS vex语言的两种方法,也是大家最常见和改动比较大的地方。
属性attribute,数据与参数和表达式,vex等关系
当使用add节点创建一个点,那么这个点就具备了一个默认的属性:位置,反过来说,没有不存在位置属性的点,没有位置就不会有这个点。
这时候你要移动这个点,在maya或者3dsmax的做法通常就是选择点,然后选择移动工具向y轴正方向移动一个单位(PS:maya的多边形点是不能单独存在的,可以假设为box上的一个点)。
在houdini中你有多种方式实现
1实际上,你可以直接在属性面板中直接把P[y]的值修改为1.0,只是这样修改不直观,对于多个点的操作太麻烦,所以houdini为我们提供一下工具。
2直接add的point参数上输入0,1,0 使用参数的方法,虽然这个看起来和第一个方法是一样的,不过对于复杂的变化比如旋转和缩放等就更加人性化操作了。
我们在参数面板上能查看每个节点的参数(每个节点都有自己的参数编辑面板)
3选择点,添加edit节点/transform节点进行向上移动一个单位 使用手动或者transform 节点
4添加point_old节点,在表达式输入@P.y+1 使用了vex语言 直接使用vex语言控制
5使用attributecreate创建一个局部变量$VAR,设置值为1,然后在point_old上使用$TX+$VAR 使用表达式和局部变量
6 当然你也可以使用vex定义个var属性,然后叠加上到@P.y上 使用vex创建属性然后叠加计算
其实感觉用了各种方法进行操作,最终结果都是让属性P在y轴上+1的值,视图上点上升了一个单位。
数据
在dop动力学中,见到更多的是data数据,比如添加force力,是一个数据,添加了constraint约束也是一个数据,包括solver也是一个数据,我们通过添加各种数据影响着动力学中的解算行为。
我们创建一个简单的flip流体解算,在geometry spreadsheet中你会发布局和sop中完全不一样
其实当我们选择geometry的时候,熟悉的视图又回来了。这个可以理解为动力学中,我们给物体添加了很多的data数据,只是这些数据不存在点/面层级里面,比如gravity,都所有点/面都一样的效果,所以直接在geometry外部作为一个整体数据影响所有的点,类似存放与在detail中的的局部变量。
如果这时候我给flipsolver中添加了pop force节点,这里个节点使得物体上每个点受到的力都可以不一样,这样在geometry中会添加force这个属性(自然也会生成v速度这个属性)。
从这个意义上说,动力学data中的数据包含了属性attribute。
属性和数据总结
简单地说,存储在物体层级上的(point,vertex,primitive和detail上)对象的可以被当做属性。反过来说,属性必须依附在几何体上的。
而数据无需依附在几何体上,在dop中被解算器识别。
但是从本质上说,并没有什么不同,其实都是一些houdini识别的值,用来呈现不同的效果/实现功能。比如Cd属性可以高数houdini显示/渲染特定的颜色,v代表速度,可以被mantra识别计算运动模糊等等。
属性的特点
属性 通常可以用变量 的形式写入表达式,例如变量$TX 表示属性P[x]。
一些属性可以自动被渲染引擎、动力学引擎或其他内置的节点识别并应用,比如颜色Cd会被mantra surface材质识别,N和up会被copy SOP识别等等。
用户可以自定义任意数量的属性,即使他们不会被任何内置节点识别,你也可以在表达式、脚本、VOP等地方使用。自定义的属性也可以被适配为局部变量
并非所有参数都支持本地变量,如VOP SOP,Color SOP等都不支持。
下面我们来讨论一下操控属性的方法
这里所说的操控包括 创建,访问,修改或者删除等操作。
参数 parameter
刚才我们第一个案例中就是用add节点,直接修改points的位置参数,让其y轴位移一个单位。这个就是使用参数对属性P的修改。但是,这里要说明的是,并不是参数面板中的所有参数都是属性,比如添加transform节点,调整ty也可以让属性P.y向上移动。看起来是一一对应。但是transform节点还有rotate,scale和pivot等参数,他们实际上也是控制点的P属性
我们新建一个小球sphere,转化为polygon多边形,添加transform节点,调整rotate或者scale,实际上看到是属性P的值在变化。
从这里可以看出,参数面板中参数很多是为了方便我们人的直观思维和设计出来的,实际上对于houdini来说,都是调整同一个属性。比如scale,实际上就是让点沿着法线运动,实际上修改的还是点的位置属性。这也说明,参数是我们操控属性的一个工具而已。
houdini expression和Hscript
这个是houdini原生的表达式和编程语言,有点类似与maya的表达式和mel的关系。说得简单一点,表达式就是hscript的简洁版,可以直接在参数通道中使用的一两句简单的函数。而如果需要使用复杂的代码,那么就要使用的Hscript。
vex和vop
vex是类似与C/C++的一门语言,最开始是应用在shader材质编写中。特点是运行效率非常高,书写也比较简洁。vop是vex的可视化编程。也就是vex代码的功能都可以使用vop中的节点的实现,并且对于某些特殊的功能,比如noise和pattern等使用vop更加方便。
python
主要用于UI和某些节点的创建,对于制作各种快捷工具设置也非常方便。
上面的expression,Hscript,vex和vop,python都属于编程的范畴,对于expression表达式这种不能严格意义上说是编程语言。而这里就会有变量的说法,而这个变量可以用于定义属性,访问属性,和修改属性等。
局部变量VS全局变量
这里仅仅存在在上述编程概念,不会有局部属性和全局属性的说法。
对于expression表达式 局部变量比如 $TX,$CR之类的必须在某个特定节点/对象上才会存在(同理,在物体上也需要有对应的属性,比如P和Cd属性)。而$FF,$T,和$PI 等存在于软件中,不管是否有节点/对象都可以存在,可以称为环境变量或者是全局变量。
对于vex来说,也是同样道理,可以通过vex创建属性,但是对于vex这门语言来说其实还是使用局部变量对其访问,比如@P.x和@Cd.r;对于@Time和@Frame等存在于软件中的可以称为全局变量。
但是,对于vex语言来说还有另外一种“局部变量”,这个中定义是不生成属性的变量,仅仅在自身代码段中使用,这个概念更加偏向与代码原生的局部与全局的概念,与上面说的不是一个范畴的东西。
vex中创建局部变量
当如,除了全局变量,vex还可以创建局部变量,这个就有点类似与编程中的全局与局部的概念了。其实和属性不是一个范畴的东西。
比如下面代码中
float a=1.0;这里我们定义了一个局部变量,注意于定义属性的差异,f→float,并且没有@符号
那么这个a并不是属性,所以也不会在geometry spreadsheet中找到,同时只能在本节点代码中使用,并不能被外部节点调用。
组
组也是属性的一种,这个大家可以尝试一下在个点分组,会在geometryspreadsheet中看到对应的属性。下面分别使用group节点和wrangle节点创建同样的组:
group方式,输入group name为left,然后在basegroup中基于属性P.x的位置进行分组。
在wrangle中是写法是 @group_组的名字,=号右边输入分组成立的条件。
在geometryspreadsheet中可以都看到 group:left这个特殊的属性,数据类型为布尔类型 0代表不在组里,1代表在组里。
总结
上面说了一大堆,对于初学者来说可能会有点绕,到最后可能都不敢怎么用了。那么下面来做一个总结。
1属性(数据)可以说是一样的东西(要具体细分看上面).
2属性的操作可以直接修改,更多是通过参数,expression表达式,Hscript,vex语言,python,只是形式上和方法上不同,或者说是不同系统,但是可以实现同样的效果。记住,核心就是对属性的调用与控制。
3在houdini的世界里面,属性可以说是客观存在的对象,对于这些对象的操作我们使用第二点说的工具,并且通过变量进行创建,访问,修改和删除。
4在编程体系中谈到变量,分为局部变量和全局变量。
希望在讨论这些之后不会让大家晕乎,总之一句话。定义这些词汇和定义都是为了方便我们去使用,如果无法全面掌握这些,那么用就是了~
获得教程的方法:
如果大家对哪些知识点不是特别清楚的可以在文章后面留言,小编会把自己知道的整理成微课程帮大家解答。