大家好
本期视频的链接地址是:
https://www.bilibili.com/video/av26895126/
大家也可以直接在bi站首页搜索:New程序媛 ,即可看到相应视频
链接:https://pan.baidu.com/s/15NvX7npwHCOVGcYuD36LKA 密码:b7mp
视频搭配文章一起效果更赞哦
今天丹丹给大家带来的还是摄像机知识。
上一推中我们搞定了观察矩阵,接下来就要看看投影矩阵。
透视投影矩阵的设置需要四个参数:视角大小、屏幕的宽高比和能看到的最近和最远平面距离。
如上图,由这四个参数就能构成一个视锥体。也就是下图的左边部分。
接着就是由上图的(左)变换到上图(右)的归一化过程了。归一化的窗口,xyz轴的坐标都是由[-1,1]。
上图就是一个三角形的裁剪示意图。
下图显示的是观察坐标中的(xe,ye,ze)投影到近平面上的(xp,yp,zp)的过程,左右图分别是从顶面和侧面看到的示例。
基于相似三角形比例相同,从顶面图我们可以得到:
从侧面图可以得到:
裁剪坐标系下的坐标(左图),归一化时除以裁剪坐标的w分量(右图):
将裁剪坐标的w分量设置为-ze就能得到:
接着通过线性关系将xp和yp映射到NDC中到xn和yn
设[l , r]为[-1 ,1] 同时[b , t ]为[-1,1]
之后我们用上面的方程式来替换xp和yp
由这个等式,我们就可以得到矩阵的第一二行:
接下来看第三行,由于观察坐标系下的ze总是投影到近平面上的-n点,所以我们需要唯一的z值来进行裁剪与深度测试,已知z是独立不依赖于xy坐标的,所以借助w分量我们来找出zn和ze之间的关系。
我们设第三行的数据为:
在观察空间,we等于1,所以可以等到:
为了计算AB,我们使用(ze,zn)关系(-n,-1)和(-f,1)已知近平面-n归一化后为-1,远平面归一化后为1,则代入表达式后:
重写等式:
将上面等式代入等式(2)得到A:
然后将A代入等式(1):
使用求出的A和B代入就能得到:
这样我们就得到最终的投影矩阵啦~~~
http://www.songho.ca/opengl/gl_projectionmatrix.html
而且该链接中有很多相关的知识介绍,如果大家看得懂的话,也不失为好资源哦~
说了这么多,回到使用的正题上,推导对我们来说是有意义的,但只要了解和掌握一次即可,代码中我们使用glm库中的perspectiv函数。
参数分别为:视角大小、屏幕宽高比例、近平面z、远平面z。
下面两图是运行截图。
最后咱们再来看看具体的代码实现~
1.我们将顶点着色器代码进行了修改如下图
矩阵数据由原来的只有模型变换改成了有model、view和projection.
顶点是先乘以model矩阵变换到世界坐标系,然后再乘以view矩阵变换到观察坐标系,最后乘以projection矩阵变换到投影坐标系下的。
源代码中我们也做了对应的变换。
a.首先加上了摄像机位置、朝向和向上方向的向量。
并在InitData函数中进行了初始化
b.接着在Render函数中,我们对着色器的矩阵进行了设置
用到了glm库中的lookAt和perspectiv函数。
c.最后我们把按键响应函数中的位置变换改变成我们的摄像机位置操作变换
这样我们就可以轻松的实现鼠标控制摄像机的移动,看近看远、看左看右啦~
o啦~ 这一期的推送就到这里结束啦~
丹丹期待大家的意见和建议,欢迎小伙伴们积极留言
领取专属 10元无门槛券
私享最新 技术干货