Houdini JoyOfVex 教程06

06

Point wrangle vs prim wrangle(point wrangle节点与prim wrangle节点)
将颜色先变为全黑,然后让R红色值与点距离关联:

float d = length(@P);
d *= ch('scale');
@Cd = 0;
@Cd.r = sin(d);

在wrangle节点的Run Over下拉菜单中,我们将Points改为Primitives:
你能看到平面上的颜色边缘显得更锐利了,就像8bit像素游戏一样的风格。同时,你也能注意到,@Cd属性从spreadsheet面板上消失了!但是不要慌!先喝杯热水压压惊,点击spreadsheet面板上的primitives按钮,你会发现我们调皮的@Cd颜色属性跑到这旮旯来了。

你的小脑瓜现在肯定在想,为啥颜色看起来更锐利了呢?让为师来告诉你其中的奥妙吧。因为点(points)是处于面(primitives,primitives不一定指面,但是这里是指面)上的,一个点可被多个面共享,颜色在面与面之间会自动混合,产生渐变。但是如果我们直接给面着色的话,一个一个面就是单一的颜色,没有那种混合的效果了。
译者注:关于Points,Verts和Prims的区别与联系,详见此教程:https://www.bilibili.com/read/cv761219

那我们把应用类型改为面之后,我们改变@P属性会是啥效果呢?

float d = length(@P);
d *= ch('scale');
@P.y = sin(d);

来回切换点和面模式试试,似乎面模式下,这些代码并不起作用。是哒,它只对点有效。你如果够细心的话,之前看spreadsheet面板的时候就应该注意到了,@P位置属性始终停留在Points面板下,不离不弃,不像@Cd一样,背信弃义,说跑就跑,投奔他人麾下。所以面是不能拥有@P属性的,代码在其上运行自然没啥效果。

译者注:见http://www.sidefx.com/docs/houdini/model/attributes.html的COMMON ATTRIBUTES下的列表。有些属性只能在某一个或两个层级上使用,比如这里P只能存在于point层级上,uv只能存在于vertex或者point上,primitive上是不行的。

等等…看到这你可能已经想到了,为啥之前@ptnum和@Time这些属性能用呢?它们也没写在Points面板下面啊…这是因为它们是伪属性(pseudo-attributes)。Vex有一些像这样的只读(read-only)属性。

译者注:这段感觉作者写的有点迷- -…你只要知道houdini中有points,vertices,primitives,detail这4个不同层级,每个层级都能拥有自己的属性就行了。它们都能在spreadsheet面板上查看。

How to know about attributes like ptnum, P, N numpt etc(从哪得知这些属性呢)

有个简单的查找方法,你可以新建一个vop节点,点进去看看。哇,是不是P, V, Cd, N, ptnum等等属性都在这里,是哒,这些都是houdini中的常用属性,这些属性有其具体的意义,比如Cd就代表颜色值,会体现在模型颜色上。具体的你也可以打开帮助文档自己查。

译者注:VOP就是Vex OPerations,VEX编辑模组。

Other modes on a wrangle, vertex and detail(wrangle节点Run Over下的其它层级,vertex和detail)
类似primitives层级,vertex顶点层级就是让代码作用在每个顶点上。vertex模式基本只用在uvs上,很少用在其他地方。
那么detail层级是个啥玩意呢?简单来说,它意味着“只运行一次”(‘run once’)。在很多情况下这是很方便的,比如说你要计算一个物体的边界框(bounding box),或者在某处设置一个文字变量,你就可以使用这种模式。后面章节我们还会介绍到这货。

你也可以把属性设置在这个detail下,点击spreadsheet面板的detail按钮来查看这些数据。

译者注:还记得我们第一章提过vex是SIMD的吗,它支持多线程和并行运算。简单来说,你在点层级写下代码,实际上是在所有点上同时执行你的代码,这也是vex语言速度快的重要原因之一。当然,像@ptnum这些属性,在第一个点上它的值就被识别为0,第二个上面就是1,第三个是2,也就是spreadsheet面板上每个点拥有的单独的属性值。所以你的代码是跑了好多遍的(有多少个点就执行多少次)。vertex和prim层级同理。而detail层级上代码只执行一次。

Moving beyond P N Cd ptnum(不止是P,N,Cd,ptnum,让我们自定义属性)

我们目前写的所有demo最终都是改变位置或颜色的值来产生视觉效果。如果你只是想把一些数据给存储起来呢?比如你可能想存储每个点到原点的距离,然后等会在另一个wrangle节点用到它?
译者注:还记得我们第一章提到属性和变量的区别吗?属性的好处是数据一直存在着,能被你接下来的操作调用。所以我们可以用属性来存东西。

理所当然地,你可以创造你自己的属性,只要在它前面加上@符号修饰即可:

float d = length(@P);
@mydistance = d;

事实上,我们基本不像这样使用局部变量来过渡,因为你完全可以直接给你的属性赋值并且读取它啊:

@d = length(@P);
@d *= ch('scale');
@Cd = 0;
@Cd.r = sin(@d);

译者注:实际上,自定义属性和定义变量一样,要在名字前加数据类型的,不加就是默认float类型。 比如string @words[],或者i@myinteger(一般用这种写法,这个i代表int)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值