opengles 顶点坐标变换常用的矩阵(九)

2024-02-25 07:12

本文主要是介绍opengles 顶点坐标变换常用的矩阵(九),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、opengles 常用的模型矩阵
    • 1. 单位矩阵
    • 2. 缩放矩阵
    • 3. 位移矩阵
    • 4. 旋转矩阵
  • 二、第三方矩阵数学库
    • 1. glm
      • 1.1 ubuntu 上安装 glm 库
      • 1.2 glm 使用实例
        • 1.2.1 生成一个沿Y轴旋转45度的4x4旋转矩阵, 代码实例如下
        • 1.2.2 生成一个将物体移到到Z轴正方向坐标为5处的4x4 view视图矩阵, 代码实例如下
        • 1.2.3 生成一个视野角度为45度的4x4 投影矩阵, 代码实例如下
    • 2. mail opengles SDK 中的 Matrix.c 和 Matrix.h
  • 总结
  • 参考资料


前言

本文主要介绍 opengles 常用的 model 矩阵(包括用于位移, 缩放,旋转的4x4 矩阵),以及使用第三方的封装库生成 opengles 的 model ,view, projection(模型,视图,投影)矩阵。
软硬件环境:
硬件:PC
软件:ubuntu22.04 opengles3.0


一、opengles 常用的模型矩阵

1. 单位矩阵

在顶点 shader 语句中,如果没有指定 model 矩阵,那么就会使用默认的 model 矩阵,默认的 model 矩阵是一个单位矩阵
在OpenGLES中,由于某些原因我们通常使用4×4的变换矩阵,而其中最重要的原因就是大部分的向量都是4分量的。我们能想到的最简单的变换矩阵就是单位矩阵(Identity Matrix)。单位矩阵是一个除了对角线以外都是0的N×N矩阵。在下式中可以看到,这种变换矩阵使一个向量完全不变
在这里插入图片描述

2. 缩放矩阵

我们从单位矩阵了解到,每个对角线元素会分别与向量的对应元素相乘。如果我们把1变为3会怎样?这样子的话,我们就把向量的每个元素乘以3了,这事实上就把向量缩放3倍。如果我们把缩放变量表示为(S1,S2,S3),我们可以为任意向量(x,y,z)定义一个缩放矩阵:
在这里插入图片描述

3. 位移矩阵

和缩放矩阵一样,在4×4矩阵上有几个特别的位置用来执行特定的操作,对于位移来说它们是第四列最上面的3个值。如果我们把位移向量表示为(Tx,Ty,Tz),我们就能把位移矩阵定义为:
在这里插入图片描述

4. 旋转矩阵

旋转矩阵在3D空间中每个单位轴都有不同定义,旋转角度用θ表示:
在这里插入图片描述

二、第三方矩阵数学库

1. glm

  • glm是一个C++数学库,用于进行OpenGL开发时常用的数学计算,例如向量、矩阵、四元数等。它提供了许多方便的函数和工具,可以简化在OpenGL程序中进行数学计算的过程。
  • 在OpenGL开发中,通常使用glm来进行模型变换、投影变换、法线变换等数学运算。glm库中包含了许多常用的数学函数和数据结构,使得开发者能够更轻松地处理3D图形编程中的数学问题。例如,您可以使用glm::mat4表示4x4的矩阵,glm::vec3表示三维向量,glm::quat表示四元数等。glm还提供了丰富的数学函数,如矩阵乘法、向量点乘、向量叉乘等,以及各种变换函数,如旋转、平移、缩放等。
  • 在使用 glm之前,您需要包含适当的 glm 头文件(glm 库就是一个头文件,没有.so
    库),通常情况下,您可以直接在代码中使用glm提供的函数和数据结构,从而简化数学计算的过程。

1.1 ubuntu 上安装 glm 库

在ubuntu 上可以通过 sudo apt intstall libglm-dev 命令来安装 glm 库文件,如下图所示
在这里插入图片描述
安装成功后,在 /usr/include/glm/ 目录下就可以看到 glm 相关的头文件了,如下图所示
在这里插入图片描述

1.2 glm 使用实例

如下是几个使用 glm 生成 opengles 相关的4x4 model ,view, projection 矩阵的实例

1.2.1 生成一个沿Y轴旋转45度的4x4旋转矩阵, 代码实例如下

test_glm1.cpp

#include <iostream>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>int main() {float angleY = 45.0f; // 45度角度glm::mat4 rotationMatrix = glm::mat4(1.0f); // 初始化为单位矩阵// 绕Y轴旋转45度rotationMatrix = glm::rotate(rotationMatrix, glm::radians(angleY), glm::vec3(0.0f, 1.0f, 0.0f));// 打印结果std::cout << "Rotation Matrix:" << std::endl;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {std::cout << rotationMatrix[i][j] << " ";}std::cout << std::endl;}return 0;
}

编译命令:g++ test_glm1.cpp -o test_glm1
生成结果:执行 ./test_glm1 命令打印生成的矩阵结果如下:
在这里插入图片描述
其中这个0.707107 就是 cos45° 和 sin45° 的值

1.2.2 生成一个将物体移到到Z轴正方向坐标为5处的4x4 view视图矩阵, 代码实例如下

test_glm2.cpp

#include <iostream>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>int main() {glm::mat4 viewMatrix = glm::mat4(1.0f); // 初始化为单位矩阵// 将视点移动到 Z 轴 5 处viewMatrix = glm::translate(viewMatrix, glm::vec3(0.0f, 0.0f, -5.0f));// 打印结果std::cout << "View Matrix:" << std::

这篇关于opengles 顶点坐标变换常用的矩阵(九)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744749

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +