【openGL2021版】摄像机
大家好,我是Lampard猿奋~
欢迎来到船新的openGL基础系列的博客,今天主要是学习摄像机的概念
(1)什么是openGL摄像机
(1)openGL摄像机概念
其实我们讨论的是以摄像机的视角作为场景原点时场景中所有的顶点坐标,也就是观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标
(2)如何创建一个摄像机
要想在OpenGL中顺利的使用摄像机,我们需要借助GLU来构建一个LookAt矩阵,其需要接受三个vec3参数,分别是摄像机的位置向量、目标以及上向量
大家可能已经注意到我们实际上创建了一个三个单位轴相互垂直的、以摄像机的位置为原点的坐标系,我们可以用这3个轴外加一个平移向量来创建一个矩阵,并且可以用这个矩阵乘以任何向量来将其变换到那个坐标空间,这就是LookAt矩阵的原理从而实现摄像机的系统。
(3)摄像机的移动
想要实现摄像头的位置或者视点的移动,我们只需要通过gluLookAt在每一帧绘制之前更新我们摄像头的三个向量参数就可以了
(2)创建一个摄像机
(1)Vector3f数据存储类
无论是摄像头的位置向量、目标还是上向量,都是一个含有X,Y,Z方向的向量,所以我们可以直接定义一个数据存储类方便存储
然后再给这个类加一个构造函数就可以了
(2)Camera摄像机类
然后我们需要在每一帧绘制之前通过gluLookAt来设置摄像机,因此我们需要一个摄像机类,上文可知,我们需要三个Vector3f类的成员变量(位置向量、视线和上向量),以及一个update的方法,在update的方法中,我们取调用gluLookAt方法,从而实现摄像机位置的调整
(3)在main中实例化摄像机变量
main中是有一个while循环每一帧去绘制屏幕的,我们只需要先实例化一个摄像头,然后在这个方法里面调用update方法就可以了
(3)摄像机实现前后左右的移动
(1)监听键盘的点击事件
想要实现FPS游戏的那种移动效果,实际上就是对我们openGL的X轴和Z轴进行改变(Y轴是跳跃或者蹲下才会改变),那么我们首先需要对键盘的‘WASD’的点击事件进行监听
window在键盘按下的时候会抛出事件WM_KEYDOWN和WM_KEYUP,我们给camera增加几个成员变量,记录此时摄像头的状态,那么在每一帧绘制之前,更新我们摄像机的位置和视线,就能实现我们的效果
(2)计算位置和实现的移动距离
上文提到我们是在每一帧的时候对摄像头的数据进行更新,那么我们只需要在update函数中计算出移动的距离即可
以左移为例,我们首先设定一个移动的速度moveSpeed,然后根据持续的事件来算出移动的距离,并依此来调整位置和视线
我们的mPos和mViewCenter都是Vector3f类型的,所以它们之间的加减乘除符号需要被重载
(3)实际效果
其他三个方向也是大致的实现方式,最后看看最终效果: