(3)将数据传给顶点着色器以及片段着色器来画图
齐次坐标(x,y,z,w),它是为了兼容点的平移操作,使得我们可以用同一个公式对点和方向作运算。
(x,y,z,w)同时除于w得到坐标(x/w,y/w,x/w)
齐次坐标主要是兼容点的平移操作,在空间中平移方向是没有意义的:
把点(x,y)旋转到点(x',y')
也就是矩阵乘法的顺序问题,设旋转矩阵为R,平移矩阵为T
在xy坐标系中,有一点P(x0,y0),表示的是:点P(x0,y0)相对于xy坐标系原点的值为x0和y0。
转换到x'y'坐标系之后,变为P(x0',y0'),表示的是:点P(x0',y0')相对于x'y'坐标系原点的值为x0'和y0'
它们之间的相对位置时不变的,只是换了一种表示方法。
就比如:小明说,杯子在我的右边;小东说,杯子在我的左边;是一样的道理。这里就是把(杯子在我右边)转换为(杯子在我左边)
(1)为了将对象描述从xy坐标变换到x'y'坐标,必须建立把x'y'轴叠加到xy轴的变换,这需要分两步进行:
所以,就是先平移后旋转:M=R*T
举例:设x'轴与x轴之间的夹角为45度,x'y'系统的坐标原点为(2,2),将点P(1,1)变换到x'y'系统上,由几何关系可以得到变换后P点坐标的值为(-√2,0)
(2)任何旋转矩阵的元素可以表示为一组正交单位向量的元素
旋转矩阵的逆矩阵可以通过矩阵转置,或者将旋转角取负值来获得
(1)轴角:绕一个给定轴K(x,y,z)(向量)旋转给定角度。也就是原定坐标轴{A}绕给定向量K(x,y,z)旋转给定角度后,得到坐标系{B}
注意:向量K(x,y,z)为单位向量
它的旋转矩阵为:
推导过程(TODO)
涉及到:欧拉角,四元数,旋转矩阵,轴角之间的关系
由上图可以知道:
将物体坐标变换为世界坐标:
将世界坐标变换为眼睛坐标
将眼睛坐标变换为裁剪坐标
将一个上下坐标为t(top)和b(bottom),前后坐标为n(near)和f(far),左右坐标为l(left)和r(right)的正方体:
(x,y,z,1)和(kx,ky,kz,k!=0z)和(xz,yz,z^2,z!=0)在三维空间中,这些都代表的是同一个点(x,y,z)
例如:(1,0,0,1)和(2,0,0,2)都代表着点(1,0,0)
将左边的梯形体压缩成右边的长方体
注意:n和f是不变的,所以,可以得出:
(1)对于任何在n平面上的点,其坐标的z分量不变
(2)对于任何在f平面上的点,其坐标的z分量不变
从下图可以看出,(x,y,z)坐标和(x',y',z')坐标之间存在相似三角形关系
投影矩阵就是先做透视投影,把梯形体压缩成一个长方体;然后做正交投影,把这个正方体,放到原点,并压缩成边长为2(-1,1)的正方体
OpenGL的为啥为负的?(TODO)
给出可视角度fovY,nearZ和长宽比aspect(16:9,或者4:3等等),就可以求出长方体的上下左右前后的坐标了
t(top),b(bottom)=-t,r(right),l(left)=-r,n(nearZ),f(farZ)