变换矩阵及其应用
1.3D坐标系统
OpenGL中的坐标大体是右手坐标系。(Direct3D中大体是左手坐标)。
2.空间点表示方法
OpenGL更多使用齐次坐标(x,y,z,w),齐次坐标使图形学计算更高效。GLSL中【vec4】和【vec3】类型可以分别用来存储三元和四元向量(点)。
3.向量
向量表示大小和方向。移动向量并不改变它的意义。一般用空间中某个单点表示向量,它到原点的距离就是它的大小,方向则是它到远点的方向。也可以用两点差表示,同理原点表示。存储方法同点。
向量操作有:
加减法:略;GLSL方法:vect3 +vec3
归一化(长度变为1):a = A/|A| = A/sqrt(U² +V² + W²),其中|A|为向量长度.GLSL方法:normalize(vec3)或normalize(vec4)
点积:A • B = ux + vy + wz。GLSL方法:dot(vec3,vec3)或dot(vec4,vec4),点积用来求解两向量夹角:A • B =|A||B|cos(θ),应用此公式也可求两向量是否平行或垂直。
叉积:A X B = (vz - wy,wx - uz, uy - vx)。GLSL方法:cross(vec3,vec3),叉积会生成一个新的向量,它垂直于之前的两个向量。应用此特性可以求两向量定义的平面的法向量(遵循右手定则)。
4.矩阵
在3D图形计算中用到的矩阵大多数是4x4的矩阵。GLSL中【mat4】数据类型用来存储4x4矩阵。GLSL默认支持矩阵运算。
(1).单位矩阵
一条对角线上值为1,其余值为0;任何值乘以单位矩阵都不会改变。
(2).矩阵转置
交换矩阵的行和列来置换矩阵。GLSL库置换函数为:【transpose(mat4)】.
(3).矩阵乘法
矩阵乘法左乘和右乘是不同的,所以矩阵乘法不满足交换律。点与矩阵相乘通常从右到左,得到点。即点在右边,变换矩阵在左边,结果为点。矩阵乘法满足结合律,即 矩阵ax矩阵bx点q = (矩阵ax矩阵b)x点q
5.变换矩阵
图形学中,矩阵通常用来进行物体变换,变换物体的位置、形状、大小等。
(1).平移矩阵
平移矩阵用于移动物体的位置。平移矩阵包含一个单位矩阵;同时x、y、z轴的移动量在A03、A13、A23。用它右乘一个点,即可“移动“这个点。GLSL方法:【mat4 x vec4】。
(2).缩放矩阵
缩放矩阵用于改变物体的大小,或者将点向原点相反方向移动。缩放矩阵由单位矩阵和位于A00、A11、A22的X、Y、Z轴缩放因子组成。用它右乘一个点,即可将该点向原点相反方向移动(如果是一个物体的点击,即缩放了该物体)。GLSL方法:【mat4 x vec4】。
缩放还可以用来切换坐标系,即反转Z坐标。矩阵为单位矩阵中A22值设为-1。
(3).旋转矩阵
绕X轴旋转θ度:由单位矩阵并且A11 = consθ,A12 = = -sinθ,A21 = sinθ,A22 = consθ组成。GLSL方法:【mat4 x vec4】。
绕Y轴旋转θ度:由单位矩阵并且A00 = consθ,A02 = = sinθ,A20 = -sinθ,A22 = consθ组成。GLSL方法:【mat4 x vec4】。
绕Z轴旋转θ度:由单位矩阵并且A00 = consθ,A01 = = -sinθ,A10 = sinθ,A11 = consθ组成。GLSL方法:【mat4 x vec4】。
反向旋转的矩阵等于其转置矩阵。欧拉角旋转法在某些3D图形应用中会导致一些瑕疵,但是对于大多数需求,它足够了;在实践中,当旋转轴不穿过原点时,需要进行如下几个步骤进行旋转:
#1 平移旋转轴使它经过原点
#2 绕X、Y、Z轴旋转
#3 复原#1中的平移
人皆寻梦,梦里不分西东;寻乐不堪困苦,未识苦与乐同。
未完待续~