LearnOpenGL-入门-7.变换

news2025/3/12 9:53:52

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正

我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject

LearnOpenGL中文官网:https://learnopengl-cn.github.io/

文章目录

  • 变换
  • 向量
    • 单位向量
    • 向量点乘
    • 向量叉乘
  • 矩阵
    • 矩阵的缩放
    • 矩阵的平移
    • 矩阵的旋转
    • 矩阵的组合
  • GLM
    • 集成到项目中
    • 例子

此节简要记些比较重要的基础数学背景,更完整内容请看LearnOpenGL官网。

变换

有两种方式改变物体的位置

  • 在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动
  • 使用(多个)矩阵(Matrix)对象可以更好的变换(Transform)一个物体

向量

单位向量

  • 特殊性质:它的长度是1

  • 单位向量计算方法

    为它每个分量除以向量的长度得到它的单位向量

  • 例子

    (4,2)它的长度是√20

    那么单位向量是:((4/√20),(2/√20))

    单位向量的长度是:√((4/√20)*(4/√20)+(2/√20)*(2/√20)) = 1

向量点乘

  • 公式

    v*k=v的长度*k的长度*cos(v与k的夹角)

    • 正交,夹角90度

      v*k点积为0

  • 点乘的值v*k

    • 由点乘值算两向量的夹角

      用反余弦函数arccos(-0.8) = 143.1度

  • 算夹角

    计算两个单位向量间的夹角,我们可以使用反余弦函数cos−1,可得结果是143.1度。

    现在我们很快就计算出了这两个向量的夹角。

    点乘会在计算光照的时候非常有用。

向量叉乘

  • 公式

  • 竖着摆更直观

  • 结果是

    得到一个正交于两个输入向量的第三个向量

矩阵

矩阵的缩放

矩阵的平移

矩阵的旋转

最麻烦的

用矩阵来旋转变换,会导致万向锁,需要用四元数。

矩阵的组合

  • 记住顺序-下面有glm例子

    • 写代码的顺序

      平移矩阵*旋转矩阵*缩放矩阵*向量

    • 解读的顺序

      从右往左读,向量先进行缩放,再进行旋转最后平移

  • 例子

  • 注意

    • 当矩阵相乘时,在最右边的矩阵是第一个与向量相乘的,所以应该从右向左读这个乘法

    • 如果代码是:缩放矩阵*旋转矩阵*平移矩阵

      解读时是先平移再旋转、缩放,可能会造成消极地影响。

      比如,如果先位移再缩放,位移的向量也会同样被缩放。

      从2x+1,变成(1+x)*2

      若x=1,2x+1=3,(1+x)*2=4

GLM

集成到项目中

  • 网站下载

    https://github.com/g-truc/glm

    不需要编译成lib文件

  • 如何集成glm

    复制文件夹到项目下

    包含这个目录

例子

  • 代码

    glsl

    #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.0);
        ourColor = aColor;
        TexCoord = aTexCoord;
    }
    
    #version 330 core
    out vec4 FragColor;
    
    in vec3 ourColor;
    in vec2 TexCoord;
    
    uniform sampler2D texture1;
    uniform sampler2D texture2;
    
    void main()
    {
        // 两纹理混合
        FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2);
        // 单个纹理与颜色混合
        //FragColor = texture(texture1, TexCoord) * vec4(ourColor, 1.0);
    }
    

    cpp

    #include <glm/glm.hpp>
    #include <glm/gtc/matrix_transform.hpp>
    #include <glm/gtc/type_ptr.hpp>
    .....
    // 这几个前一节6.纹理有
    // 顶点数据.....
    // 纹理加载.....
    // 设置shader的uniform的纹理单元 
    while (!glfwWindowShouldClose(window))
    {
        // 变换
        glm::mat4 trans = glm::mat4(1.0f);
        trans = glm::translate(trans, glm::vec3(0.5, -0.5, 0.0));
        trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0, 0.0, 1.0));
        trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));
        // 发送数据给uniform
        unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
        glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
    .....
    
    • 顺序:

      代码顺序:平移矩阵*旋转矩阵*缩放矩阵*向量

      阅读效果顺序:把箱子在每个轴都缩放到0.5倍,然后沿z轴根据时间旋转度数,并平移到(0.5, -0.5, 0)位置

  • 效果

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

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

相关文章

Linux INPUT 子系统实验

目录 一、input 子系统简介 input_dev 结构体 二、驱动编写 1、宏定义 2、按键结构体和按键中断结构体 3、中断处理函数 4、定时器处理函数 5、注册input_dev 6、驱动出口 代码 验证 打印现象解析 1、input_event 结构体 2、打印解释 三、APP编写 ​ app代码如下 验…

【操作方法】windows开启、关闭防火墙方法

【操作方法】windows开启、关闭防火墙方法一、命令法1.启动或关闭Windows Default 防火墙2.选择启动或关闭二、鼠标点击法1.首先将查看类型选择为“类别”2.系统和安全3.Windows Defender 防火墙4.启动或关闭Windows Default 防火墙5.选择启动或关闭一、命令法 点击按键WinR打…

基于OBD系统的量产车评估测试(PVE)

在轻型汽车污染物排放限值及测量方法&#xff08;中国第六阶段&#xff09;中&#xff0c;除了对汽车尾气排放等制定了更为严格的限制之外&#xff0c;也在OBD系统认证项目中增加了新的要求——量产车评估&#xff08;Production Vehicle Evaluation&#xff09;测试。该测试由…

在码匠中使用 Microsoft SQL Server

目录 在码匠中集成 Microsoft SQL Server 在码匠中使用 Microsoft SQL Server 关于码匠 SQL Server 是 Microsoft 公司推出的关系型数据库管理系统。具有使用方便、可伸缩性好、与相关软件集成程度高等优点。Microsoft SQL Server 是一个功能全面的数据库平台&#xff0c;使…

Lecture1 Welcome Stanford CS229 Machine Learning|2018 Autumn|吴恩达机器学习

1:15:20目录机器学习类比跳棋游戏&#xff0c;理解机器学习的概念&#xff1a;很多人坐在电脑旁玩游戏或跳棋好几天&#xff0c;这就是经验E&#xff1b;任务T是指下跳棋的任务&#xff1b;性能度量P可能是指在与下一个对手下棋时/在下一场跳棋中获胜的机会是多少&#xff1f;监…

安装TDengine 服务端和客户端——客户端连不上问题解决

客户端连不上问题解决1. 下载安装服务端2. 下载安装客户端2.1 修改hosts文件2.2 修改客户端taos.cfg 文件安装中出现的问题问题解决1. 下载安装服务端 根据服务端系统不同 下载不同的安装包 &#xff0c;按照参考网址&#xff1a;https://docs.tdengine.com/get-started/packa…

接口电子器件中的光耦合器模块

工业电子设备在电气噪声和机械挑战性的环境中运行。问题在于&#xff0c;自动化、控制和仪表组件依赖于没有电气干扰或失真的精确信号来正常运行。因此&#xff0c;光耦合器模块通常被工程师用作信号源以及电源、工业控制和其他组件之间的信号保护中介。 在工业应用中&#xf…

基于自定义训练函数的BP神经网络回归分析

目录 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的神经元 BP神经网络的激活函数 BP神经网络的传递函数 基于自定义训练函数的BP神经网络回归分析 背影 BP神经网络是一种成熟的神经网络&#xff0c;拥有很多训练函数&#xff0c;传递函数&#xff0c;激活函数&#x…

创建自助服务知识库的指南

在SaaS领域&#xff0c;自助文档是你可以在客户登录你的网站时为他们提供的最灵活的帮助方式&#xff0c;简单来说&#xff0c;一个自助知识库是一个可以帮助许多客户的文档&#xff0c;拥有出色的自助服务知识库&#xff0c;放在官网或者醒目的地方&#xff0c;借助自助服务知…

vue H5跳转小程序报错:config:fail,Error: 系统错误,错误码:63002,invalid signature

微信开发者工具下载地址与更新日志 错误码&#xff1a;63002,invalid signature 无效的签名 附录5 微信网页开发 /JS-SDK说明文档 微信 JS 接口签名校验工具 全局返回码说明 ​ 排查步骤 确认签名算法正确&#xff0c;可用 http://mp.weixin.qq.com/debug/cgi-bin/sand…

【Python学习笔记】第二十二节 Python XML 解析

一、什么是XMLXML即ExtentsibleMarkup Language(可扩展标记语言)&#xff0c;是用来定义其它语言的一种元语言。XML 被设计用来传输和存储数据。XML 是一套定义语义标记的规则&#xff0c;它没有标签集(tagset)&#xff0c;也没有语法规则(grammatical rule)。任何XML文档对任何…

2023年金三银四必备软件测试常见面试题1500问!!!【Linux篇】

六、Linux6.1 Linux系统你是怎么用的?[在测试1、执行的过程中&#xff0c;我们发现的bug&#xff0c;有时候需要定位bug&#xff0c;协助开发修复bug时需要在linux里通过命令tail-200或tail-500查看当天的日志的后面多少行或者前面多少行定位bug或者通过tail -f来查看日志里的…

线程池阻塞问题

问题 记录一下生产环境出现的问题。。。 几天生产环境有同事反映分页查询一直在转圈查不出来数据&#xff0c;跟我反馈&#xff0c;我也是很积极的去看有什么问题&#xff0c;我以为就是比较常见的问题吧&#xff0c;当我看的时候觉得很奇怪。 有一个分页的接口其实有很多的…

LSB 题解

今天来刷一道Misc的题目&#xff0c;LSB原理进行图片隐写 LSB原理 LSB是一种利用人类视觉的局限性设计的幻术 PNG和BMP图片中的图像像素一般是由RGB(RED红 GREEN绿 BLUE蓝)三原色组成 记住&#xff0c;JPG图片是不适合使用LSB隐写的&#xff0c;JPG图片对像数进行了有损压缩…

Android逆向之旅—反编译利器Apktool使用教程

apktool下载软件首先下载apktool.bat和apktool.jar官网地址&#xff1a;https://ibotpeaches.github.io/Apktool/install/配置环境变量具体的apktool命令自行百度apktool 解包与打包解包&#xff1a; apktool d xxx.apk打包&#xff1a; apktool b xxx1.jadx安装与使用下载exe或…

C/C++开发,无可避免的内存管理(篇五)-c++与垃圾回收.水中捞月

一、垃圾回收机制 虽然智能指针帮助开展者简化了堆内存回收问题&#xff0c;但是它需要开发者显式声明&#xff0c;需要使用时判断等&#xff0c;还是不够便捷。而像java、Python、C#等开发语言直接支持垃圾回收机制。程序开发上&#xff0c;通常会将不再使用或没有任何指针指向…

译文《Learning to Drive in a Day》

摘要——我们展示了深度强化学习在自动驾驶中的首次应用。从随机初始化的参数中&#xff0c;我们的模型能够使用单个单眼图像作为输入&#xff0c;在少数训练集中学习车道跟随策略。我们提供一个通用且易于获得的奖励&#xff1a;车辆在没有安全驾驶员控制的情况下行驶的距离。…

numpy常用操作

文章目录1 numpy库2 数组对象 ndarray2.1 数组对象的创建2.1.1 利用array函数创建ndarray对象2.1.2 np.ones()和np.zeros()函数2.1.3 np.random.rand()函数2.1.4 np.arange()函数2.1.5 np.linspace()函数2.1.6 np.empty()函数2.2 ndarray对象常用属性2.3 ndarray常用操作2.3.1 …

SkyWalking简介和安装

APM系统 早期的监控系统功能比较单一&#xff0c;主要以监控CPU、内存、网络、I/O等基础设置为主&#xff08;cacti、nagios&#xff09; 后来随着中间件技术的不断发展&#xff0c;监控系统也开始监控缓存、数据库、MQ等各种基础组件的性能&#xff08;zabbix、prommethus&a…

马斯克被曝正在“招兵买马”,准备进军AI赛道

知情人士透露&#xff0c;马斯克最近几周接触了人工智能研究人员&#xff0c;打算成立一个新的研究实验室&#xff0c;开发聊天机器人ChatGPT的竞品。 为了开展这项工作&#xff0c;马斯克一直在向Igor Babuschkin抛橄榄枝&#xff0c;这位研究人员曾经在谷歌和OpenAI任职&…