OpenGL 模型变化

182 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 属性(下)
  6. Swift 属性
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 压缩纹理
  13. OpenGL 隧道坐标计算
  14. 0penGL 像素格式及数据类型
  15. OpenGL 纹理对象
  16. OpenGL 纹理
  17. OpenGL 模型变化
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测试的潜在风险
  23. OpenGL 浅析深度测试
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完成交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. OpenGL 环境搭建 - MacOS

上两篇我们真理了 矩阵 和 矩阵的变化, 今天我们来看一下 OpenGL 中的 模型变化的内容:

模型变化

模型变换:用于操纵模型与其中某特定变换.这些变换将对象移动到需要的位置 。通过旋 转,缩放,平移。

  • 平移:图中对象沿着给定的轴进行移动
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);

矩阵堆栈使用

矩阵堆栈.001.png

//类型
GLMatrixStack: :GLMatrixStack(int iStackDepth = 64) ;
//在堆栈顶部载入一个单元矩阵
void GLMatrixStack: : LoadIdentity(void);

//在堆栈顶页部载入任何矩阵
//参数:4*4矩阵
void GLMatrixstack:: LoadMatrix (const M3DMatrix44f m);

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

//获取矩阵堆栈顶部的值 GetMatrix 函数
//为了适应GLShaderMananger的使用,或者获取顶部矩阵的副本

cost 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);

仿射变换

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);

使用照相机(摄像机)和 角色帧 进行移动

class GLFrame
{
    protected:
    M3DVector3f vorigin; // Where am I?
    M3DVector3f vForward: // Where am I going?
    M3DVector3f vUp; // which way is up?
}

GLFrame

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

照相机管理

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