1.什么是view坐标系
view坐标系就是相机视角下的坐标系。
世界坐标系下的相机👆
在view坐标系里,相机位置即原点位置。view坐标系下所有物体的坐标都是相对于相机位置的坐标。并且相机的朝向始终是view坐标系的-z方向(针对openGL的右手坐标系而言,Direct3D 为左手坐标系,相机的朝向与z轴一致),即与上图中蓝色箭头相反的方向。
2.视图变换
实质:乘一个变换矩阵,让世界坐标系下的所有顶点的坐标变换到view坐标系下的坐标
2.1 视图变换矩阵的推导
首先需定义:
- 相机的在世界坐标系下的位置坐标向量,假设其为P
- 相机的朝向(观察的方向)假设它为向量G,相当于相机坐标系的z轴负方向,假设向量D=-G指向z轴正方向
- 一个右向量R,代表view坐标系下的x轴的正方向
- 一个指向view坐标系下正y轴方向的向量U
视图变换先将相机移动至(0,0,0)的位置,对应的齐次坐标系下的位移变换为:
接着开始旋转坐标系:XYZ→RUD
如果你使用3个相互垂直(或非线性)的轴定义了一个坐标空间,你可以用这3个轴的方向向量构成一个如下图所示的矩阵,该矩阵实现了XYZ→RUD的变换:
因此视图变换矩阵的推导公式可以写作:
❗❗矩阵变换的叠加顺序:公式从右往左顺序
实际在OPENGL中使用视图变换矩阵,只需要调用glm::lookat()函数。
使用者只需要定义一个摄像机位置,一个目标位置和一个世界坐标系中的上向量(用于推导右向量R方向),即可获得观察矩阵。
glm::mat4 view;
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), //摄像机位置
glm::vec3(0.0f, 0.0f, 0.0f), //目标位置,假设相机看向原点
glm::vec3(0.0f, 1.0f, 0.0f));//世界坐标系中的上向量