知识重点:
1,什么是摄像机?
2,摄像机/观察空间 是在坐标系哪一步?
3,什么是lookAt?
一种特殊类型的观察矩阵,它创建了一个坐标系,其中所有坐标都根据从一个位置正在观察目标的用户旋转或者平移。
4,使用第三方库实现一个 lookAt矩阵?手动自己实现一个lookAt?
5,应用:
a)绕观察目标位置坐圆周运动
b)观察目标位置,跟随摄像机一起移动
c)观察目标位置不变,可上下左右前后观看
摄像机 即观察空间,物理坐标通过模型矩阵转换后获得的世界空间坐标在经过观察矩阵 则到了观察空间坐标系中。
一、观察矩阵
世界空间坐标:Z轴正方面是从屏幕外执行我们,X轴正方形在右边,Y轴正方形指向上方。右手坐标系。
a)摄像机的位置,就是世界空间坐标系中的一个向量。
b)摄像机方向:指向的是Z的正轴方向,与摄像机实际看到的方向方向。摄像机看到的方向是Z轴的负方向。
c)摄像机的右方向:指的是以摄像机为原点,朝向Z轴负方向。右边的方向,也是X轴的正方向。
d)摄像机的上方向:指的是以摄像机为原点,一个垂直于XZ平面的向量,也是X轴的正方向。
//摄像机方向,也就是世界空间坐标系中的一个向量
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
//获得摄像机的Z轴方向 =》 指向世界坐标系的Z轴正方向,与摄像机实际指向的方向相反
glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);
glm::vec3 cameraDirection = glm::normalize(cameraPos - cameraTarget);
//获得摄像机的X轴方向 =》 叉乘 上向量与Z轴向量的叉乘,获得垂直于这两个向量平面的向量
glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f);
glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
//获得摄像机的Y轴方向 =》叉乘 获得垂直于两个向量平面的向量
glm::vec3 cameraUp = glm::cross(cameraDirection, cameraRight);
二、通过第三方库 GLM 获取 观察矩阵 Look At
其中R是右向量,U是上向量,D是方向向量PP是摄像机位置向量。