Android OpenGL ES 学习(八) –矩阵变换

news2024/11/24 17:06:31

OpenGL 学习教程
Android OpenGL ES 学习(一) – 基本概念
Android OpenGL ES 学习(二) – 图形渲染管线和GLSL
Android OpenGL ES 学习(三) – 绘制平面图形
Android OpenGL ES 学习(四) – 正交投影
Android OpenGL ES 学习(五) – 渐变色
Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序
Android OpenGL ES 学习(七) – 纹理
Android OpenGL ES 学习(八) –矩阵变换
Android OpenGL ES 学习(九) – 坐标系统和。实现3D效果
代码工程地址: https://github.com/LillteZheng/OpenGLDemo.git

今天要完成的效果:
在这里插入图片描述

一. 矩阵变换

说到矩阵,就不得不说大学的线性代数,可能大部分看到这,就不想往下看了。
别急,google 也知道我们懒,所以提供了 Matrix 这个类,来帮助我们,用简单易懂的方式,实现矩阵变换。
当然,一些基础知识,还是学习的,你也可以参考官网,学习更全面的知识。
https://learnopengl-cn.github.io/01%20Getting%20started/07%20Transformations/

1.1 矩阵基础知识

我们都知道 OpenGL 是一个向量,向量是什么东西,就是又有方向,又有大小,就像高中物理的力。
在这里插入图片描述
而矩阵又是什么呢?简单来说矩阵就是一个矩形的数字、符号或表达式数组。矩阵中每一项叫做矩阵的元素(Element)。下面是一个2×3矩阵的例子:
在这里插入图片描述
那向量跟矩阵又有啥关系?

我们知道,向量可以表示位置,颜色或者坐标,甚至是纹理,其实深入去看向量,它其实是一个 NX1的矩阵 ,N表示向量分量的个数(也叫N维(N-dimensional)向量:
在这里插入图片描述
这样,我们就可以让矩阵和向量相乘,而向量只有一列,故所得乘积的结果,依赖于矩阵的效果。正巧,很多有趣的2D/3D变换都可以放在一个矩阵中,用这个矩阵乘以我们的向量将变换(Transform)这个向量。

1.2 单位矩阵

单位矩阵是比较特殊的矩阵,在OpenGL 中,由于只有4个分量,所以使用 4x4 的矩阵,单位矩阵是一个除了对角线以外都是0的N×N矩阵,任何矩阵乘以它,都等于矩阵本身。

在这里插入图片描述
你可能会奇怪,要一个单位矩阵干嘛?别着急,看看下面的效果。

1.3 缩放

对一个向量进行缩放(Scaling)就是对向量的长度进行缩放,而保持它的方向不变。由于我们操作的是 2维或者3维,所以只需要改变x,y 或者 z 的大小就可以了。
比如向量v¯=(3,2)。我们可以把向量沿着x轴缩放0.5,使它的宽度缩小为原来的二分之一;我们将沿着y轴把向量的高度缩放为原来的两倍:
在这里插入图片描述
而用矩阵怎么表示呢?
如果把缩放值改成 s1,s2,s3 ,则缩放的矩阵为:
在这里插入图片描述
如果使用代码,则用:

Matrix.scaleM(UnitMatrix,0,s1,s2,s3)

1.4 平移

位移(Translation)是在原始向量的基础上加上另一个向量从而获得一个在不同位置的新向量的过程。
这个比较简单,套上矩阵的加法公式,可以得出矩阵:
在这里插入图片描述
使用代码:

Matrix.translateM(UnitMatrix,0,s1,s2,s3)

1.5 旋转

旋转稍微会比较复杂一点,如下图:
在这里插入图片描述
我们需要定义一条边,并在此基础上,旋转一个角度。那角度和方向怎么去关联呢,聪明的你,已经猜想到,使用 cosθ 或者 sinθ 了。旋转的矩阵,也是这样,如沿x轴旋转
在这里插入图片描述
代码:

Matrix.rotateM(UnitMatrix, 0, angle, s1, s2, s3);

二. 实践

之前的版本中,我们使用了正交投影 Android OpenGL ES 学习(四) – 正交投影,设置了一个矩阵,这样也保持不变,由于向量的读法是从右到左的,所以顶点着色器如下:

private const val VERTEX_SHADER = """#version 300 es
        uniform mat4 u_Matrix;
        layout(location = 0) in vec4 a_Position;
        layout(location = 1) in vec2 aTexture;
        out vec4 vTextColor;
        out vec2 vTexture;
        void main()
        {
            // 矩阵与向量相乘得到最终的位置
            gl_Position = u_Matrix * a_Position;
            vTexture = aTexture;
        
        }
        """

其他不变,然后获取 matrix 的值:

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        GLES30.glClearColor(1f, 1f, 1f, 1f)
        makeProgram(VERTEX_SHADER, FRAGMENT_SHADER)

        uMatrix = getUniform(U_MATRIX)
        ...
    }

为了每次都能修改都,将赋值操作,放到onDrawFrame 那里

override fun onDrawFrame(gl: GL10?) {
    //步骤1:使用glClearColor设置的颜色,刷新Surface
    GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)

    GLES30.glUniformMatrix4fv(uMatrix, 1, false, UnitMatrix, 0)
    //useVaoVboAndEbo
    texture?.apply {
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D,id)
    }

    GLES30.glBindVertexArray(vao[0])
    GLES30.glDrawElements(GLES30.GL_TRIANGLE_STRIP, 6, GLES30.GL_UNSIGNED_INT, 0)
}

GlSurfaceView 的刷新模式,改成点击才刷新,这样方便点击测试

 //等待点击才会刷帧
renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY

其中,平移,旋转和缩放的代码如下:

 linear.addBtn("平移"){
   Matrix.translateM(UnitMatrix,0,0.5f,0.0f,0f)
    glView.requestRender()
}
linear.addBtn("旋转"){
    Matrix.rotateM(UnitMatrix, 0, 180f, 1f, 0f, 0f);
    glView.requestRender()
}
linear.addBtn("缩放"){
    Matrix.scaleM(UnitMatrix,0,0.8f,0.8f,0f)
    glView.requestRender()
}

看看效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UML图讲解(关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系)

UML图讲解 简介:本文讲解UML图的各种情况下的含义。 简介 百度百科: UML-Unified Modeling Language统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。 UML是在开…

【实时数仓】动态分流的实现源码(反序列化器、配置表、广播流、业务流)

文章目录一 根据MySQL的配置表,动态进行分流1 自定义反序列化器(1)需求分析(2)代码实现2 从配置表中读取数据(1)自定义CDC采集的反序列化器(2)使用FlinkCDC读取配置表数据…

事务的隔离级别

目录 1.1 数据并发问题 1.2 SQL中的四种隔离级别 1.3 MySQL支持的四种隔离级别 1.4 如何设置事务的隔离级别 MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每 个客户端与服务器连接…

简说四种架构的通用思维

一.自顶向下构建架构 ​1.首先定义问题,而定义问题中最重要的是定义客户的问题,特别主要识别出关键问题,关键问题是对客户有体感,能够解决客户痛点,通过一定的数据化来衡量识别出来,关键问题要优先给出解决…

我从“校园小白”到仿真“职场小达人”的CFD学习史

CFD属于CAE技术中比较难的一款软件,主要原因就是流体的特点决定了,因为相比于固体,流体太容易变形了,分子之间的距离比较大。所以,导致了一系列的问题。常常的结果是,忙了半天或者很长,根本得不…

Spring Security自定义认证逻辑实现图片验证码登录

前言 相信大家在网上冲浪都遇到过登录时输入图片验证码的情况,既然我们已经学习了 Spring Security,也上手实现过几个案例,那不妨来研究一下如何实现这一功能。 首先需要明确的是,登录时输入图片验证码,属于认证功能…

【录用案例】计算机电子类SCI,仅1个月15天录用

【期刊简介】IF:1.0-2.0,JCR4区,中科院4区 【检索情况】SCI在检,正刊 【征稿领域】自主传感器网络的高级接口电路及其应用 【参考周期】2-3个月左右 重要时间节点: 2022.12.15 | Accepted 2022.11.22 | 提交返修稿 20…

设计模式之建造者模式

builder desigin pattern 建造者模式的概念、建造者模式的结构、建造者模式的优缺点、建造者模式的使用场景、建造者模式的实现示例、建造者模式的源码分析 1、建造者模式的概念 将一个复杂对象的构建和表示分离,使得同样的创建过程可以得到不同的表示。其主要特点…

一种高复用的组件式安装包制作系统

目录 整体设计 流程描述 文件目录结构设计 产品资源的配置与更新 安装包制作流程 安装包执行流程 整体设计 如下展示了安装包系统的整体结构: 将集群布署可能用到的docker资源,按最小的单元进行整理,以压缩包的形式放于资源库&#xf…

欧姆龙电气元器件要点14讲

对于一个电气工程师来说,不仅仅只是要会PLC、伺服控制、变频器参数调优和总线控制、触摸屏这些大的元件的使用,还有很多种类齐全、功能各异的电气元器件,它们的作用、原理、维护方法、安全要点都要熟记于心,牢牢掌握。 第一章 电气…

艾美捷CpG ODN——ODN 1720 (TLRGRADE)说明书

艾美捷CpG ODN系列——ODN 1720 (TLRGRADE):具有硫代磷酸酯骨架的GpC寡脱氧核苷酸。 艾美捷CpG ODN 丨ODN 1720 (TLRGRADE)化学性质: 序列:5-tccatgagcttcctgatgct-3(小写字母表示硫代磷酸酯键)。 MW:638…

Java中的运算符

算术运算符&#xff1a;&#xff0c; -&#xff0c;*&#xff0c;/&#xff0c;%&#xff0c;&#xff0c;--关系运算符&#xff1a;&#xff0c;!&#xff0c;<&#xff0c;>&#xff0c;<&#xff0c;>逻辑运算符&#xff1a;&&&#xff0c;||&#xff0…

基于STM32的温度控制系统

提示&#xff1a;记录毕设 文章目录前言一、任务书1.1设计(研究)目标:1.2设计(研究)内容:二、代码思路三、硬件四、联系我们五、设计六、框图代码等资料喜欢请点赞哦&#xff01;前言 基于STM32的温度控制系统&#xff0c;主控使用STM32F103ZET6&#xff0c;在正点原子的精英板…

ubuntu18.0 调节显卡GPU涡轮风扇转速

前言&#xff1a; 在炼丹的时候发现涡轮显卡的温度已经很高了85摄氏度&#xff0c;但是涡轮的风扇转速还不到65%&#xff0c;此时显卡计算频率明显已经下降了&#xff0c;所以需要手动调节风扇的转速&#xff0c;让噪音和计算速度处于均衡状态。 一、准备工作 》》安装显卡驱…

html:自定义网页右键菜单

<div id"menu"><divclass"menu-item"data-id"1">功能1</div><divclass"menu-item"data-id"2">功能2</div><divclass"menu-item"data-id"3">功能3</div><…

股票购买接口委托下单c++代码

炒股并非是运气可以驱使的&#xff0c;买股票不是赌博&#xff0c;是一种有风险的经济投资。在股市投资生涯中&#xff0c;掌握一门实战买卖技巧是我们必备的武器&#xff0c;这也是我们能长久在股市投资中得以生存的技法。 其实做股票投资是非常讲究买入和卖出的时机的。一只…

图像风格迁移-DSTN

样式传输的目的是从参考图像中再现具有样式的内容图像。现有的通用风格转换方法成功地以艺术或照片逼真的方式将任意风格传递给原始图像。然而&#xff0c;现有作品所定义的“任意风格”的范围由于其结构限制而在特定领域内受到限制。具体而言&#xff0c;根据预定义的目标域来…

用vscode配置C++3种编译器及多文件编译

末尾附上最终的模板 Vscode开发环境配置 C有很多种编译器&#xff0c;最重要的有三种 GNU的GCC(推荐)微软的MSVCClang/LLVM C的最新标准是C23,各个编译器对C各个标准的支持情况是不同的&#xff1a; C compiler support - cppreference.com 注意主要看C20的支持情况 用Vsco…

校园进销存网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 功能模块包括&#xff1a;员工模块、手机类型模块、供应商模块、采购模块、客户模块、销售模块、统计模块、库存模块 (1…

2022年的最后一个Win11 Dev预览版本

今日凌晨&#xff0c;微软向广大Win11 Dev用户推送了今年的最后一个版本更新&#xff0c;版本号为25267。根据官方的变化&#xff0c;引入了改变任务栏中可用搜索框样式的设置。此外&#xff0c;此版本还对任务栏、文件资源管理器、设置等进行了各种增强。 该公司还表示&#x…