目录
dihedral —— 计算旋转矩阵或四元数(将vector a旋转到vector b)
maketransform —— 构建3*3或4*4变换矩阵
packedtransform —— 对packed primtive进行变换
getpackedtransform —— 获取packed primitive的变换
setpackedtransform —— 设置packed primitive的变换
solvecurve —— 返回本地骨旋转的vector/matrix3矩阵
solvefbik —— 应用full-body反向运动学算法
solvephysfbik —— 应用full-body反向运动学算法及可选的质心控制
ntransform —— 变换表示normal的vector
fromNDC —— 将位置从NDC空间变换为合适空间的坐标
ow_space —— 将位置从object空间变换到world空间
ow_nspace —— 将normal从object空间变换到world空间
ow_vspace —— 将方向从object空间变换到world空间
tw_space —— 将位置从texture空间变换到world空间
tw_nspace —— 将normal从texture空间变换到world空间
tw_vspace —— 将方向从texture空间变换到world空间
wo_space —— 将位置从world空间变换到object空间
wo_nspace —— 将normal从world空间变换到object空间
wo_vspace —— 将方向从world空间变换到object空间
wt_space —— 将位置从world空间变换到texture空间
wt_nspace —— 将normal从world空间变换到texture空间
wt_vspace —— 将方向从world空间变换到texture空间
dihedral —— 计算旋转矩阵或四元数(将vector a旋转到vector b)
//计算旋转矩阵 matrix3 dihedral(vector a, vector b) //计算四元数 vector4 dihedral(vector a, vector b)
- VOP中对应的节点 Align ;
//提取v1到v2的旋转矩阵,并应用
vector v1 = point(1, 'v1', 0);
vector v2 = point(1, 'v2', 0);
matrix3 m = dihedral(v1, v2);
@P *= m;
maketransform —— 构建3*3或4*4变换矩阵
//物体z轴对应zaxis,up对应yaxis,如为maketransform({0,0,1}, {0,1,0})将为单位矩阵 matrix3 maketransform(vector zaxis, vector yaxis) //与maketransform(int trs, ...)规则一样,但仅用于旋转 matrix3 maketransform(int xyz, vector angles) //yaxis为up,类似lookat;maketransform({0,0,1}, {0,1,0})为单位矩阵; matrix maketransform(vector zaxis, vector yaxis, vector translate)//按变换顺序构建4*4变换矩阵 matrix maketransform(int trs, int xyz, vector t, vector r) matrix maketransform(int trs, int xyz, vector t, vector r, vector s) matrix maketransform(int trs, int xyz, vector t, vector r, vector s, vector p) matrix maketransform(int trs, int xyz, vector t, vector r, vector s, vector p, vector pr) matrix maketransform(int trs, int xyz, vector t, vector r, vector s, vector p, vector pr, vector shears)
- 不像大多数VEX函数,旋转单位为角度而不是弧度;
- p中心点偏移,pr坐标系旋转,此两个参数会形成新的坐标系;
- VOP中对应的节点 Make Transform ;
vector4 q = quaternion(set(0,0,1)*ch('z'));
//等价于
matrix m = maketransform(0,set(0,0,1)*degrees(ch('z')));
packedtransform —— 对packed primtive进行变换
void packedtransform(int input, int primnum, matrix transform)
- 将修改P属性和transform内在属性;
- 相当于直接在point层级应用变换;
- 相当于在prim层级,先自旋转(intrinsic:transform),在将本身位置(P)变换;
//等价于,prim层级
// matrix to transform by
matrix transform = ident();
rotate(transform, radians(45), {0,1,0});
translate(transform, {0,1,0});
// get current packed transform
matrix3 primtf = primintrinsic(0, "transform", primnum);
setprimintrinsic(0, "transform", primnum, primtf * (matrix3)transform);
int primpoint = primpoint(0, primnum, 0);
vector pos = point(0, "P", primpoint);
setpointattrib(0, "P", primpoint, pos * transform);
//等价于,point层级直接应用变换
@P *= transform;
getpackedtransform —— 获取packed primitive的变换
matrix getpackedtransform(int input, int primnum)
- 此函数构建一变换,从P属性和transform内在属性,忽略packedfulltransform内的各种细节;
- pivot内在属性;
- 实例instance属性如orient(当pointinstancetransform使用,crowd agent);
- packedlocaltransform内在属性(alembic);
- 此函数不会返回预期的变换在这几种情况;
- setpackedtransform函数也有同样的问题,如有非零的packed pivot或以上情况,packedfulltransform将不会包含所期望的矩阵;
// matrix to transform by
matrix transform = ident();
rotate(transform, radians(45), {0,1,0});
translate(transform, {0,1,0});
matrix tf = getpackedtransform(0, @primnum);
setpackedtransform(0, @primnum, transform * tf);
setpackedtransform —— 设置packed primitive的变换
void setpackedtransform(int input, int primnum, matrix transform)
- 修改P属性和transform内在属性;
- 相当于先把模型归到原点,在应用变换;
// matrix to transform by
matrix tf = ident();
rotate(tf, radians(45), {0,1,0});
translate(tf, {0,1,0});
matrix transform = getpackedtransform(0, @primnum);
setpackedtransform(0, @primnum, transform * tf);
instance —— 创建一个实例变换矩阵
matrix instance(vector P, vector N) matrix instance(vector P, vector N, vector scale) matrix instance(vector P, vector N, vector scale, vector pivot) matrix instance(vector P, vector N, vector scale, vector4 rotate, vector up) matrix instance(vector P, vector N, vector scale, vector4 rotate, vector up, vector pivot) matrix instance(vector P, vector N, vector scale, vector4 rotate, vector4 orient) matrix instance(vector P, vector N, vector scale, vector4 rotate, vector4 orient, vector pivot)
- 类似Copy节点,变换其实例;
- pivot会影响位置,是因为影响坐标系;
- 先计算orient,在计算rotate;
- 支持两种方法设置旋转
- 方法一,要求显式的矢量up(应是N的切线方向),与N一起确定方向;
- 方法二,使用显式的orient(相对的XYZ轴);
- VOP中对应的节点 Make Instance Transform ;
//类似copy应用
vector P = point(1, 'P', chi('num'));
vector N = point(1, 'N', chi('num'));
@P *= instance(P, N);

lookat —— 创建旋转矩阵或角度去定向-Z轴
matrix3 lookat(vector from, vector to) matrix3 lookat(vector from, vector to, float roll) matrix3 lookat(vector from, vector to, vector up) vector lookat(vector from, vector to, float roll, int xyz) vector lookat(vector from, vector to, vector up, int xyz)
- -Z轴匹配指定矢量(方向=to减from),即摄像机是朝向-Z轴的,可理解为摄像机方向;
- roll 单位为degree;
- VOP中对应的节点 Look At ;
vector v = point(0, 'v1', 0);
@P *= lookat(chv('from'), chv('to'), ch('roll'));
pretranslate —— 对矩阵应用预位移
void pretranslate(matrix &m, vector amount)
prerotate —— 对矩阵应用预旋转
void prerotate(matrix3 &m, float amount, vector axis) void prerotate(matrix &m, float amount, vector axis)void prerotate(matrix3 &m, vector angles, int xyz) void prerotate(matrix &m, vector angles, int xyz)//XAXIS=1、YAXIS=2、ZAXIS=4 void prerotate(matrix3 &m, float angle, int axis) void prerotate(matrix &m, float angle, int axis)
- 单位需为弧度,轴应标准化;
prescale —— 对矩阵应用预缩放
<

本文详细介绍了Houdini中一系列用于计算和应用空间变换、旋转、缩放、投影等操作的函数,包括矩阵操作、四元数、空间转换以及骨骼动画解决方案,是3D建模和视觉效果开发的重要参考。
最低0.47元/天 解锁文章
509

被折叠的 条评论
为什么被折叠?



