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

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>从而构成新的坐标轴(三个轴两两垂直且规格化)。
matrix mlookatup (vector v1, vector v2, vector upv)
获取一个3*3旋转矩阵。可以理解为将单位矩阵的Z轴指定为<v1>-<v2>,Y轴指定为<upv>从而构成新的坐标轴(三个轴两两垂直且规格化)。
vector objlookat (string base_node, string target_node, vector upv)
计算视点从一个对象到另一个对象的旋转矢量。
matrix mobjlookat (string base_node, string target_node, vector upv)
获取从一个对象到另一个对象的变换矩阵。该矩阵为4*4矩阵,计算方式同mlookatup。
matrix dihedral (vector v0, vector v1)
返回一个旋转矩阵,该3*3矩阵将把向量v0旋转到向量v1(v0*dihedral=v1)。
float determinant (matrix mat)
返回矩阵的行列式。说明:这只对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 p, vector 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主会再接再厉,逐步将其消化并将收获分享给大家,一起享受知识得乐趣。