九、OpenGL 基础变化与矩阵堆栈

2020-07-16  本文已影响0人  Style_月月

基础变化

OpenGL中涉及的基础变化主要有以下5种

变换 说明
视图变换 指定观察者位置
模型变换 在场景中移动物体
模型视图 描述视图/模型变换的二元性
投影 改变视景体大小 和 设置它的投影方式
视口 伪变化,对窗口上最终输出进行缩放

视图变换

模型变换
模型变换其实就是物体通过平移、旋转、缩放的操作,将物体移动到你想要的位置的一个过程

模型变换中主要有3中变换方式:

模型变换中,两个变换的顺序是不能交换的,交换后的矩阵相乘结果是不一致的,如下图,交换平移和旋转的顺序,得到的结果完全不一致


变换顺序交换对比

造成这种情况的根本原因,主要还是因为矩阵相乘采用的是矩阵的叉乘,而矩阵叉乘是不满足交换律的。

另外,在模型变换过程中,有两种观察方式,

与3种模型变换相对应的OpenGL方法,如图所示,关于最后的综合变换需要作以下说明:

投影
投影方式主要有两种

矩阵堆栈

矩阵堆栈的使用,我们在之前的案例中都有所涉及,下面详细介绍下矩阵堆栈

使用原因
程序全局只有一个矩阵堆栈,但是需要绘制的图形有多种 即 变化有很多种--每个图形所需的变换矩阵不同,如果想两个图形的操作互不影响,需要一个矩阵状态去保存空白的状态

矩阵堆栈
矩阵堆栈是由GLMatrixStack类创建的,其特性是先进后出,根据矩阵类的源码可知,矩阵堆栈中最大只能放64个状态,对应的API参见下表

矩阵堆栈中关于入栈、相乘、出栈的流程

需要注意:
==> 用了几个push,就需要pop几个矩阵,push与pop是一一对相应的
==> 最终的矩阵堆栈仍然是最初时的矩阵堆栈

矩阵入栈、相乘、出栈流程

仿射变换
矩阵堆栈中有与平移、旋转、缩放三个模型变换相对应的放射变换,可以不用通过模型变换,而是直接通过矩阵堆栈的API实现这3种变换,如下表所示

仿射变换API

相对于仿射变换与模型变换,我们更倾向于使用模型,这种方式用的很少

角色帧
主要是用来表示物体及观察者所处的位置,主要有三个参数

除了矩阵,GLFrame对象也可以直接压入矩阵堆栈,主要涉及以下3个方法

上一篇下一篇

猜你喜欢

热点阅读