6-3.基础变换

2020-10-10  本文已影响0人  Pufus

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

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

1. 视觉坐标变换

下图显示了两个不同视点的视觉坐标系。

2. 视图变换

3. 模型变换

  1. 平移

void m3dTranslationMatrix44(M3DMatrix44f m ,float x,float y,float z)

平移
  1. 旋转

void m3dRotationMatrix44(M3DMatrix44f m ,float angle,float x,float y,float z)

旋转
  1. 缩放

void m3dScaleMatrix44(M3DMatrix44f m ,float xScale,float yScale,float zScale

缩放
  1. 综合变换

void m3dMatrixMultiply44(M3DMatrix44f product,const M3DMatrix44f a,const M3DMatrix44f b)

4. 模型视图变换

5. 投影变换

6. 视口变换

-将得到的一个场景的二维投影,它将被映射到屏幕上某处的窗口上。这种到物理窗口标的映射是我们最后要做的变换,称为视口变换

矩阵堆栈的使用

// GLMatrixStack类 这个类的构造函数允许指定堆栈的最大深度,默认的堆栈深度为64.
// 同时这个矩阵堆栈在初始化时,已经在堆栈中包含了单位矩阵。
GLMatrixStack::GLMatrixStack(int iStackDepth = 64);

// 在堆栈顶部载入一个单元矩阵
void GLMatrixStack::LoadIdentity(void);

// 在堆栈顶部载入任何矩阵
void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);

// 矩阵乘以矩阵堆栈顶部矩阵,相乘结果存储到堆栈的顶部
void GLMatrixStack::MultMatrix(const M3DMatrix44f);

// 获取矩阵堆栈顶部的值 GetMatrix 函数
// 为了适应GLShaderManager的使用,或者是获取顶部矩阵的副本
const M3DMatrix44f & GLMatrixStack::GetMatrix(void);
void GLMatrixStack::GetMatrix(M3Datrix44f mMatrix);

压栈/出栈

入栈、相乘、出栈的流程图.png
  1. 原始矩阵堆栈中,拷贝一份栈顶矩阵,压入栈顶
  2. 当有变换操作时,将变换操作的矩阵与矩阵堆栈栈顶相乘,将其结果覆盖栈顶矩阵
  3. 如果还有其他矩阵入栈,则继续相乘
  4. 当没有矩阵需要push,即图形绘制完成后,需要pop栈顶矩阵

在GLTools库中有一个矩阵堆栈来帮助完成矩阵变换,这个类称为GLMatrixStack

堆栈操作

初始化

这个类的构造函数允许指定堆栈的最大深度,默认的堆栈深度为64。在初始化堆栈时,已经包含了单位矩阵。

GLMatrixStack::GLMatrixStack(int iStackDepth = 64);

栈顶载入矩阵

单位矩阵

void GLMatrixStack::LoadIdentity(void);

任一矩阵

void GLMatrixStack::LoadMatrix(const M3DMatrix44f m);

矩阵栈顶元素与新元素相乘后的结果存储在堆栈顶部

void GLMatrixStack::MultMatrix(const M3DMatrix44f);

获取栈顶元素

获取值

const M3DMatrix44f & GLMatrixStaxk::GetMatrix(void);

获取副本

void GLMatrixStaxk::GetMatrix(M3DMatrix44f mMatrix);

压栈

栈顶矩阵Copy到栈顶

void GLMatrixStack::PushMatrix(void);

将M3DMatrix44f 矩阵对象压入当前矩阵堆栈

void PushMatrix(const M3DMatrix44f mMatrix);

将GLFrame对象压入堆栈

void PushMatrix(GLFrame &frame);

出栈

void GLMatrixStack::PopMatrix(void);

仿射变换

我们都知道,想要从不同的角度观察一个3D物体,我们有两种方式,一种是移动物体,还有一种就是我们自己移动。在OpenGL中移动观察者就是 仿射变换

相关代码:

//Rotate 函数angle参数是传递的度数,⽽而不不是弧度
void MatrixStack::Rotate(GLfloat angle,GLfloat x,GLfloat y,GLfloat z);
void MatrixStack::Translate(GLfloat x,GLfloat y,GLfloat z);
void MatrixStack::Scale(GLfloat x,GLfloat y,GLfloat z);

使用照相机和角色帧进行移动:GLFrame

GLFrame源码
相关api
//将堆栈的顶部压入任何矩阵
void GLMatrixStack::LoadMatrix(GLFrame &frame);
//矩阵乘以矩阵堆栈顶部的矩阵。相乘结果存储在堆栈的顶部 
void GLMatrixStack::MultMatrix(GLFrame &frame);
//将当前的矩阵压栈
void GLMatrixStack::PushMatrix(GLFrame &frame)

获取照相机矩阵

//GLFrame函数,这个函数用来检索条件适合的观察者矩阵
void GetCameraMatrix(M3DMatrix44f m,bool bRotationOnly = flase);
上一篇 下一篇

猜你喜欢

热点阅读