OpenGL基础变换

OpenGL ⾥的基础变换

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

变换 解释
视图变换 指定观察者位置
模型变换 在场景中移动物体
模型视图变换 描述视图/模型变换的⼆元性(2种看到模型转换的⽅式 )
投影变换 改变视景体⼤⼩和设置它的投影⽅式
视⼝变换 伪变化,对窗⼝上最终输出进⾏缩放

视图变换

  • 视图变换是应⽤到场景中的第⼀种变换, 它⽤来确定场景中的有利位置。默认情况下,透视投影中位于原点(0,0,0),并沿着 z 轴负⽅向进⾏观察 (向显示器内部看过去)。
  • 视图变换将观察者放在希望的任何位置,并允许在任何⽅向上观察场景。确定视图变换就像在场景中放置观察者并让它指向某⼀个⽅向。
  • 从⼤局上考虑,在应⽤任何其他模型变换之前,必须先应⽤视图变换。-->截⾃ 第96⻚。
  • 上述做法是因为对于视觉坐标系⽽⾔,视图变换移动了当前的⼯作的坐标系,后续的变化都会基于新调整的坐标系进⾏。

模型变换

  • 模型变换就是通过旋转、缩放和平移等手段操纵模型本身并将对象移动到特定位置的过程。
  • 注意:模型变换的过程是有严格顺序的,我们通常使用矩阵叉乘来计算模型变换结果,由于矩阵的乘法不满足交换律这一定理,交换变换顺序最终会导致结果的南辕北辙。
  • 模型变换的两种观测方式:观察者动物体不动和观察者不动物体动。

常见模型变换方式

模型变换-平移
void m3dTranslationMatrix44(M3DMatrix44f m, floata x, float y, float z);
模型变换-旋转
m3dRotationMatrix44(m3dDegToRad(45.0), floata x, float y, float z);
模型变换-缩放
void m3dScaleMatrix44(M3DMatrix44f m, floata xScale, float yScale, float zScale);
模型变换-综合变换
void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, const M3DMatrix44f b);

投影变换

  • 透视投影:屏幕上显示的物体与实物间的关系符合远小近大原则,接近现实生活中的视觉效果。设置API:
void SetPerspective(float fFov, float fAspect, float fNear, float fFar)
  • 正投影:屏幕上显示的物体与实物比例 1:1,大小一样的视觉效果效果。设置API:
void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)

矩阵堆栈的使用

OpenGL中使用GLMatrixStack来表示一个矩阵,矩阵最大长度为64,矩阵严格遵循先进后出原则。

类型
GLMatrixStack::GLMatrixStack(int iStackDepth = 64);
在堆栈顶部载⼊⼀个单元矩阵
void GLMatrixStack::LoadIdentity(void);
在堆栈顶部载⼊任何矩阵
void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);
矩阵乘以矩阵堆栈顶部矩阵,相乘结果存储到堆栈的顶部
void GLMatrixStack::MultMatrix(const M3DMatrix44f);
获取矩阵堆栈顶部的值
const M3DMatrix44f & GLMatrixStack::GetMatrix(void);
获取矩阵堆栈顶部矩阵的副本
void GLMatrixStack::GetMatrix(M3DMatrix44f mMatrix);
将当前矩阵压⼊堆栈(栈顶矩阵copy⼀份到栈顶)
void GLMatrixStack::PushMatrix(void);
将M3DMatrix44f 矩阵对象压⼊当前矩阵堆栈
void PushMatrix(const M3DMatrix44f mMatrix);
将GLFame 对象压⼊矩阵对象
void PushMatrix(GLFame &frame);
出栈(出栈指的是移除顶部的矩阵对象)
void GLMatrixStack::PopMatrix(void);

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

入栈、相乘、出栈流程
  • 原始矩阵堆栈中,拷贝一份栈顶矩阵,压入栈顶
  • 当有变换操作时,将变换操作的矩阵与矩阵堆栈栈顶相乘,将其结果覆盖栈顶矩阵
  • 如果还有其他矩阵入栈,则继续相乘
  • 当没有矩阵需要push,即图形绘制完成后,需要pop栈顶矩阵
  • push与pop需要一一对相应,用了几个push,就需要几个pop,最终的矩阵仍然是最初时的矩阵

你可能感兴趣的:(OpenGL基础变换)