Houdini vex 学习笔记(三)
好久没有更新博客了,一直没时间。
// 速度反射
比如做飞镖打耙的效果,有的飞镖直接中靶插在上面,但也有可能有部分因为角度的原因被靶子反射的回来
1 @v = @vprevious; 2 @hitangle = dot(normalize(@v),normalize(@hitnml)); 3 if (@hitangle < ch("angle_threshold")) { 4 i@dobounce = 1; 5 @v = reflect(@v, @hitnml) * ch("scale_bounce_velocity");
@hitnml 是碰撞点的法线
// 模型 Smooth
模型Smooth其实用vex实现不难,这段代码实现的是比较简单的Smooth效果,在一个案例中看到,觉得代码很简洁,可移植性很强,就贴这里,以备后用~
1 int npts[] = neighbours(0, @ptnum); 2 vector avg = @P; 3 foreach (int npt; npts) 4 { 5 vector npos = point(0, 'P', npt); 6 avg += npos; 7 } 8 avg /= len(npts)+1; 9 @P = avg;
// Quaternion 的旋转
很少在vex中利用Quaternion 来旋转物体,感觉quaternion毕竟没有3x3矩阵来的直观,今天看到了一个范例,还蛮有意思
1 //Rotate vector 2 vector4 rot = quaternion(angle,v@spin); // create quaternion 3 pos = qrotate(rot,pos); //rotate
angle是float型弧度,spin是旋转轴(绕那个轴旋转)
// Bend Curve
法线和点的序号如下左图,
旋转后的曲线右图 ( 旋转曲线的主要目的是利用wiredeform旋转模型)
//array to hold positions because //wrangle does not update attributes //well in recursive loops vector positions[]; //Fill pos array for (int i = 0; i < @numpt; i++){ vector pos = point(0,"P",i); append(positions,pos); } //Do recursive rotate for each point for (int i = 1; i < @numpt; i++){ float angle = point(0,"angle",i); angle *= ch("multiplier"); //Rotate root position vector root = positions[i-1]; vector N = point(0,"N",i-1); //Rotate every point above the root for (int k = i; k < @numpt; k++){ //Next position vector pos = positions[k]; //Move to origin pos -= root; //Rotate vector vector4 rot = quaternion(-angle,N); pos = qrotate(rot,pos); //Return Position pos += root; //Update Position positions[k] = pos; } } //Set positions from array for (int i = 0; i < @numpt; i++){ vector pos = positions[i]; setpointattrib(0,"P",i,pos); }
angle角度是一个渐变 ,根据@ptnum 逐渐增大 ,还可以加个Ramp 方便控制
// Curve 上点的分布的调节(Spline函数)
创建一个curve,resample一下(得到curveu属性)。如下图,端口1生成array,按顺序存入所有点的位置(P)
相应的代码分别
v[]@stemPs; for( int i = 0; i < npoints(0); i++) { vector thisP = point( 0, 'P', i); append( v[]@stemPs, thisP); }
最后的节点code(Run Over Points)
vector keys[] = detail( 1, 'stemPs', 0); float lookUpLoc = pow( @curveu, ch('pow')); @P = spline( 'linear', lookUpLoc, keys);
这样控制pow参数的大小,可以控制点的分布;pow=1,点的分布不变,pow越大越向0号点聚集。下图是pow=1和pow=10的结果图