Rotational Matrix | 旋轉(zhuǎn)矩陣
不管是旋轉(zhuǎn)矩陣還是移動(dòng)矩陣碗誉,首先Matrix本質(zhì)上只是一個(gè)矩陣數(shù)組,不管是3x3或者4x4父晶,他們本身只是一個(gè)矩陣字符串哮缺,如何使用這這個(gè)字符串才決定了這些矩陣的性質(zhì)。
比如我們想借助旋轉(zhuǎn)矩陣來(lái)旋轉(zhuǎn)當(dāng)前點(diǎn)
注:空白矩陣不是0甲喝,而是不會(huì)改變?cè)瓕傩猿⑽捎迷趧?chuàng)建矩陣上。
<matrix> ident()
Returns the identity matrix for the given matrix type.
// for example
matrix3 m3 = ident();
此時(shí)獲得的m3矩陣為
| 1, 0, 0 |
| 0, 1, 0 |
| 0, 0, 1 |
Matrix3舉個(gè)栗子
假設(shè)要用matrix對(duì)box進(jìn)行旋轉(zhuǎn)埠胖,
//定義一個(gè)3*3矩陣
matrix3 rot = ident();
//將旋轉(zhuǎn)參數(shù)分別給到代表 x,y,z的三個(gè)行列式
rotate(rot, radians(chf("rotx_amount")), {1,0,0});
rotate(rot, radians(chf("roty_amount")), {0,1,0});
rotate(rot, radians(chf("rotz_amount")), {0,0,1});
@P *= rot;
其中radians()可以將值轉(zhuǎn)化為弧度糠溜。
矩陣賦值可簡(jiǎn)寫(xiě)為
rotate(rot, radians(chf("rot_amount")), {1,1,1});
此時(shí)獲得了一個(gè)box的轉(zhuǎn)動(dòng),假如我們想讓box進(jìn)行陣列轉(zhuǎn)動(dòng)直撤,有兩個(gè)思路
1诵冒,對(duì)單體進(jìn)行轉(zhuǎn)動(dòng),然后copy到陣列里獲得群體轉(zhuǎn)動(dòng)谊惭。這樣很直接,但是缺點(diǎn)也很明顯侮东,所有點(diǎn)陣?yán)锏腷ox旋轉(zhuǎn)都是一致的圈盔。
2,對(duì)copy的點(diǎn)陣上的每個(gè)點(diǎn)進(jìn)行矩陣修改悄雅,這樣每個(gè)點(diǎn)可以擁有獨(dú)立的或者隨機(jī)的旋轉(zhuǎn)方式驱敲,cool!
但是,由于之前的matrix3只包含了rotation信息宽闲,通過(guò)查看primintrisics發(fā)現(xiàn)所有點(diǎn)的pivot都在幾何體中心众眨,如果想要針對(duì)每個(gè)點(diǎn)旋轉(zhuǎn),需要更改pivot屬性容诬,或者...直接用Matrix4娩梨!
Matrix4的栗子
Matrix4的基本形式是
| 1, 0, 0, 0 |
| 0, 1, 0, 0 |
| 0, 0, 1, 0 |
| 0, 0, 0, 1 |
最后一行是代表位移信息,而最后一列是作為計(jì)算補(bǔ)位用览徒。
前三行分別代表了x,y,z的方向和大小狈定,ie. 第一行{1,0,0,0},如果改為{2,0,0,0}习蓬,則矩陣在x方向上放大兩個(gè)單位纽什。
另外,此時(shí)x,y,z三個(gè)方向沒(méi)有必要正交躲叼。
例如用如下矩陣和豬頭運(yùn)算芦缰,
| 2, 0, 0, 0 |
| 1, 1, 0, 0 |
| 0, 0, 1, 0 |
| 0, 0, 0, 1 |
定義matrix4的方法有很多,比較常用的是
matrix m = ch4("matrix_M");
//或者
matrix m = ident();
當(dāng)然可以使用最原始的
matrix m = set( 1,0,0,0,
0,1,0,0,
0,0,1,0
0,0,0,1
)
p@orient也可以做為點(diǎn)的matrix調(diào)用方式涕俗,參照https://www.sidefx.com/forum/topic/60235/
假設(shè)此時(shí)我們有一個(gè)球體多邊形罗丰,需要把box復(fù)制到每個(gè)點(diǎn)上。
通過(guò)copy to point完成再姑。
在wrangle中修改Y軸轉(zhuǎn)向,借助ptnum作為隨機(jī)seed元镀,
同時(shí)借助ptnum作為pscale的seed來(lái)隨機(jī)化大小绍填。
p@orient = quaternion(chf("rotate_Y")*fit01(rand(@ptnum),1.0,5.0), {0,1,0,0});
@pscale = fit01(rand(@ptnum),0.2,1.5);
這樣獲得了大小不同且轉(zhuǎn)速不同的復(fù)制幾何體。