1、取整函数:

  ceil() floor() int() rint() trunc() round()

  ceil()取整函数,将小数部分省略,取整数值大一的值。 eg:ceil(6.1)=7;

  floor()取整函数,将小数部分省略,只取整数部分。 eg:floor(6.1)=6 or floor(6.9)=6;

  int()取整函数,将小数部分省略,只取整数部分。 eg:int(6.5)=6;

  trunc()取整函数,将小数部分省略,只取整数部分。 eg:trunc(6.5)=6;

  rint()取整函数,遵循四舍五入的取值原则。 rint(6.5)=7 or rint(6.1)=6;

  round()取整函数,遵循四舍五入的取值原则。 round(6.5)=7 or round(6.1)=6;

  取整函数大致分为这三种类型: 1)、ceil()将小数部分省略,取整数值大一的值。

  2)、floor()、int()、trunc()取整函数,将小数部分省略,只取整数部分。

  3)、rint()、round()取整函数,遵循四舍五入的取值原则。

  取整函数还有一种是sign()函数

  sign()函数是但参数变量为0时,取值为0,当参数变量取值为负数时,则取值-1,当参数

  变量取值为正数时,则取值为1。她的取值空间就是-1,0,1。这个函数只能取三个状态值。


  2、wrap()周期函数:

  wrap()函数:可以做一个周期效果,产生周期性的分布效果,与求余有一样的效果。

  wrap()函数的基本使用:wrap(变量,周期最小取值,周期最大取值)

  eg:wrap($F,0,20)

  它的取值空间在1-20之间,当变量值大于20时,进入下一个周期,从1开始继续取值。

  注意下wrap()函数和clamp()函数的函数曲线。唯一的区别在于wrap()函数拥有周期性的特点。



  3、fit()函数,适配函数:

  fit()函数拥有三种不同的适配方式

  1)、fit01()函数

  fit01(变量,新的范围最小值,新的范围最大值)

  案例说明下

  创建line节点,为line添加属性,这里创建一个attribcreate节点,添加一个以aaa命名的点属性,class:point(点属 性),value这里使用$BBX作为属性aaa的值,这也说明了属性aaa只能在0-1之间任意取值,当这里加入fit01()函数 时,fit01($BBX)这里的取值从0-1扩大到0-10的取值,fit01()函数对原有的取值范围进行均匀的映射。

  只有在变量参数的取值范围在0-1之间是才可以使用fit01()函数进行映射取值。

  fit01()函数针对的事原有变量是0-1的范围才可以是fit01()这个函数进行映射,按变量值在范围值内均匀取值。

  2)、fit10(),fit01(),fit11()的映射取值的方式

  fit10()函数的取值与fit01()函数的取值范围正好相反。



  fit11()函数是从-1-1的取值范围进行取值。

  这些fit()函数相对比较麻烦。现在用fit()函数代替以上几种fit()函数的形式

  fit()函数的格式:fit(变量,原有的范围最小值,原有的范围最大值,新的范围最小值,新的范围最大值)

  eg:

  fit($PT,$NPT-1,0,1) 这样可以将取值规范化处理。

  fit($PT,$NPT-1,0,10) 这样将取值的范围扩大了10倍。


  4、distance() Houdini所特有的内置函数,用于测量两个点之间的距离。

  先说明下distance()函数的使用:

  先创建两个点用于测量,我们用Add节点,创建随机的两个点,计算了下两个点之间的距离值,将测量的距离值用font节点打印出来。

  distance()函数的格式:

  distance(X1,Y1,Z1,X2,Y2,Z2)也就是写入所需要测量的两个点的XYZ空间坐标。

  我们这里通过前面的案例说明下distance()函数的使用:在font节点的text属性中写入distance(),将测量的距离结果打印出来。

  表达式:

  `distance(point("../add1",0,"P",0),point("../add1",0,"P",1),point("../add1",0,"P",2),point("../add1",1,"P",0),point("../add1",1,"P",1),point("../add1",1,"P",2))`


  5、length()函数用于求线段的长度值或者向量的值。

  这里用一个案例说明下lenght()函数来求速度的大小。

  创建一条线段,给予线段一定点数量,方便做spring弹簧的解算效果。为通过spring解算过的线段添加属性,创建一个attribcreate节点,添加一个命名为speed的新属性,

  value:length($VX,$VY,$VZ)使用lenght()函数计算。

  创建sphere小球,通过copy节点,将小球拷贝到解算的线段上。在copy节点的Uniform scale的属性上调用前面新添加的属性:$SPEED/30 让小球根据lenght()函数计算出来的结果,对小球进行整体的缩放。


  6、Normalize()函数的使用(标准化函数)

  ①、normalize()是一个标准化函数,使向量的长度值为“1”,只为了对向量的长度做一个标准化的控制。它不对方向进行控制,只是对长度保持一致,做规范化的处理,(向量由长度和方向构成的,Normalize()函数只是对长度值做修改)。

  现在用案例说明下:



  这里利用polygon sphere发射粒子,通过为粒子添加法线,将速度方向显示出来add normal :($VX,$VY,$VZ),添加一个新属性对速度的做一个标准化的处理。创建一个attribcreate节点,

  name:(新属性的名称)normalvel ;type:(新属性的数据类型)vector创建一个向量类型;

  value:(变量的数值)vector3($VX,$VY,$VZ);这里将分量写在vector3()的函数内,将三个分量合为一个向量,整体的表述出来。

  ②、法线,速度都是三元向量,使用 vector3()函数一次性的将向量表述出来,现在在对速度进行标准化处理。他表述的向量:normalize(vector3($VX,$VY,$VZ))

  而在value中写入的是三个分量,那么如何将一个向量写入分量中。这里在向量的后面加入[0]将分量提取出来,这样就可以将向量以分量形式写入value中了。

  value:

  normalize(vector3($VX,$VY,$VZ))[0]

  normalize(vector3($VX,$VY,$VZ))[1]

  normalize(vector3($VX,$VY,$VZ))[2]

  ③、现在验证下速度的规范化处理,我们要的是要创建自定义向量属性normalvel的分量形式,才可以写入normal的三个框中。

  在attribcreate的节点下再次创建point节点,添加法线属性,add normal:($NORMALVELX,$NORMALVELY,$NORMALVELZ),在变量之后加入X,Y,Z进行向量转分量的输入。

 


  ④、在houdini中,对于粒子速度的调整,要在particle节点之前使用,现在在particle节点之后使用$NORMALVEL向量修改速 度,显然是无法实现的,因为这是通过point节点对速度的修改,而不是通过节点解算得到的速度结果。在sop模块下,对速度的修改要在解算之前,不对解 算后的速度节点进行修改更新。


  7、mindist()或者 pointdist()两个函数等价。都是求点到面的距离。

  1、XYZdist()是空间点到面上的距离,这是与上面的两种函数的区别;

  pointdist()函数的基本格式:

  pointdist(“点所在节点的路径”,点序号,“面所在节点的路径”,面序号,通道号)

  pointdist()函数输入的是点序号,算的是实际点到面上的距离值。这里的通道号,表示所求的属性,“0”代表的是求的点到面上的距离值,“1”代表的是所求面上落点的u方向的坐标值,“2”代表的是所求面上落点的v方向的坐标值。


,houdini技巧,houdini教程