变换矩阵及其应用

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、A22X、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中的平移

 

人皆寻梦,梦里不分西东;寻乐不堪困苦,未识苦与乐同。

未完待续~

 

posted @ 2021-08-09 00:11  吉尔加斯  阅读(530)  评论(0编辑  收藏  举报