第四章 OpenGL ES 基础-位移、缩放、旋转原理

2024-03-12 05:52

本文主要是介绍第四章 OpenGL ES 基础-位移、缩放、旋转原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第四章 OpenGL ES 基础-位移、缩放、旋转原理

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

矩阵小知识

对应矩阵效果
注意:必须是相同维度矩阵才行,比如23矩阵不能和33矩阵进行加减
在这里插入图片描述
矩阵与标量数乘和矩阵与标量加减类似, 实际是对矩阵的每个元素和该标量进行相乘,如下图所示在这里插入图片描述
所以值其实就是两个矩阵行列式相乘的和,取出矩阵A的i行下的所有元素与矩阵B的j列下的所有元素进行相乘和
在这里插入图片描述

OpenGL 初始化矩阵原理

并且任何矩阵与单位矩阵相乘都为矩阵本身.如下图所示:
在这里插入图片描述

根据上图的原理你可以4*4的矩阵,可以默认初始化矩阵,如下代码

void m3dLoadIdentity44(M3DMatrix44f m)
{// Don't be fooled, this is still column majorstatic M3DMatrix44f     identity = { 1.0f, 0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f, 0.0f,0.0f, 0.0f, 1.0f, 0.0f,0.0f, 0.0f, 0.0f, 1.0f };memcpy(m, identity, sizeof(M3DMatrix44f));
}

OpenGL的XYZ位移矩阵原理

在4×4矩阵上有几个特别的位置用来执行特定的操作,对于位移来说它们是第四列最上面的3个值。如果我们把位移向量表示为(Tx,Ty,Tz),我们就能把位移矩阵定义为:
在这里插入图片描述
m3dLoadIdentity44初始化后,对Tx,Ty,Tz进行对应参数补充

void m3dTranslationMatrix44(M3DMatrix44f m, float x, float y, float z)
{// 初始化为单位矩阵m3dLoadIdentity44(m);// 填充位移矩阵的最后一列m[12] = x;m[13] = y;m[14] = z;
}

OpenGL的缩放矩阵原理

矩阵来实现缩放功能, 如果我们把缩放变量表示为(S1,S2,S3)我们可以为任意向量(x,y,z)定义一个缩放矩阵:S1=2,x就放大2倍
在这里插入图片描述
所以上面图可以推测下标0,5,10的位置进行数据填充

void m3dScaleMatrix44(M3DMatrix44f m, float xScale, float yScale, float zScale)
{// 初始化为单位矩阵m3dLoadIdentity44(m);// 填充缩放矩阵的对角线元素m[0] = xScale;m[5] = yScale;m[10] = zScale;
}

OpenGL的旋转矩阵原理

对向量进行旋转也是通过矩阵实现.

比如对于二维进行旋转,其本质就是将z轴作为旋转轴实现旋转,

比如下图所示,由向量v向右旋转θ角度得到向量k:
在这里插入图片描述
那么我们如何获取向量k的x2和y2呢?
由于两个向量的长度都是相同的.并且:

x1 = 长度cosa y1 = 长度sina

所以:

x2 = 长度cos(a+θ) = 长度cosacosθ – 长度sinasinθ= x1cosθ – y1*sinθ

y2 =长度sin(a+θ) = 长度sinacosθ + 长度cosasinθ = y1cosθ + x1*sinθ

所以沿Z轴旋转的矩阵等于:
在这里插入图片描述
同理得出沿x轴旋转为:
在这里插入图片描述
沿y轴旋转为:
在这里插入图片描述

利用旋转矩阵我们可以把任意位置向量沿一个单位旋转轴进行旋转。也可以将多个矩阵复合,比如先沿着x轴旋转再沿着y轴旋转。但是这会很快导致一个问题——万向节死锁(Gimbal Lock)。在这里我们不会讨论它的细节,但是对于3D空间中的旋转,一个更好的模型是沿着任意的一个轴,比如单位向量(0.662, 0.2, 0.7222)旋转,而不是对一系列旋转矩阵进行复合。这样的一个(超级麻烦的)矩阵是存在的,见下面这个公式,其中(Rx,Ry,Rz)代表任意旋转轴:
在这里插入图片描述

有上面三个矩阵推测出

void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z)
{float c = cos(angle);float s = sin(angle);float t = 1.0f - c;// 归一化旋转轴float mag = sqrt(x*x + y*y + z*z);if (mag > 0.0f) {x /= mag;y /= mag;z /= mag;} else {// 如果传入的旋转轴为零向量,则返回单位矩阵m3dLoadIdentity44(m);return;}// 填充旋转矩阵m[0] = x*x*t + c;m[1] = y*x*t - z*s;m[2] = z*x*t + y*s;m[3] = 0.0f;m[4] = x*y*t + z*s;m[5] = y*y*t + c;m[6] = z*y*t - x*s;m[7] = 0.0f;m[8] = x*z*t - y*s;m[9] = y*z*t + x*s;m[10] = z*z*t + c;m[11] = 0.0f;m[12] = 0.0f;m[13] = 0.0f;m[14] = 0.0f;m[15] = 1.0f;
}

这篇关于第四章 OpenGL ES 基础-位移、缩放、旋转原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操