HExp12-2|Houdini Expression functions全集之向量矩陣類:

RMT對向量矩陣的理解:數(shù)字成組為向量(數(shù)組),向量成組為矩陣(行列式)。
1、創(chuàng)建向量

vector vector (string pattern)
由一個(gè)數(shù)組構(gòu)成為向量。該變量是方括號包括數(shù)字形式的字符串,例如:
> vector v = vector("[1,2,3,4,5]")
> float? f = v[0]; # f is 1(調(diào)取向量中的第一個(gè)元素值)
vector?vector3 (float x,?float?y,?float?z)
將三個(gè)值轉(zhuǎn)換為三分量向量。該變量是三個(gè)數(shù)
vector?vector4?(float?x,?float?y,?float?z,?float?w)
將四個(gè)值轉(zhuǎn)換為四分量向量。該變量是四個(gè)數(shù)
vector?vset (float size,?float?value)
創(chuàng)建一個(gè)向量,<size>為向量的維數(shù),<value>為每一維的值,也就意味著該向量的各維值相同。
2、向量計(jì)算

float?origin?(string?obj1,?string?obj2,?string?constant_type)
獲取一個(gè)值,該值為將obj1轉(zhuǎn)換為obj2所需的TX、TY、TZ、RX、RY、RZ、SX、SY、SZ值中的一個(gè),具體取決于類型參數(shù)(TX,TY,TZ,RX,RY,RZ,SX,SY或SZ)。如果為obj1或obj2指定了空字符串,則表示為零值,計(jì)算方式如下所示:
(obj2-obj1)/(0-obj1)/(obj2-0)
float?originoffset?(string?obj1,?vector?pos1,?string?obj2,?vector?pos2,?string?constant_type)
獲取一個(gè)值,該值為將對象obj1空間中的點(diǎn)pos1轉(zhuǎn)換為對象obj2空間中的點(diǎn)pos2所需的TX、TY、TZ、RX、RY、RZ值之一,具體取決于類型參數(shù)(TX、TY,TZ,RX、RY或RZ)。這也可以被認(rèn)為是obj2中pos2相對于obj1中pos1的位置。
vector vorigin (string obj1, string obj2)
計(jì)算對象2相對于對象1的平移量和旋轉(zhuǎn)量。
vector vtorigin (string obj1, string obj2)
計(jì)算對象2相對于對象1的平移量。
vector?vrorigin?(string?obj1,?string?obj2)
返回一個(gè)向量,該向量包含將obj1轉(zhuǎn)換為obj2空間所需的旋轉(zhuǎn)。這也可以被認(rèn)為是obj2相對于obj1的方向。
float?vsize?(vector?vec)
返回向量的維數(shù)。即一個(gè)數(shù)組的元素個(gè)數(shù)。
vector?vscale?(vector?vec,?float?scale)
將向量的各維值乘以一個(gè)數(shù),即縮放該向量。
float vlength (vector vec)
計(jì)算向量的長度。A.K.A. sqrt (dot (vec, vec))。
float vlength2 (vector vec)
計(jì)算向量長度的平方。A.K.A.?dot(vec, vec)。
float vangle (vector v0, vector v1)
計(jì)算兩個(gè)向量夾角的度數(shù)。A.K.A.?acos (dot (normalize(a),normalize(b)))。
float boneangle (string bone1, string bone2)
返回兩個(gè)骨骼對象之間關(guān)節(jié)處的夾角度數(shù)。
float dot (vector v0, vector v1)
向量點(diǎn)乘。返回?cái)?shù)值,值為|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坐標(biāo)下法線向量的某一維的值。u和v是單位值,定義在[0,1]區(qū)間內(nèi)。如果物體是mesh類型,則u和v是根據(jù)其行數(shù)和列數(shù)定義的。index取值如下:
0?——?X
1?——?Y
2?——?Z
vector normalize (vector v)
對向量進(jìn)行規(guī)格化,即轉(zhuǎn)化為單位向量,實(shí)際上就是將各維的數(shù)值等比縮小至0~1之間。
3、建立矩陣帝國

matrix?identity (float size)
創(chuàng)建一個(gè)單位矩陣。<size>為行列數(shù),行數(shù)與列數(shù)相同。
matrix matrix (string pattern)
由一組數(shù)組構(gòu)成為矩陣。<pattern>是一組方括號包括數(shù)字形式的字符串再由方括號包括而成,示例如下:
> matrix m = matrix("[[1,2,3][2,3,5][-3,2,-3]]")
> vector v = m[0];? ? # v is [1,2,3](調(diào)取矩陣中的第一組數(shù)組)
> float? f = m[0][2]; # f is 3(調(diào)取矩陣中第一組數(shù)組中的第三個(gè)數(shù))
matrix translate (float tx,?float ty,?float? tz)
獲取X、Y和Z平移值,并返回平移矩陣。平移矩陣是4*4矩陣,存儲物體的平移信息。
matrix rotate?(float angle,?string axis)
從一個(gè)角度和一個(gè)軸返回一個(gè)4×4的旋轉(zhuǎn)矩陣。axis為X/Y/Z軸,以"X"、"Y"、"Z"形式填寫。旋轉(zhuǎn)矩陣是4*4矩陣,存儲物體的旋轉(zhuǎn)信息。
matrix?rotaxis (float angle,?vector axisv)
從一個(gè)角度和一個(gè)向量返回一個(gè)4×4的旋轉(zhuǎn)矩陣。該向量代表旋轉(zhuǎn)軸的任一性,不像rotate中那樣僅以坐標(biāo)軸為旋轉(zhuǎn)軸。<angle>以度為單位,圍繞3*3向量<axisv>指定的軸旋轉(zhuǎn)一個(gè)角度。旋轉(zhuǎn)矩陣應(yīng)該出現(xiàn)在向量矩陣乘法的右側(cè)。例如,要將向量[1,2,3]繞Y軸旋轉(zhuǎn)10度,請執(zhí)行以下操作:
> vector("[1, 2, 3]") * rotaxis(10, "[0, 1, 0]")
matrix?scale (float sx, float sy, float sz)
獲取三個(gè)縮放值并返回一個(gè)縮放矩陣??s放矩陣是4*4矩陣,存儲物體的縮放信息。
4、矩陣計(jì)算

float mcols (matrix mat)
返回矩陣中的列數(shù)。
float?mrows? (matrix?mat)
返回矩陣中的行數(shù)。
matrix?mzero (matrix?mat)
返回一個(gè)所有值都設(shè)置為0的矩陣。即將輸入的矩陣轉(zhuǎn)化為0矩陣。
matrix morient (vector zaxis,?vector yaxis)
根據(jù)給定的z、y軸獲取新的坐標(biāo)軸??梢岳斫鉃?span id="s0sssss00s" class="color-purple-02">由單位矩陣經(jīng)過計(jì)算獲取一個(gè)新的3*3矩陣,該矩陣由三個(gè)行向量組成且兩兩垂直,分別表示XYZ軸。<zaxis>與<yaxis>叉乘獲得x軸,若<zaxis>與<yaxis>不垂直,則結(jié)果會自動調(diào)整<yaxis>的方向,且最終各向量經(jīng)規(guī)格化。
matrix mlookat (vector v1, vector v2)? ? ? ??
獲取一個(gè)3*3旋轉(zhuǎn)矩陣??梢岳斫鉃?span id="s0sssss00s" class="color-purple-02 font-size-16">將單位矩陣的Z軸指定為<v1>-<v2>從而構(gòu)成新的坐標(biāo)軸(三個(gè)軸兩兩垂直且規(guī)格化)。
matrix?mlookatup?(vector?v1, vector?v2, vector?upv)
獲取一個(gè)3*3旋轉(zhuǎn)矩陣??梢岳斫鉃?span id="s0sssss00s" class="color-purple-02 font-size-16">將單位矩陣的Z軸指定為<v1>-<v2>,Y軸指定為<upv>從而構(gòu)成新的坐標(biāo)軸(三個(gè)軸兩兩垂直且規(guī)格化)。
vector?objlookat (string?base_node, string?target_node, vector?upv)
計(jì)算視點(diǎn)從一個(gè)對象到另一個(gè)對象的旋轉(zhuǎn)矢量。
matrix?mobjlookat?(string?base_node,?string target_node,?vector upv)
獲取從一個(gè)對象到另一個(gè)對象的變換矩陣。該矩陣為4*4矩陣,計(jì)算方式同mlookatup。
matrix?dihedral (vector?v0,?vector?v1)
返回一個(gè)旋轉(zhuǎn)矩陣,該3*3矩陣將把向量v0旋轉(zhuǎn)到向量v1(v0*dihedral=v1)。
float?determinant (matrix?mat)
返回矩陣的行列式。說明:這只對4×4或3×3矩陣有效。如果矩陣大于4×4,將返回4×4的行列式。如果矩陣小于3×3,則在計(jì)算行列式之前,矩陣將被轉(zhuǎn)換為3×3。向上轉(zhuǎn)換的結(jié)果不能得到保證。
5、矩陣轉(zhuǎn)換

vector matrixtoquat (matrix m)
將旋轉(zhuǎn)矩陣轉(zhuǎn)換為四元數(shù)。
matrix?quattomatrix (vector?q)
將四元數(shù)轉(zhuǎn)換為3×3的旋轉(zhuǎn)矩陣。
matrix?transpose (matrix?mat)
返回轉(zhuǎn)置矩陣,即行列互換。
matrix?invert (matrix?mat)
返回逆矩陣。說明:只有當(dāng)矩陣是4×4或3×3矩陣時(shí),這才有效。如果矩陣大于4×4,則矩陣將在反轉(zhuǎn)之前轉(zhuǎn)換為4×4矩陣。如果矩陣小于3×3,則在反轉(zhuǎn)之前,矩陣將被放大為3×3矩陣。將矩陣放大到3×3的結(jié)果是不能保證的。
float explodematrix (matrix mat, string trs, string xyz, string component)?
可以理解為解讀一個(gè)矩陣:她是由單位矩陣如何變換而來?;蛘哒f:將3×3或4×4的單位矩陣沿著XYZ軸進(jìn)行平移、旋轉(zhuǎn)、縮放獲得指定的矩陣。該表達(dá)式返回平移、旋轉(zhuǎn)、縮放的值,該值相當(dāng)于transform節(jié)點(diǎn)里的Translate、Rotate、Scale值。3×3矩陣無平移信息。<mat>是指定的矩陣,<trs>和<xyz>給出了變換的模式,在trs中,t表示平移、r旋轉(zhuǎn)和s縮放,xyz是指旋轉(zhuǎn)的軸,相當(dāng)于transform節(jié)點(diǎn)里的Transform Order,<component>是一個(gè)字符串,用于描述要提取的通道,它是[trs]與[xyz]的組合(例如“tx”或“ry”)。一個(gè)簡單的示例如下:
> explodematrix(identity(3)*2, "RST", "XYZ", "SZ")
(返回值為2,表示將單位矩陣縮放2倍獲得指定的矩陣)
float?explodematrixp?(matrix?mat,?vector p,?string?trs,?string?xyz,?string?component)
同“explodematrix”,額外指定中心點(diǎn)位置<p>,該值相當(dāng)于transform節(jié)點(diǎn)里的Pivot Translate。如下示例標(biāo)明了各項(xiàng)的含義:
> 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”,額外指定中心點(diǎn)位置<p>和中心點(diǎn)旋轉(zhuǎn)<pr>,該值相當(dāng)于transform節(jié)點(diǎn)里的Pivot?Translate和Pivot Rotate。Pivot?Translate和Pivot Rotate指定了對象的中心點(diǎn)和相對坐標(biāo),使得對象不再以世界坐標(biāo)進(jìn)行變換。如下示例標(biāo)明了各項(xiàng)的含義:
> 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血書:本章涉及大量高等代數(shù)內(nèi)容,關(guān)于矩陣、四元數(shù)、歐拉旋轉(zhuǎn)等概念,up主專門拜訪了B站上各路大神的講解視頻,包括清華大學(xué)的課堂教學(xué)視頻,老師講解生動有趣,深感受益匪淺,然智力有限,只得皮毛,實(shí)難領(lǐng)會其中深意,望各位讀者諒解。up主會再接再厲,逐步將其消化并將收獲分享給大家,一起享受知識得樂趣。