当前课程知识点:移动图形概论 > 第三章 OpenGL ES 变换 > 3.3 OpenGL ES 变换基础 > OpenGL ES 变换基础
同学们 大家好
今天给大家介绍的是在OpenGL ES里面
进行各种矩阵变换的方法
今天的主要内容介绍OpenGL ES里面模型矩阵
视图矩阵和投射矩阵
介绍它们的基本定义和使用方法
首先在计算机图形中
我们经常需要变换场景中的对象
然后从特定的视角对对象进行渲染
第一步需要将对象变换为场景
我们称这种变换叫做模型变换或者世界变换
因为在计算机中
一个场景就是它所描绘的整个世界
其次需要放置一个摄像头
并定义其方向以便能够观察场景
将世界的原点放置在摄像头的位置
转换为这种坐标表示方法我们称之为视图变换
最后需要定义摄像头观察场景的方式
将摄像头看到的内容转换为OpenGL的NDC坐标
我们称之为投射变换
模型变换 视图变换和投射变换
分别都可以用一个矩阵来表示
用来存储相应的变换信息
这三个矩阵的乘积定义为模型视图投射矩阵
也就是MVP矩阵
这个矩阵将会组合模型
摄像头和投射的局部变换
将对象变换为最终显示的场景
这里通过一个赛车游戏的例子解释相关矩阵的含义
模型矩阵是基于对象的
随着对象在世界中的移动而变化
例如汽车模型在赛车比赛过程中
其位置和方向不断的变化
其模型矩阵也将根据这些变化而进行更新
而随游戏中摄像头位置的变化将导致视角的变化
这就对应着视图矩阵的变化
而投射矩阵通常是一个常数
在整个游戏中保持不变
这个框图展示了模型
视图和投射矩阵对对象的操作过程
首先一个对象是定义在原点为中心的一个模型
经过模型矩阵
把它置于世界坐标系中
在这个坐标系里还有其它的模型还有摄像机
摄像机根据它的相对位置通过视图变换
把世界坐标系中所有的模型
都转变到以摄像机为原点的坐标系中
接着通过投射矩阵
将最终摄像机看到的结果呈现在屏幕上
经过投射矩阵的变换
物体会显示出近大远小的效果
在编程的过程中通常我们都用数学程序库文件
来执行矩阵操作
在本课程里
我们使用的库的名字叫做glm
glm就是OpenGL Mathematics
顾名思义 用到数学的地方少不了它
下面我们看几个简单的例子
glm可以定义向量
vec3是三维向量
它还可以定义矩阵
mat4代表四阶矩阵
radians函数用来把角度转为弧度
角度比较直观
而弧度是在三角公式中要使用的输入变量
translate()函数可以根据一个向量生成平移变换矩阵
rotate函数可以生成旋转变换矩阵
例如上面的示例
第一个参数是旋转的角度
也就是90度
第二个参数代表旋转轴
0,1,0 也就是y轴
生成的trans矩阵可以把模型以y轴为旋转轴旋转90度
接下来我们来具体看一下
OpenGl变换的具体过程
在定义对象的时候
通常会围绕原点定义一个对象
这个原点一般也就是这个对象的几何中心
这样当对这个对象进行缩放 旋转的时候
可以认为位置是没有改变的
这就允许再将对象平移到场景之前
先对它进行任意的局部变换
而将对象放置到场景时
往往需要进行平移和局部变换
因此
模型矩阵的计算公式为平移矩阵乘以局部变换矩阵
虽然在表达式上平移矩阵在式子的前面
但实际发生作用的时候是先执行局部变换
这个乘积的顺序也被称为SRT
也就是缩放旋转和平移
通常表示先缩放
然后旋转最后再平移
视图矩阵用来存储与摄像头有关的信息
它定义了摄像头的位置和指示的方向
这里要进行一次坐标系的变换
把场景用相对于摄像头的位置和方向来进行表示
在前面赛车游戏的例子中
摄像头的位置和方向通常定义为
玩家在游戏或虚拟环境中的位置和方向
摄像头也就是游戏玩家的眼睛
与场景中各个对象的模型矩阵类似
必须按照相应的变换顺序来生成视图矩阵
因此视图矩阵的计算公式为
视图旋转乘以视图平移
视图矩阵将执行场景平移
以便将摄像头的位置变换到原点
然后旋转场景从而将摄像头的拍摄方向旋转至负z轴
回顾OpenGL坐标系的定义
摄像头的视角和用户使用电脑的视角类似
都指向屏幕的里面
创建视图矩阵可以用glm库中的LookAt函数
该函数可以根据摄像头的位置
以及其所视方向来生成视图矩阵
例如这里的示例
LookAt的第一个参数是摄像头在场景中的坐标
第二个参数是摄像头朝向的方向
也就是场景的原点
第三个参数是摄像头的上方指向
这里定义为y轴
投射矩阵将存储与3D视锥有关的信息
3D视锥用于定义通过摄像头观察场景的方式
这样可以非常方便的以不同视场来观察场景
所谓3D视锥定义为在视场的范围内
指定了近裁剪平面和远裁剪平面
垂直视场和水平视场
这样的一个场景范围
也就是图中所展示的这个有两个矩形截面的锥体范围
投射矩阵是将这个视锥变换为边长为2的立方体
也就是将视锥内的坐标都变换为
之前提到过的OpenGL的设备归一化坐标
定义投射矩阵可以使用PowerVR框架中
称为perspective的函数
它一共包含六个参数
第一个参数api指定了所使用的OpenGL ES版本号
例如这里边可以指定使用3.1版本
或者2.0版本
第二个参数fovy
定义了视锥的视角
它是一个角度值
代表了y方向上
可以看到的范围
也就是垂直方向上的视角
再加上下一个参数 纵横比
就可以将整个可视范围确定了
纵横比就是显示窗口的宽和高的一个比例
而接下来的nearl和farl两个参数
指定了摄像头到近裁剪平面的距离
和到远裁剪平面的距离
最后一个参数rotate 指定了摄像头的倾斜角度
是以z为参考旋转轴的一个弧度值参数
这里是一个perspective函数的调用例子
我们可以看一下它每个参数的设置情况
它将api设为3.1版本
将视角设为45度
纵横比根据窗口的宽和高来进行设置
近经裁剪平面设置为距离摄像头0.1个单位
而远裁剪平面为距离摄像头100个单位
摄像头的旋转角度设置为0
今天的内容就到这里
谢谢大家
-1.1 课程基本情况介绍
--课程基本情况介绍
-1.2 GPU 相关基础知识
-1.3 OpenGL ES 技术发展历史
-1.4 PowerVR SDK 安装和使用
-第一章测试
-2.1 OpenGL ES 基本概念
-2.2 编写第一个图形程序
-2.3 主要 API 介绍
-第二章测试
-3.1 矢量和矩阵知识基础
-3.2 旋转与位移变换
--旋转与位移变换
-3.3 OpenGL ES 变换基础
-第三章测试
-4.1 着色器编程语言介绍
-4.2 着色器编程实例
--着色器编程实例
-第四章测试
-5.1 颜色的基本概念
--颜色的基本概念
-5.2 纹理素材的使用
--纹理素材的使用
-5.3 立方体纹理
--立方体纹理
-第五章测试
-6.1 光照的基本概念
--光照的基本概念
-6.2 光源模型
--光源模型
-6.3 使用着色器渲染颜色
-6.4 反射与折射
--反射与折射
-第六章测试
-7.1 基于物理渲染的基本概念
-7.2 基于图像的照明
--基于图像的照明
-7.3 PBR 的实现
--PBR 的实现
-第七章测试
-8.1 Vulkan 介绍
-8.2 SDK 中的实用工具介绍
-综合测试