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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏瓜大三哥

视频压缩编码技术(H.264) 之结构

视频的一场或一帧可用来产生一个编码图像。通常,视频帧可分成两种类型:连续或隔行视频帧。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。显然,这时场内邻行...

721
来自专栏数据结构与算法

BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机)

1104
来自专栏落影的专栏

Metal图像处理——颜色查找表(Color Lookup Table)

一张1024x1024的普通图片,是由1024 * 1024=1048576个像素点组成,每个像素点包括RGBA共32bit,常见的图像处理是对相邻像素点颜色、...

1426
来自专栏数据结构与算法

求细胞个数

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如: 阵列  4  10 02...

2638
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

24位真彩色图像转换为16位高彩色图像的实现方法及效果改进

 本文是对多年前作者的一篇博文的重新整理和书写。 一、前言        高彩色位图像即我们常说16位图像,每个像素占用两个字节,相比于24位真彩色来说,...

3055
来自专栏数值分析与有限元编程

矢量函数

一个由三个变量组成的函数w = f(x,y,z)表示如何根据x,y,z来确定w的值。从几何角度更有利于对这个概念的理解:在空间笛卡尔坐标系下取一点,坐标为(x,...

2887
来自专栏mySoul

css的2D转换

下面通过css实现动画效果,可以使用脚本化的css实现滑入,轮廓伸缩的列表,即动态的HTML,一个过时的说法DHTML

920
来自专栏移动开发面面观

OpenGL ES——导入.stl格式的3D模型

1094
来自专栏每日一篇技术文章

OpengL ES _ 入门_02

顶点是啥? 顶点就是坐标位置,不管你是画直线,三角形,正方体,球体,以及3D游戏人物等,都需要顶点来确定其形状。 顶点坐标创建 1.记住顶点的坐标数据类型...

701
来自专栏姬小光

请问#f00是什么颜色?

这道题,对于知道的人来说简直就是送分题,这还用问吗?不就是红色吗?而对于不知道或者没有用心的人来说,却无从入手,怎么回答的都有。

3291

扫码关注云+社区