坐标和相机系统
参照LearnOpenGL中的坐标系统,摄像机系统,以及后续在代码中经常include的Camera.h
现代opengl要求自己去定义管线,也就是自己写shader,这要求去理解gl工作的流程,大概就是如何从各个点集,到实际空间的坐标,到观察时的坐标(相对坐标并加上视角),然后做出透视效果然后剪裁到屏幕,然后填充颜色。跟着教程走,这里的操作被简化成了两个shader,v和f。
v管前面的一大串,透视和剪裁交给opengl自动完成,f管颜色填充。坐标和相机系统主要管v shader。v基本上就是对点集做各种矩阵运算(大都是些仿射变换),然后输出和原来维度大小相同的点集,可能还要简单地传些参。
简单粗暴地说,v负责:
- st1:把模型通过平移、旋转、缩放等操作(一一对应乘矩阵乘法)先把模型(三角形、正方形等)放到想要放的位置 (世界空间)
- st2:人(观察者)在世界空间也有个位置,屏幕展现的是观察者看到的世界(观察空间),具体模拟方式也是矩阵运算,封装好lookat矩阵,直接传入观察者各个坐标就能直接得到。
各种变换矩阵都是glm直接定义好的,在c++里算出来,直接拿来在glsl用然后暴力乘就完了。
大概的v的代码就像这样
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{
gl_Position = projection * view * model * vec4(aPos, 1.0f);
}
gl_position就是v处理好的参数,model就是把模型放到世界空间的矩阵。也就是st1要做的,首先在c++用各种封装好的矩阵乘一通,然后通过uniform传参就是了。
view封装观察者的变换,也就是摄像机。这里涉及到一个lookat矩阵,实际用的时候只需要传参就好了,三个参数
- 摄像机坐标,很简单,就是摄像机的世界坐标。
- 目标向量,看的方向,类似锥形尖指向的方向。
- 上向量,一个表示世界空间的上向量。因为view本质上是计算一个相对坐标,前面已经设定了相对坐标的原点和一个轴地方向,还需要另一个轴才能确定右手系。这边可以参考fps相机的实现。其实也就是人的脚到头的向量方向。
一个fps风格的摄像机实现只需要修改上面的三个参数就可以了:
- 人物走:修改摄像机坐标;
- 正常地上下、左右点头摇头:修改目标方向;
- 诡异地把头绕视线轴进行旋转:修改上向量。

lookat矩阵定义如下:

相对于一个平移加旋转
后面LearnOpenGL对fps相机进行了封装,成了Camera.h。
能前后左右走,能俯仰摇头,并对俯仰角(pitch)做了限制。

浙公网安备 33010602011771号