Rotational Matrix | 旋转矩阵
不管是旋转矩阵还是移动矩阵,首先Matrix本质上只是一个矩阵数组,不管是3x3或者4x4,他们本身只是一个矩阵字符串,如何使用这这个字符串才决定了这些矩阵的性质。
比如我们想借助旋转矩阵来旋转当前点
注:空白矩阵不是0,而是不会改变原属性,可用在创建矩阵上。
<matrix> ident()
Returns the identity matrix for the given matrix type.
// for example
matrix3 m3 = ident();
此时获得的m3矩阵为
| 1, 0, 0 |
| 0, 1, 0 |
| 0, 0, 1 |
Matrix3举个栗子
假设要用matrix对box进行旋转,
//定义一个3*3矩阵
matrix3 rot = ident();
//将旋转参数分别给到代表 x,y,z的三个行列式
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()可以将值转化为弧度。
矩阵赋值可简写为
rotate(rot, radians(chf("rot_amount")), {1,1,1});
此时获得了一个box的转动,假如我们想让box进行阵列转动,有两个思路
1,对单体进行转动,然后copy到阵列里获得群体转动。这样很直接,但是缺点也很明显,所有点阵里的box旋转都是一致的。
2,对copy的点阵上的每个点进行矩阵修改,这样每个点可以拥有独立的或者随机的旋转方式,cool!
但是,由于之前的matrix3只包含了rotation信息,通过查看primintrisics发现所有点的pivot都在几何体中心,如果想要针对每个点旋转,需要更改pivot属性,或者...直接用Matrix4!
Matrix4的栗子
Matrix4的基本形式是
| 1, 0, 0, 0 |
| 0, 1, 0, 0 |
| 0, 0, 1, 0 |
| 0, 0, 0, 1 |
最后一行是代表位移信息,而最后一列是作为计算补位用。
前三行分别代表了x,y,z的方向和大小,ie. 第一行{1,0,0,0},如果改为{2,0,0,0},则矩阵在x方向上放大两个单位。
另外,此时x,y,z三个方向没有必要正交。
例如用如下矩阵和猪头运算,
| 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();
当然可以使用最原始的
matrix m = set( 1,0,0,0,
0,1,0,0,
0,0,1,0
0,0,0,1
)
p@orient也可以做为点的matrix调用方式,参照https://www.sidefx.com/forum/topic/60235/
假设此时我们有一个球体多边形,需要把box复制到每个点上。
通过copy to point完成。
在wrangle中修改Y轴转向,借助ptnum作为随机seed,
同时借助ptnum作为pscale的seed来随机化大小。
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);
这样获得了大小不同且转速不同的复制几何体。