你也许你还没注意到,但是我们现在的应用有一个屏幕比例问题。你可以运行上一章中的应用然后旋转屏幕,在竖屏模式下如图1所示,横屏模式如图2所示:
![](https://i-blog.csdnimg.cn/blog_migrate/ae70b541eead7eea6c3e0f793444e33c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c662a57f0a737545dc64d4cf536d1869.png)
桌面在横屏模式下产生了挤压,原因是我们直接把坐标传递给了OpenGL,而没了考虑屏幕比例。每一个2D和3D应用都有一个共同问题,那就是如何决定在屏幕上显示什么及如何根据屏幕尺寸进行显示,这个问题也有一个常用的解决办法,在OpenGL中我们可以使用投影把现实世界映射到屏幕上,还可以适配不同的屏幕尺寸及方向让屏幕显示出正常的比例。因为现在使用的手机都是使用不同种屏幕尺寸和比例,因此适配这种情况就显得非常重要。
在这一章我们将学习为什么桌面会被挤压以及使用投影映射修正这个问题,下面是这一章的主要内容:
1)首先复习一些线性代数基础、学习如何把矩阵与向量相乘。
2)然后学习如何定义和使用矩阵进行投影映射,这样的话屏幕在进行显示的时候不管是横屏还是竖屏都不会产生形变。
这里会在上一章的基础上进行学习,因此首先把上章工程的代码复制一份,并命名为AirHockeyOrtho。
下面是这一章的内容划分:
5.1 屏幕比例问题(We Have an Aspect Ratio Problem)
5.2 虚拟坐标系(Working with a Virtual Coordinate Space)
5.3 线性代数基础(Linear Algebra 101)
5.4 定义正侧投影(Defining an Orthographic Projection)
5.5 增加正侧投影(Adding an Orthographic Projection)
5.6 小节(A Review)
我们首先学习了一些线性代数的基础并且理解了当用一个矩阵与向量相乘时将会得到什么结果。然后学习了如何定义正交投影矩阵来重新定义坐标空间,同时使用这个矩阵修正了横竖屏切换产生的问题。
5.7 练习(Exercises)
试着调整正交投影矩阵改变桌面的大小(tips:改变传递给orthoM()的参数left、right、top、bottom)
下一章,我们将会进入三维世界。
最后附上源代码工程(点击下载)