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

这篇具有很好参考价值的文章主要介绍了Android OpenGL ES 学习(八) –矩阵变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

今天要完成的效果:
Android OpenGL ES 学习(八) –矩阵变换

一. 矩阵变换

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

1.1 矩阵基础知识

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

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

1.2 单位矩阵

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

Android OpenGL ES 学习(八) –矩阵变换
你可能会奇怪,要一个单位矩阵干嘛?别着急,看看下面的效果。

1.3 缩放

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

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

1.4 平移

位移(Translation)是在原始向量的基础上加上另一个向量从而获得一个在不同位置的新向量的过程。
这个比较简单,套上矩阵的加法公式,可以得出矩阵:
Android OpenGL ES 学习(八) –矩阵变换
使用代码:

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

1.5 旋转

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

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()
}

看看效果:

Android OpenGL ES 学习(八) –矩阵变换文章来源地址https://www.toymoban.com/news/detail-403973.html

到了这里,关于Android OpenGL ES 学习(八) –矩阵变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES学习日记(六)-------head使用教程(简易教程)

    head可以看到的信息,和之前讲到的查看的单节点看到的一样,适当了解一下就行: 一、添加索引 ps:讲下增加索引涉及的知识点 1.索引 1个索引,索引相当于什么?相当于数据库啊 2.分片 5个分片,分片就是存放数据的东西,数据是存在分片上面的,分片是存在节点上面的,当分片切到别的

    2024年04月10日
    浏览(39)
  • Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

    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 OpenG

    2024年01月25日
    浏览(44)
  • OpenGL ES 2.0 for Android教程(三):编译着色器并绘制到屏幕

    文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(二) OpenGL ES 2.0 for Android教程(四) OpenGL ES 2.0 for Android教程(五) OpenGL ES 2.0 for Android教程(六) OpenGL ES 2.0 for Android教程(七) OpenGL ES 2.0 for Android教程(八) OpenGL ES 2.0 for Android教程(九) 本章将继续我

    2023年04月26日
    浏览(57)
  • 无涯教程-机器学习 - 矩阵图函数

    相关性是有关两个变量之间变化的指示,在前面的章节中,无涯教程讨论了Pearson的相关系数以及相关的重要性,可以绘制相关矩阵以显示哪个变量相对于另一个变量具有较高或较低的相关性。 在以下示例中,Python脚本将为Pima印度糖尿病数据集生成并绘制相关矩阵,它可以借

    2024年02月10日
    浏览(30)
  • Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    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 OpenG

    2024年02月05日
    浏览(45)
  • Android OpenGL ES 学习(十三) -离屏渲染FBO(截图)RBO, OES转 FBO

    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 学习(七) –

    2024年02月12日
    浏览(40)
  • 机器学习实战教程(四):从特征分解到协方差矩阵:详细剖析和实现PCA算法

    方差和标准差的原理和实例演示,请参考 方差 方差(Variance)是度量一组数据的分散程度。方差是各个样本与样本均值的差的平方和的均值: 标准差 标准差是数值分散的测量。 标准差的符号是 σ (希腊语字母 西格马,英语 sigma) 公式很简单:方差的平方根。 协方差 通俗

    2024年02月02日
    浏览(50)
  • 《Android 移动应用基础教程(Android Studio)(第2版)》【学习笔记】【2023春】【附源码】

    《Android 移动应用基础教程(Android Studio)(第2版)》黑马程序员 源代码 Android——六大基本布局总结/CSDN@小马 同学 【Android】线性布局(LinearLayout)最全解析/CSDN@Teacher.Hu 一个不错的计算器界面👇 Android Studio App LinearLayout多层布局嵌套/CSDN@pythontojava 一个简单的布局👇 Andro

    2024年02月01日
    浏览(60)
  • 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵

    第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵 模型都是3D的,但屏幕是2D的。如何将3D空间投影到2D平面,还能保

    2024年03月09日
    浏览(44)
  • 第八章 OpenGL ES 基础-MVP矩阵理解

    第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵 第六章 OpenGL ES 基础-FBO、VBO理解与运用 第七章 OpenGL ES 基础-输入

    2024年04月26日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包