前言

之前看了applied houdini出的雪的教程,一开始以为是用pop做的,学了之后发现是用的vellum。其实这个雪的笔记已经开始在梳理了,但是在梳理过程中因为之前从没接触过vellum模块,所以很多地方都学的一知半解。所以找了这个Entagma Vellum系列教程,从vellum基础开始学起。

同样这个系列笔记不是记录制作流程,所以需要你看过这个教程,或者至少看过我提供的hip文件,有过了解再看比较好。

(找教程的话,百度下Grains & Vellum Entagma Houdini)

那现在就正式开始吧!

vellum constraints节点

这个效果实现,一共使用了三个vellum constraints,第一个是构建cloth约束,第二个是固定四个边缘,第三个则是在中间添加pin约束,约束本身的形状导致了最终cloth中间的图案。所以一开始,就需要先理解下vellum constraints这个节点了。

vellum constraints就是给vellum对象添加约束的节点,所有的vellum对象的形态,都是靠约束来影响的。也就是说,约束才决定了vellum对象的具体形态,比如到底是软体,还是布料等等。

vellum constraints第一个参数就是Constraint Type,翻译过来是约束类型。但是实际上,这个参数只是约束的预设。

鼠标悬浮在Constraint Type上,弹出来的窗口能看到,Parameter是constrainttype,而并非type。真正的约束类型,也就是primtive上的type属性是不能直接通过这里面的参数调整的。

这十多个约束预设,有的好理解,有的难理解。在这里我只扩展了前三种。(不算none类型)因为前三种跟第一个教程用到的布料约束关系很大。

Distance Along Edges

视图中的线就是distance along edges产生的约束线,这个预设产生的约束类型是distance,同时除了共有的参数外,还会多出一个Stretch的参数面板可以调节,还可以输出一个primtive组,叫stretch,所以这里可以把stretch替换distance去理解。

distance along edges就是沿着边的距离的意思,所以观察它产生的约束线,也是这个grid的边,只不过是以三角形分割四个点。而stretch就是拉伸的意思,我的理解就是在vellum对象受到外力的时候,这个约束控制vellum对象沿着它的拓扑结构拉伸的程度。

而通过调整Stretch中Rest Length Scale,可以相对的调节约束线的长度,而约束线的长度决定了vellum对象初始边的长度。当然这个参数是可以做动画的。而Stiffness控制的则是vellum对象恢复到初始状态的能力。这个参数我做过测试,没有看到太明显的变化,但是如果给的足够低,也就是说vellum对象没有足够的能力恢复到初始状态,在重力的作用下,一块布就会被无限的向下拉长。这种情况下,虽然约束线会变长,但是restlength这个属性值并不会变化。

Bend Across Triangles

这个预设给的约束线则是交叉式的。参数上没有了stretch,则是多了bend。primtive属性中的type也是bend。

如果vellum对象只有这一个约束的话,我做解算前几帧正常,后面就会突然卡住。看名字来说是控制弯曲的约束。这个先说到这,结合下一个预设来说。

Cloth

这就是这节教程中用到的布料预设了。首先看参数,stretch和bend同时都有。再看约束线,似乎也是综合了stretch和bend两个约束线。但是如果看primtive的type属性里,能发现同时存在distance和bend两种约束。也就说cloth的约束并不是一个新的约束,而是stretch和bend两个约束同时存在,只不过相同的位置因为视图原因被盖住了,看上去好像是只有一个约束线。

那是不是就可以说有stretch参数,就有distance约束,有bend参数,就有bend约束呢?也不能这么说。如果选择Glue预设,里面也有stretch参数,但是Glue本身似乎并不产生约束线,需要我们自己手动做约束线。而且甚至有的预设产生的约束并不是线,而是一个面。所以有什么参数并不能决定有什么约束线,换句话说,参数有无似乎与约束有无并没有直接的联系。

现在来看,cloth预设其实就是综合了前两种约束预设。stretch作用前面说了,bend在这里解释一点,bend的Stiffness值决定了布料的柔软度。

可以看到,Stiffness值越小,布料更柔软。而Rest Angle Scale我并没有测试出对形态的影响。

所以可以知道,vellum对象的布料状态,是由两种约束控制的。不过到这里,我还只是对这两种约束有一个大致的理解,具体的功能和原理之后再深入。

Pin to Target

第二个用到的vellumconstraints节点,使用的是pin to target预设。这个节点很好理解,就是固定vellum对象的点的。不过这个是直接对vellum对象的点进行操作,如果说想要做旗帜绑在旗杆上那种的固定,要使用Attach to Geometry预设才可以。

选择Pin to Target之后,会多出一个Pin to Animation的参数。这里主要看一下Pin Type的区别。

第一个是Permanent,永久的意思。这个模式下,被固定的点的mass值会被设置为0,这个mass值我的理解是点的质量,当mass为0的时候,点的质量为0,自然不会受到外力的影响。但是因为被固定的点的mass值已经被设置为0了,它没有储存之前的mass值,所以即便你不固定这个点了,它的mass还是会为0,不会对约束有所反应。所以这也是为什么这个模式被叫做Permanent的原因。

第二个是Stopped,这个就要先说一下stopped这个属性,在pop中很常见。当这个属性值为0的时候,粒子自由运动。当值为1的时候,粒子能旋转,但是不能位移。为2的时候,粒子不能旋转。但是可以位移。为3的时候,粒子不能旋转也不能位移。所以这个模式下,其实是被固定的点的stopped属性被设置为了1。

第三个是Soft,这个模式下,被固定的点会和它的目标位置之间产生一个长度为0的约束,那自然被固定的点就紧贴着目标位置不动了,但是它还可以受到stretch的影响。换句话说,这种约束模式并不是固定某个点,而是通过操控约束的方式来实现点的固定。但是它仍然可以受到stretch参数的影响。

下面的一些参数没有用到,先不提。

自定义pin固定vellum对象的点

接下来就是这个教程中的重点,使用自定义的范围来做pin约束。

这个的原理是通过给约束线做分组,控制组内的约束来实现点的固定。因为使用的是Soft模式,所以可以通过调整stretch的stiffness参数,来决定点是否被固定,当stiffness为0的时候,就不会受到pin的影响了。这个要理解soft模式才能比较好的理解第三个pin约束的作用。

这其实引出了另一个问题,就是当用到两个或者多个vellum constraints时,都有stretch或者bend参数,他们怎么互相影响呢?我的理解是,虽然这里用了两个pin约束,但是每个约束,都会自己产生新的约束线,最终的vellum的结果,是综合了很多种、很多个约束,最终的结果来解算的。不过这样看的话,似乎约束类型必然有一个优先级,来计算哪种约束是最强的,比如如果这个点被pin约束固定了,那么不管其他的约束线给他多少力,都不应该受到影响。

vellumsolver

最后来看下vellumsolver,这个其实是dop的一个封装。里面的vex也很直观,唯一想说的是,在使用geometrywrangle的时候,在Data Bindings中,将Geometry改为ConstraintGeometry。这个是什么意思呢?

回到外面的vellum constraints节点,查看它的信息,在View Output中,有三个选项。一般情况下,对象数据流入一个节点,经过这个节点处理,再流出一个对象数据。但是一些节点可能会产生多个对象数据。vellum constraints就是这样,它产生了vellum对象本身,还会产生约束线,还会产生碰撞体对象三种数据。

而我们geometrywrangle中做的,就是为了让这个geometrywrangle只对约束对象起作用,而不对vellum对象或者碰撞体什么的起作用。

所以,第00期的教程笔记梳理就到这里啦。

(完)

Leave a Reply