OpenGL ES(四) 变换

基本变换:平移(translation)、旋转(roration)、缩放(scale)、透视(perspective),这4个基本变换可以单独使用,也可以组合使用(两个基本变换可以使用矩阵乘法组合起来)
注意:当使用组合变换时,顺序很重要,例如平移和旋转组合,先平移和先旋转会得到两个完全不不同的结果

所有的基础变换矩阵,都可以通过GLKit/GLKMatrix4.h里的函数构建

  • 平移
    // 返回一个平移矩阵:tx ty tz 分别是在x y z 轴的移动距离,
    GLKMatrix4MakeTranslation(float tx, float ty, float tz)

  • 旋转
    // 返回一个旋转矩阵
    // radians是旋转角度,它接受一个弧度值,可以用GLKMathDegreesToRadians(30),将角度转换为弧度
    // 后面的x y z组成一个向量,顶点将围绕这个向量做旋转(如{1.0,0.0,0.0},将会绕x轴做旋转)
    GLKMatrix4MakeRotation(float radians, float x, float y, float z)

  • 缩放
    // 返回一个缩放矩阵:sx sy sz 分别是x y z轴方向上的缩放倍数
    GLKMatrix4MakeScale(float sx, float sy, float sz)

  • 透视
    视域(viewing volume):在OpenGL中,使用视域来决定那些元素将会显示,如果元素在视域外,那么它将会被丢弃,也不会显示,如果在视域内,元素才会被显示
    投影(prohection):投影分为正射投影和透视投影,我们可以通过它来设置投影矩阵来设置视域,在OpenGL中,默认的投影矩阵是一个立方体,即x y z 分别是-1.0~1.0的距离,如果超出该区域,将不会被显示。

    • 正射投影(orthographic projection):GLKMatrix4MakeOrtho(float left, float righ, float bottom, float top, float nearZ, float farZ),该函数返回一个正射投影的矩阵,它定义了一个由 left、right、bottom、top、near、far 所界定的一个矩形视域。此时,视点与每个位置之间的距离对于投影将毫无影响。
    • 透视投影(perspective projection):GLKMatrix4MakeFrustum(float left, float right,float bottom, float top, float nearZ, float farZ),该函数返回一个透视投影的矩阵,它定义了一个由 left、right、bottom、top、near、far 所界定的一个平截头体(椎体切去顶端之后的形状)视域。此时,视点与每个位置之间的距离越远,对象越小。

    // GLKMatrix4.h为我们提供了一个快速创建透视矩阵的函数
    // fovyRadians是视角,它接受一个弧度值,可以用GLKMathDegreesToRadians(30),将角度转换为弧度
    // aspect视图宽高比,nearZ近视点,farZ远视点
    GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)

projectionMatrix 和 modelviewMatrix
当我们构建好了变换矩阵之后怎么传递的OpenGL呢?GLKBaseEffect有一个transform的属性,其中有两个矩阵分别是projectionMatrix和modelviewMatrix
projectionMatrix:投影矩阵,下面就是设置一个正投影的代码

// 伪代码
const GLFloat aspect = view.width/view.hight;
baseEffect.transform.projectionMatrix = GLKMatrix4MakeOrtho(-0.5 * aspect,
                                                            0.5 * aspect,
                                                            -0.5,
                                                            0.5,
                                                            -50,
                                                            50);

modelviewMatrix:模型矩阵,下面是设置一个沿z轴平移的矩阵

// 伪代码
baseEffect.transform.modelviewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -3.0f);

Demo下载地址:https://github.com/cdcyd/CCOpenGLES

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、概念 在OpenGl ES中,将一个3D模型显示到2D屏幕中有以下四个过程。 视角(Viewing)变换 相当...
    CHSmile阅读 5,604评论 0 1
  • 深度渲染缓存 深度缓存是一个可选的输出缓存,并且与像素颜色渲染缓存相似,几乎所有的OpenGL ES都使用深度缓存...
    McDan阅读 5,618评论 0 0
  • 1 前言 OpenGL渲染3D模型离不开空间几何的数学理论知识,而本篇文章的目的就是对空间几何进行简单的介绍,并对...
    RichardJieChen阅读 12,100评论 1 11
  • 三维几何的矩阵变换: 平移变换: 比例变换: 绕X轴旋转: 绕Y轴旋转: 绕Z轴旋转: X轴反射变换: Y轴反射变...
    cain_huang阅读 11,712评论 2 6
  • 目录 一、分析拉伸的原因 二、准备知识,三维变换 三、OpenGL 下的三维变换 四、修复拉伸问题 一、分析拉伸的...
    半纸渊阅读 6,895评论 3 0

友情链接更多精彩内容