欢迎光临散文网 会员登陆 & 注册

HExp12-2|Houdini Expression functions全集之向量矩阵类:

2023-06-05 21:12 作者:RMT的学习笔记  | 我要投稿

RMT对向量矩阵的理解:数字成组为向量(数组),向量成组为矩阵(行列式)。

1、创建向量

创建一个向量的几种方法
  • vector vector (string pattern)

    由一个数组构成为向量。该变量是方括号包括数字形式的字符串,例如:

    > vector v = vector("[1,2,3,4,5]")

    > float  f = v[0]; # f is 1(调取向量中的第一个元素值)

  • vector vector3 (float x, float y, float z)

    将三个值转换为三分量向量。该变量是三个数

  • vector vector4 (float x, float y, float z, float w)

    将四个值转换为四分量向量。该变量是四个数

  • vector vset (float size, float value)

    创建一个向量,<size>为向量的维数,<value>为每一维的值,也就意味着该向量的各维值相同。

2、向量计算

  • float origin (string obj1, string obj2, string constant_type)

    获取一个值,该值为将obj1转换为obj2所需的TX、TY、TZ、RX、RY、RZ、SX、SY、SZ值中的一个,具体取决于类型参数(TX,TY,TZ,RX,RY,RZ,SX,SY或SZ)。如果为obj1或obj2指定了空字符串,则表示为零值,计算方式如下所示:

    (obj2-obj1)/(0-obj1)/(obj2-0)

  • float originoffset (string obj1, vector pos1, string obj2, vector pos2, string constant_type)

    获取一个值,该值为将对象obj1空间中的点pos1转换为对象obj2空间中的点pos2所需的TX、TY、TZ、RX、RY、RZ值之一,具体取决于类型参数(TX、TY,TZ,RX、RY或RZ)。这也可以被认为是obj2中pos2相对于obj1中pos1的位置。

  • vector vorigin (string obj1, string obj2)

    计算对象2相对于对象1的平移量和旋转量。

  • vector vtorigin (string obj1, string obj2)

    计算对象2相对于对象1的平移量。

  • vector vrorigin (string obj1, string obj2)

    返回一个向量,该向量包含将obj1转换为obj2空间所需的旋转。这也可以被认为是obj2相对于obj1的方向。

  • float vsize (vector vec)

    返回向量的维数。即一个数组的元素个数。

  • vector vscale (vector vec, float scale)

    将向量的各维值乘以一个数,即缩放该向量。

  • float vlength (vector vec)

    计算向量的长度。A.K.A. sqrt (dot (vec, vec))。

  • float vlength2 (vector vec)

    计算向量长度的平方。A.K.A. dot(vec, vec)。

  • float vangle (vector v0, vector v1)

    计算两个向量夹角的度数。A.K.A. acos (dot (normalize(a),normalize(b)))。

  • float boneangle (string bone1, string bone2)

    返回两个骨骼对象之间关节处的夹角度数。

  • float dot (vector v0, vector v1)

    向量点乘。返回数值,值为|v0||v1|cos<v0,v1>,也等于v0 [0]* v1 [0]+ v0 [1]* v1 [1]+ v0 [2]* v1 [2]。

  • vector cross (vector v1, vector v2)

    向量叉乘。返回向量,长度为|v1||v2|sin<v1,v2>,也有|cross|^2= |v1|^2*|v2|^2- dot^2,方向与v1,v2所在平面垂直(遵循右手法则)。

  • float normal (string surface_node, float prim_num, float u, float v, float index)

    返回曲面物体指定面与UV坐标下法线向量的某一维的值。u和v是单位值,定义在[0,1]区间内。如果物体是mesh类型,则u和v是根据其行数和列数定义的。index取值如下:

    0 —— X

    1 —— Y

    2 —— Z

  • vector normalize (vector v)

    对向量进行规格化,即转化为单位向量,实际上就是将各维的数值等比缩小至0~1之间。

3、建立矩阵帝国

  • matrix identity (float size)

    创建一个单位矩阵。<size>为行列数,行数与列数相同。

  • matrix matrix (string pattern)

    由一组数组构成为矩阵。<pattern>是一组方括号包括数字形式的字符串再由方括号包括而成,示例如下:

    > matrix m = matrix("[[1,2,3][2,3,5][-3,2,-3]]")

    > vector v = m[0];    # v is [1,2,3](调取矩阵中的第一组数组)

    > float  f = m[0][2]; # f is 3(调取矩阵中第一组数组中的第三个数)

  • matrix translate (float tx, float ty, float  tz)

    获取X、Y和Z平移值,并返回平移矩阵。平移矩阵是4*4矩阵,存储物体的平移信息。

  • matrix rotate (float angle, string axis)

    从一个角度和一个轴返回一个4×4的旋转矩阵。axis为X/Y/Z轴,以"X"、"Y"、"Z"形式填写。旋转矩阵是4*4矩阵,存储物体的旋转信息。

  • matrix rotaxis (float angle, vector axisv)

    从一个角度和一个向量返回一个4×4的旋转矩阵。该向量代表旋转轴的任一性,不像rotate中那样仅以坐标轴为旋转轴。<angle>以度为单位,围绕3*3向量<axisv>指定的轴旋转一个角度。旋转矩阵应该出现在向量矩阵乘法的右侧。例如,要将向量[1,2,3]绕Y轴旋转10度,请执行以下操作:

    > vector("[1, 2, 3]") * rotaxis(10, "[0, 1, 0]")

  • matrix scale (float sx, float sy, float sz)

    获取三个缩放值并返回一个缩放矩阵。缩放矩阵是4*4矩阵,存储物体的缩放信息。

4、矩阵计算

  • float mcols (matrix mat)

    返回矩阵中的列数。

  • float mrows  (matrix mat)

    返回矩阵中的行数。

  • matrix mzero (matrix mat)

    返回一个所有值都设置为0的矩阵。即将输入的矩阵转化为0矩阵。

  • matrix morient (vector zaxis, vector yaxis)

    根据给定的z、y轴获取新的坐标轴。可以理解为由单位矩阵经过计算获取一个新的3*3矩阵,该矩阵由三个行向量组成且两两垂直,分别表示XYZ轴。<zaxis>与<yaxis>叉乘获得x轴,若<zaxis>与<yaxis>不垂直,则结果会自动调整<yaxis>的方向,且最终各向量经规格化。

  • matrix mlookat (vector v1, vector v2)        

    获取一个3*3旋转矩阵。可以理解为单位矩阵的Z轴指定为<v1>-<v2>从而构成新的坐标轴(三个轴两两垂直且规格化)。

  • matrimlookatup (vector v1, vector v2, vector upv)

    获取一个3*3旋转矩阵。可以理解为单位矩阵的Z轴指定为<v1>-<v2>,Y轴指定为<upv>从而构成新的坐标轴(三个轴两两垂直且规格化)。

  • vector objlookat (string base_node, string target_node, vector upv)

    计算视点从一个对象到另一个对象的旋转矢量。

  • matrimobjlookat (string base_node, string target_node, vector upv)

    获取从一个对象到另一个对象的变换矩阵。该矩阵为4*4矩阵,计算方式同mlookatup。

  • matridihedral (vector v0, vector v1)

    返回一个旋转矩阵,该3*3矩阵将把向量v0旋转到向量v1(v0*dihedral=v1)。

  • float determinant (matrimat)

    返回矩阵的行列式。说明:这只对4×4或3×3矩阵有效。如果矩阵大于4×4,将返回4×4的行列式。如果矩阵小于3×3,则在计算行列式之前,矩阵将被转换为3×3。向上转换的结果不能得到保证。

5、矩阵转换

  • vector matrixtoquat (matrix m)

    将旋转矩阵转换为四元数。

  • matrix quattomatrix (vector q)

    将四元数转换为3×3的旋转矩阵。

  • matrix transpose (matrix mat)

    返回转置矩阵,即行列互换。

  • matrix invert (matrix mat)

    返回逆矩阵。说明:只有当矩阵是4×4或3×3矩阵时,这才有效。如果矩阵大于4×4,则矩阵将在反转之前转换为4×4矩阵。如果矩阵小于3×3,则在反转之前,矩阵将被放大为3×3矩阵。将矩阵放大到3×3的结果是不能保证的。

  • float explodematrix (matrix mat, string trs, string xyz, string component) 

    可以理解为解读一个矩阵:她是由单位矩阵如何变换而来。或者说:将3×3或4×4的单位矩阵沿着XYZ轴进行平移、旋转、缩放获得指定的矩阵。该表达式返回平移、旋转、缩放的值,该值相当于transform节点里的Translate、Rotate、Scale值。3×3矩阵无平移信息。<mat>是指定的矩阵,<trs>和<xyz>给出了变换的模式,在trs中,t表示平移、r旋转和s缩放,xyz是指旋转的轴,相当于transform节点里的Transform Order,<component>是一个字符串,用于描述要提取的通道,它是[trs]与[xyz]的组合(例如“tx”或“ry”)。一个简单的示例如下:

    > explodematrix(identity(3)*2, "RST", "XYZ", "SZ")

    (返回值为2,表示将单位矩阵缩放2倍获得指定的矩阵)

  • float explodematrixp (matrix mat, vector p, string trs, string xyz, string component)

    同“explodematrix”,额外指定中心点位置<p>,该值相当于transform节点里的Pivot Translate。如下示例标明了各项的含义:

    > explodematrixp (optransform ("/obj/geo1"), vector3 (ch("/obj/geo1/px"),ch ("/obj/geo1/py"), ch ("/obj/geo1/pz")), "RST", "XYZ", "RZ")

  • float explodematrixpr (matrix mat, vector pvector pr, string trs, string xyz, string component)

    同“explodematrix”,额外指定中心点位置<p>和中心点旋转<pr>,该值相当于transform节点里的Pivot Translate和Pivot Rotate。Pivot Translate和Pivot Rotate指定了对象的中心点和相对坐标,使得对象不再以世界坐标进行变换。如下示例标明了各项的含义:

    > explodematrixpr (optransform ("/obj/geo1"),vector3 (ch ("/obj/geo1/px"), ch ("/obj/geo1/py"), ch ("/obj/geo1/pz")),vector3 (ch ("/obj/geo1/prx"), ch ("/obj/geo1"/pry), ch ("/obj/geo1/prz")), "RST", "XYZ", "RZ")

RMT血书:本章涉及大量高等代数内容,关于矩阵、四元数、欧拉旋转等概念,up主专门拜访了B站上各路大神的讲解视频,包括清华大学的课堂教学视频,老师讲解生动有趣,深感受益匪浅,然智力有限,只得皮毛,实难领会其中深意,望各位读者谅解。up主会再接再厉,逐步将其消化并将收获分享给大家,一起享受知识得乐趣。


HExp12-2|Houdini Expression functions全集之向量矩阵类:的评论 (共 条)

分享到微博请遵守国家法律