音视频从入门到放弃

OpenGL--- (七)OpenGL基础变化与矩阵堆栈

2020-08-19  本文已影响0人  阿木小丸子

基础变化

视图变换
模型变换

当缩放的X/Y/Z参数传值-1时,可以实现物体围绕某一个轴翻转
物体翻转的实现不仅可以通过旋转实现,还可以通过缩放实现

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

造成这种情况的根本原因:矩形相乘采用的是矩形的叉乘,而矩形叉乘是不满足交换率的。
另外,在模型变换过程中,有两种观察方式:

投影

透视投影:

屏幕上物体与实物的比例是 < 1:1的,且有远小近大的效果。

OpenGL中对应的设置API:void SetPerspective(float fFov, float fAspect, float fNear, float fFar)

正投影:

屏幕上物体与实物比例是 = 1:1的,都是一样大的效果。

OpenGL中对应的设置API:void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)

矩形堆栈

使用原因:

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

矩阵堆栈

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

矩阵对阵中除了可以放M3DMatrix44f矩阵外,还可以放GLFRame,其实就是比矩阵多做了一步,需要通过GLFRame的get方法方法获得矩阵,放入堆栈中

矩阵堆栈相关API如下图所示:


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

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

仿射变换
矩形堆栈中有平移、旋转、缩放三个模型变换相对应的仿射变换,可以不用通过模型变换,而是直接通过矩形堆栈的API实现这3种变换,如下:
角色帧
上一篇 下一篇

猜你喜欢

热点阅读