LearnOpenGL(五)之变换

news2025/1/17 8:53:40

一、缩放(Scaling)

把缩放变量表示为 (S1,S2,S3), 将任意向量 (x,y,z) 定义一个缩放矩阵,缩放公式:

二、位移

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

三、旋转(Rotation)

角度制与弧度制相互转换公式:

旋转矩阵在3D空间中每个单位轴都有不同定义,旋转角度用θ表示:

1、沿x轴旋转:

2、沿y轴旋转:

3、沿z轴旋转:

4、任意旋转轴

其中(Rx,Ry,Rz)代表任意旋转轴。

四、变换(Transform)

当在组合矩阵(即变换)时,需要先进行缩放操作,然后是旋转,最后才是位移,否则它们会(消极地)互相影响。因为矩阵乘法是不遵守交换律的,这意味着它们的顺序很重要。

五、编程应用

首先,点击这里下载GLM第三方库,然后把头文件的根目录复制到自己工程的includes文件夹,并且包含它的头文件便可以使用:

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

接着,在工程添加变换代码:

// create transformations
        glm::mat4 transform = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix first
        transform = glm::translate(transform, glm::vec3(0.5f, -0.0f, 0.0f));
        transform = glm::scale(transform, glm::vec3(0.5, 0.5, 0.5));
        transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));


unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
        glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));

最后,修改着色器代码如下:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;

out vec3 ourColor;
out vec2 TexCoord;

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(aPos, 1.0f);
    ourColor = aColor;
    TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y);
}

效果如下:

六、demo下载

demo:点击跳转

觉得有帮助的话,打赏一下呗。。

           

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

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

相关文章

IDEA安装JAVA_HOME报错、启动界面卡死的解决方案

1、起因 在使用一段时间社区版的IDEA后&#xff0c;发现有些功能无法正常使用&#xff0c;于是打算安装正版旗舰版IDEA&#xff08;狗头&#xff09;。 2、JAVA_HOME报错 结果发现安装完后&#xff0c;经过一段操作&#xff0c;IDEA无法正常启动&#xff0c;报错如下&#x…

MATLAB 条件语句

MATLAB 条件语句 决策结构要求程序员应指定一个或多个要由程序评估或测试的条件&#xff0c;如果确定条件为真&#xff0c;则应指定要执行的一个或多个语句&#xff0c;如果条件为真&#xff0c;则可以选择要执行的其他语句。条件确定为假。 以下是大多数编程语言中常见的典型…

AI日报|苹果发布OpenELM,黄仁勋亲自护送首台DGX H200至OpenAI,GitHub Copilot迎来新对手...

欢迎大家在 GitHub 上 Star 我们&#xff1a; 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

valgrind,memcheck的使用

一&#xff0c;valgrind介绍 ​ valgrind是一个开源的&#xff0c;检测内存泄漏的工具&#xff0c;通常在linux下使用&#xff0c;除此之外&#xff0c;他还能检测内存管理错误&#xff0c;线程bug等错误。粗浅的来讲&#xff0c;valgrind由两部分构成&#xff0c;一部分用来模…

配置IPSSL证书需要几步

在互联网的世界中&#xff0c;数据安全和用户信任成为了网站管理员和公司所追求的关键因素。为了保护网站的数据安全并提高用户的信任度&#xff0c;HTTPS加密通信已经成为了一种必要手段。而配置IPSSL证书则是实现HTTPS加密通信的重要步骤之一。 让我们来了解一下什么是IPSSL…

Linux入门攻坚——20、systemd、(sysvinit、upstart重温)

再一次讲到Linux系统启动流程&#xff1a; POST --> Boot Sequence --> Bootloader(grub) --> kernel initramfs(initrd) --> rootfs --> /sbin/init 对于init&#xff0c;即系统内核加载完毕后&#xff08;加载kernel和切换根文件系统&#xff09;运行…

是德KEYSIGHT E4980A 20Hz至2MHz精密LCR表

是德KEYSIGHT E4980A 20Hz至2MHz精密LCR表 Keysight(原Agilent) E4980A精密LCR表在20Hz至20MHz范围内提供最高的精度及重复性测量&#xff0c;支持LAN、USB及GPIB计算机连接。E4980A不仅为低抗阻情况下提供快速测量及卓越的性能&#xff0c;在高抗阻情况下亦如此&#xff0c; …

Go 到底是哪里没有做好,我请问呢?

没有引导好并发理念 从历史背景来看&#xff0c;在 Go 诞生的那个年代&#xff0c;并发编程是一个比较新颖的理念。许多其他编程语言、论文甚至书籍都写过关于并发编程的内容。并发编程还没有成为主流思想。 Go 团队发明了 “goroutine” 这个词&#xff0c;Go 让协程的使用变…

掌握未来通信技术:5G核心网基础入门

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;5GC笔记仓 朋友们大家好&#xff0c;本篇文章是我们新内容的开始&#xff0c;我们本篇进入5GC的学习&#xff0c;希望大家多多支持&#xff01; 目录 一.核心网的演进2G核心网2.5G核心网3G核心网4G…

考到HCIP工资一般多少? 有IP证书的进来自测下!

在IT行业&#xff0c;华为认证网络工程师&#xff08;HCIP&#xff09;作为中级认证&#xff0c;属于网络工程师们都会考虑的证书。 它不仅代表了个人在网络技术方面的专业水平&#xff0c;还可能影响到你的薪资水平。 那么&#xff0c;考取HCIP认证后的工资一般是多少&#…

12 JavaScript学习: 字符串

JavaScript 字符串 JavaScript 字符串是一种用于存储和操作文本数据的数据类型。字符串可以包含字母、数字、符号和空格等字符。在 JavaScript 中&#xff0c;字符串可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#xff09;来定义。 例如&#xff1a;…

栈和队列的概念、表示和实现

文章目录 前言一、栈1.定义和特点2.栈的抽象类型定义3.顺序栈的表示4. 顺序栈基本操作的实现 二、队列1.定义和特点2.队列的抽象数据类型定义3.队列的顺序表示4.循环顺序队列5. 循环顺序队列基本操作的实现 总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#…

CSS常用属性之(列表、表格、鼠标)属性,(如果想知道CSS的列表、表格、鼠标相关的属性知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习CSS的时候&#xff0c;必不可少的就要学习选择器和常见的属性&#xff0c;而本篇文章讲解的是CSS中的列表、表格、背景、鼠标属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 大致了解一下本篇文章…

协议的定制之序列化与反序列化 | 守护进程

目录 一、再谈协议 二、序列化与反序列化 三、网络计算器的简单实现 四、网络计算器完整代码 五、代码改进 六、守护进程 七、Json序列化与反序列化 八、netstat 一、再谈协议 是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。简单的说了&#xff0c;网络…

SpringCloud 之 服务消费者

前提 便于理解请我修改了本地域名》这里!!! 127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7003.comRest学习实例之消费者 创建一个消费者去消费 消费者模块展示 1、导入依赖 <!-- 实体类api自己创建的模块 Web 部分依赖展示--><de…

jmeter之跨线程关联

1&#xff09;_setproperty函数&#xff1a;将值保存成jmeter属性 2&#xff09;_property函数&#xff1a;在其他线程组中使用property函数读取属性 一、跨线程接口引用变量 1. 法一&#xff1a;jmeter自带函数_setProperty和_property 1. 1线程组 01 创建登录的【HTTP请求】…

OriginPro作图之箱线图

前言 箱线图(Box-plot) 又称为盒须图、盒式图或箱线图&#xff0c;是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。 本文将结合实例阐述其意义和绘图过程。 箱线图简介 箱线图(Boxplot) 也称箱须图( Box-whisker Plot)&#xff0c;是利用数据中的五个统计量…

FANUC机器人socket通讯硬件配置

一、添加机器人选配包 Fanuc机器人要进行socket通讯&#xff0c;需要有机器人通讯的选配包&#xff0c;1A05B-2600-R648 User Socket Msg&#xff0c;1A05B-2600-R632 KAREL&#xff0c;1A05B-2600-R566 KAREL Diagnostic&#xff0c;1A05B-2600-J971 KAREL Use Sprt FCTN。 二…

有没有一本从电路开始讲然后汇编再到C语言的书?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 没有一本书或者几本书能把这整…

【NPU】A800-9000服务器8*Ascend 910 B的HCCS测试

HCCS集合通信带宽数据 HCCS集合通信带宽数据timeline信息在msprof_*.json文件的HCCS层级展示 summary信息在hccs_*.csv文件汇总。 支持的型号 Atlas 训练系列产品 Atlas A2训练系列产品 测试命令 npu-smi info -t topo结果展示 NPU0 NPU1 NPU2 NPU3 …