houdini--四元数与旋转笔记
copy to points节点:
默认勾选了Transform Using Target Point Orientations
这个选项会使用右边物体点上的方向属性,对左边的被拷贝物体进行控制
方向属性包括 @N、@up、@orient
@orient属性是控制方向的绝对规则,如果右边物体有orient属性,那么就优先按照orient属性来进行旋转
而orien就是一个四元数,在houdini中,我们可以用四元数来控制物体的旋转
//创建一个矩阵m,利用dihedral函数让矩阵m可以将{0,1,0}旋转到@N的方向
matrix3 m = dihedral({0,1,0}, @N);
//quaternion函数是将矩阵转化为四元数
@orient = quaternion(m);
旋转:
matrix3 m = dihedral({0,1,0}, @N);
// rotate 函数作用是让矩阵m绕@N进行旋转
rotate(m, radians(chf("rotate")),@N);
@orient = quaternion(m);
利用rotate的值来对物体进行自转操作
(对rotate乘上$FF进行k帧就可以实现螺丝钉的自动旋转)
void rotate(matrix3 &m, float amount, vector axis)
//m是要旋转的矩阵
//amount是要旋转的角度,需要是弧度制的数值
//axis是旋转轴,需要是归一化后的值
//axis也可以是整数值的1,2,4,分别代表x,y,z轴
法线摆动:
控制randSeed的值可以让图中的法线随机摆动
@N = fit01(vector(rand(@ptnum+ch("randSeed"))), {-0.2, 1, -0.2}, {0.2, 1, 0.2});
//fit01函数 fit01(<vector>value, <vector>nmin, <vector>nmax)
//作用是把第一个值value限制到nmin和nmax之间,最终得到的就是在nmin和nmax中的随机值
//@ptnum 当前遍历时本点的编号
开花算法:
首先,要控制线的旋转,如图0-17的节点,先将1-17号点绕0点旋转一定角度,之后,再把2-17号点绕1点旋转,如此往复,一直向后遍历
在attribwrangle6中计算各个点上的角度值
//attribwrangle6:
f@angle_ramp = chramp('angle_ramp', float(@ptnum)/(@numpt-1)) * ch('mult');
//对每一个点分配不同的角度值,不同的点旋转的角度大小不同
//以此来让最终的效果是上图所示越上面的点旋转的角度越大
float chramp(string channel, float ramppos)
//chramp 函数用来得到一个线性的值,channel是通道的名字(自己命名),ramppos是斜坡上面的位置
在attribwrangle5中进行主要的循环计算:
//在position中存入每个点的坐标值,通过更改每个点的坐标值来实现线的变动
vector position[];
for(int i=0; i<@numpt; i++){
vector pos = point(0, 'P', i);
append(position, pos);
}
//@numpt所有点的总和
//@ptnum当前点的标号
for(int i=1; i<@numpt; i++){
vector ori_pos = position[i-1];
vector n = point(0, 'N', i-1);
float angle = point(0, 'angle_ramp', i);
for(int j=i; j<@numpt; j++){
vector ori_dir = position[j] - ori_pos;
vector4 qua = quaternion(angle, n);
vector new_dir = qrotate(qua, ori_dir);
vector new_pos = ori_pos + new_dir;
position[j] = new_pos;
}
}
for(int i=0; i<@numpt; i++)
setpointattrib(0, 'P', i, position[i]);
这里用一个椭圆片代替花瓣,之后,通过wirecapture和wiredeform节点把线与花瓣绑定在一起
最终,就可以通过调整mult的参数来更改'花瓣'的弯曲