glm提供的lookAt方法
1 | glm::mat4 viewMatrix = glm::lookAt(cameraPosition, targetPosition, upDirection); |
欧拉角:是可以表示3D空间中任何旋转的3个值
可以这样理解,一个飞机目标沿着z轴正方向的航线飞行,遵循右手定则
摄像机系统只关心俯仰角和偏航角,满足
假设摄像机的圆形轨迹是位于X-Z平面的,因此要先定义距离世界坐标中心的半径radius,然后利用三角函数算出X坐标和Z坐标,最后传递给lookAt矩阵即可
1 | float radius = 10.0f; |
假设保持方向向量不变和移动速度不变
1 | void processInput(GLFWwindow *window) { |
鼠标水平移动影响偏航角,鼠标竖直移动影响俯仰角,可以通过存储上一帧鼠标的位置并获取当前帧鼠标的位置来计算
1 | // 应该隐藏光标并捕捉 |
缩放是通过投影矩阵的fov参数实现的
1 | // 注册回调函数 |
正射(Orthographic):所有的投影线都是平行的,意味着在投影过程中物体的大小和形状不会发生变化
正射投影:定义了一个方体,由宽、高、近平面和远平面所指定,在方体内,所有的物体都被投影到一个二维平面上,在方体外,所有的物体都被裁剪掉
1 | mat4 orthoMatrix = ortho(left, right, bottom, top, near, far); |
透视(Perspective):物体的大小和形状在投影过程中会发生变化,越靠近观察者的物体越大,越远离观察者的物体越小,依据透视除法有最后输出的顶点坐标为(x/w,y/w,z/w)
透视投影:定义了一个锥体,由视野(Fov)、宽高比、近平面和远平面所指定,在锥体内,所有的物体都被投影到一个二维平面上,在锥体外,所有的物体都被裁剪掉
深度缓冲(Depth Buffer)/z缓冲(Z-buffer):存储所有片段的深度信息/z值
深度测试:在渲染每个片段时,比较当前片段的深度值和深度缓冲中的值,如果当前的片段在其它片段之后,它将会被丢弃,否则将会覆盖
1 | // 启动深度测试 |