当前课程知识点:移动图形概论 >  第三章 OpenGL ES 变换 >  3.3 OpenGL ES 变换基础 >  OpenGL ES 变换基础

返回《移动图形概论》慕课在线视频课程列表

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 相关基础知识

--GPU 相关基础知识

-1.3 OpenGL ES 技术发展历史

--OpenGL ES 技术发展历史

-1.4 PowerVR SDK 安装和使用

--PowerVR SDK 安装和使用

-第一章测试

第二章 图形编程入门

-2.1 OpenGL ES 基本概念

--OpenGL ES 基本概念

-2.2 编写第一个图形程序

--编写第一个图形程序

-2.3 主要 API 介绍

--主要 API 介绍

-第二章测试

第三章 OpenGL ES 变换

-3.1 矢量和矩阵知识基础

--矢量和矩阵知识基础

-3.2 旋转与位移变换

--旋转与位移变换

-3.3 OpenGL ES 变换基础

--OpenGL ES 变换基础

-第三章测试

第四章 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 的实现

-第七章测试

第八章 PowerVR 工具简介

-8.1 Vulkan 介绍

--Vulkan 介绍

-8.2 SDK 中的实用工具介绍

--SDK 中的实用工具介绍

-综合测试

OpenGL ES 变换基础笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。