VEX —— Functions|Transforms and Space

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

目录

dihedral —— 计算旋转矩阵或四元数(将vector a旋转到vector b)

maketransform —— 构建3*3或4*4变换矩阵

packedtransform —— 对packed primtive进行变换

getpackedtransform —— 获取packed primitive的变换

setpackedtransform —— 设置packed primitive的变换

instance —— 创建一个实例变换矩阵

lookat —— 创建旋转矩阵或角度去定向-Z轴

pretranslate —— 对矩阵应用预位移

prerotate —— 对矩阵应用预旋转

prescale —— 对矩阵应用预缩放

translate —— 对矩阵应用位移

rotate —— 对矩阵应用旋转

rotate_x_to —— 将x方向旋转指定方向

scale —— 对矩阵应用缩放

smoothrotation —— 返回欧拉旋转


solveconstraint —— 返回本地骨旋转的矩阵

solvecurve —— 返回本地骨旋转的vector/matrix3矩阵

solveik —— 应用反向运动学算法

solvefbik —— 应用full-body反向运动学算法

solvephysfbik —— 应用full-body反向运动学算法及可选的质心控制


ptransform —— 从一空间到另一空间变换一矢量

ntransform —— 变换表示normal的vector

vtransform —— 变换表示方向的vector

fromNDC —— 将位置从NDC空间变换为合适空间的坐标

toNDC —— 将位置变换NDC空间坐标

ndcdepth —— 返回相机空间z-depth

orthographic —— 创建正交投射矩阵

perspective —— 创建透视投射矩阵

polardecomp —— 对矩阵计算极轴分解


getspace —— 返回从一空间到另一空间的变换矩阵

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 —— 对矩阵应用预缩放

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值