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::

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

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

相关文章

万界星空科技商业开源MES

一、万界星空科技商业开源MES系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES。 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&#xff0c;计…

深度学习500问——Chapter01:数学基础

文章目录 前言 1.1 向量和矩阵 1.1.1 标量、向量、矩阵、张量之间的联系 1.1.2 张量与矩阵的区别 1.1.3 矩阵和向量相乘结果 1.1.4 向量和矩阵的范数归纳 1.1.5 如何判断一个矩阵为正定 1.2 导数和偏导数 1.2.1 导数偏导计算 1.2.2 导数和偏导数有什么区别 1.3 特征值和特征向量…

什么是边缘案例测试?如何查找并确定优先级

何为边缘情况&#xff1f; 在极端条件下发生的情况被称为边缘情况&#xff0c;有时候也叫边界情况&#xff0c;在功能、回归、单元和性能测试中都会应用。如果质量保证团队知道某项功能的最大和最小负载&#xff0c;他们就能防止这些情况发生。当用户不按照程序的预期工作流程…

gma 2.0.6 (2024.02.21) 更新日志

安装 gma 2.0.6 pip install gma2.0.6网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版继…

Spring Cloud Gateway官方文档学习

文章目录 推荐写在前面一、熟悉Gateway基本概念与原理1、三大概念2、工作流程 二、基本使用路由断言的两种写法 三、路由断言工厂1、After路由断言工厂2、Before路由断言工厂3、Between路由断言工厂4、Cookie路由断言工厂5、Header路由断言工厂6、Host路由断言工厂7、Method路由…

静态时序分析:SDC约束命令set_drive详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 目录 指定电阻值 指定端口列表 简单使用 指定上升、下降沿 指定最大最小、条件 写在最后 本章将讨论使用set_drive命令&#xff0c;它用于对输入端口的驱动能力建模。首先需要说明的…

130 如何通过vs2017开发linux c++程序

使用VS2017开发linux下的应用程序&#xff08;C/C&#xff09;_vc_linux.exe vs2017-CSDN博客 参考上面这哥们的&#xff0c;写的很详细 前言 本文章记录如何使用VS2017进行linux应用程序的开发&#xff08;针对新手小白&#xff09;&#xff0c;VS2017能较为方便的通过SSH编辑…

公司数据迁移,服务器小文件多复制慢解决方案

企业普遍面临一个挑战&#xff1a;如何高效地处理和移动大量的小型文件。这些文件虽然单个体积不大&#xff0c;但数量庞大&#xff0c;累积起来会占据极大的存储空间&#xff0c;而且在迁移过程中&#xff0c;复制这些文件的速度往往非常缓慢。这不仅影响了企业的运营效率&…

10-pytorch-完整模型训练

b站小土堆pytorch教程学习笔记 一、从零开始构建自己的神经网络 1.模型构建 #准备数据集 import torch import torchvision from torch.utils.tensorboard import SummaryWriterfrom model import * from torch.utils.data import DataLoadertrain_datatorchvision.datasets.…

如何运用Mybatis Genertor

MyBatis Generator是一个MyBatis的代码生成器&#xff0c;它可以帮助我们快速生成Mapper接口以及对应的XML文件和模型类。在Java开发中&#xff0c;能大大提升开发效率。本文将介绍如何在IntelliJ IDEA中使用MyBatis Generator。 1. 添加MyBatis Generator依赖 我们首先需要在…

计网 - 深入理解HTTPS:加密技术的背后

文章目录 Pre发展历史Http VS HttpsHTTPS 解决了 HTTP 的哪些问题HTTPS是如何解决上述三个风险的混合加密摘要算法 数字签名数字证书 Pre PKI - 数字签名与数字证书 PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 发展历史 HTTP&#xff08;超文本传输协…

代码随想录算法训练营第二十五天补|216.组合总和III ● 17.电话号码的字母组合

组合问题&#xff1a;集合内元素的组合&#xff0c;不同集合内元素的组合 回溯模板伪代码 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtrackin…

人工智能绘画的时代下到底是谁在主导,是人类的想象力,还是AI的创造力?

#ai作画 目录 一.AI绘画的概念 1. 数据集准备&#xff1a; 2. 模型训练&#xff1a; 3. 生成绘画&#xff1a; 二.AI绘画的应用领域 三.AI绘画的发展 四.AI绘画背后的技术剖析 1.AI绘画的底层原理 2.主流模型的发展趋势 2.1VAE — 伊始之门 2.2GAN 2.2.1GAN相较于…

深度学习系列60: 大模型文本理解和生成概述

参考网络课程&#xff1a;https://www.bilibili.com/video/BV1UG411p7zv/?p98&spm_id_frompageDriver&vd_source3eeaf9c562508b013fa950114d4b0990 1. 概述 包含理解和分类两大类问题&#xff0c;对应的就是BERT和GPT两大类模型&#xff1b;而交叉领域则对应T5 2.…

【C++精简版回顾】9.static

1.static修饰成员类型 1.类外初始化&#xff0c;初始化时不需要static修饰(不能修饰)&#xff0c;要有类名限定 2.静态成员是属于类的&#xff0c;全对象公有 1.class class MM { public:MM(string name) {size;a size;this->name name;}void print() {cout << &quo…

瑞_23种设计模式_桥接模式

文章目录 1 桥接模式&#xff08;Bridge Pattern&#xff09;1.1 介绍1.2 概述1.3 桥接模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二2.1 需求2.1 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《23种设计模式》的桥接模式篇。本文中的部分图和概念等资料…

【MySQL】连接查询和自连接的学习和总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-x4sPmqTXA4yupW1n {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

限流算法

下面对常见的限流算法进行讨论。目前&#xff0c;常用的限流算法主要有三种&#xff1a;计数器法、滑动窗口算法、漏桶算法和令牌桶算法。下面分别介绍其原理。 1. 计数器法 计数器法是通过计数对到来的请求进行选择性处理。如系统限制一秒内最多有X个请求&#xff0c;则在该…

《艾尔登法环 黄金树幽影》是什么?Mac电脑怎么玩《艾尔登法环》艾尔登法环下载

全体起立&#xff0c;《艾尔登法环 》最新DLC《黄金树幽影》将在6月21日发布&#xff0c;steam售价198元&#xff0c;现在就可以预订了。宫崎英高在接受FAMI通的采访时表示&#xff0c;新DLC的体量远超《黑暗之魂》和《血源诅咒》资料片。好家伙&#xff0c;别人是把DLC续作&am…

IO进程线程:通信

1.定义互斥锁 #include<myhead.h>int num520;//临界资源//1.创建一个互斥锁变量 pthread_mutex_t mutex;//定义任务&#xff11;函数 void *task1(void *arg) {printf("11111111111111\n");//3.获取锁资源pthread_mutex_lock(&mutex);num1314;sleep(3);pr…