OpenGL 矩阵的旋转-平移-缩放_worldmatrix在opengl中是一个4x4的矩阵长什么样子-程序员宅基地

技术标签: OpenGL  opengl  matrix  

1.  openGL的矩阵


openGL的矩阵是列优先排序的。就是说,矩阵的数据是存贮在一维数组中,数据上传到openGL处理的时候,会把一维数据的每一行当做列来处理。比如说,一个4*4的矩阵在数组中的排列如下:

matrix44 = {
   m0,   m1,   m2,   m3,
   m4,   m5,   m6,   m7,
   m8,   m9,   m10,  m11,
   m12,  m13,  m14,  m15,
}

当被传输到openGL会当做下面这样的矩阵来处理:



由图可见,m0, m1, m2 表示了x轴, m4, m5, m6 表示了y轴, m8, m9, m10 表示了z轴, 而m12, m13, m14表示了平移量。而最后一行的,m3, m7, m11, m15是齐次坐标。唯有m15等于1是为了,在做矩阵计算的时候,平移量影响到平移量本身,而不会影响到xyz轴的数值。



2.  单位矩阵


没有任何旋转,平移,缩放的矩阵用单位矩阵来表示。所有的旋转,平移,缩放,都是在单位矩阵的基础上进行的。如下:

{
    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,
};

可见单位矩阵的xyz轴都是单位向量平移向量为0



3.  矩阵乘法


旋转,平移,缩放的数据变化是通过矩阵乘法把数值存贮在矩阵中的。简单描述一下矩阵乘法的规则,就是左边矩阵决定结果矩阵的行,右边矩阵决定结果矩阵的列。那么计算的过程是,左边矩阵的行,元素对应乘以,右边矩阵的列,得到的值在结果矩阵的位置就是,左边矩阵的行右边矩阵的列。



4. 矩阵按照某个向量平移

	matrix->m[12] += matrix->m[0] * tx + matrix->m[4] * ty + matrix->m[8]  * tz;
	matrix->m[13] += matrix->m[1] * tx + matrix->m[5] * ty + matrix->m[9]  * tz;
	matrix->m[14] += matrix->m[2] * tx + matrix->m[6] * ty + matrix->m[10] * tz;
	matrix->m[15] += matrix->m[3] * tx + matrix->m[7] * ty + matrix->m[11] * tz;


平移向量即是(tx, ty, tz),  我们做乘法的时候需要按照openGL处理矩阵的方式,所以m0, m4, m8 是第一行以此类推。我们把计算的数值存贮到矩阵的平移向量里。这里解释一下平移算法。openGL实际处理的矩阵乘以向量如下:


   m0,   m4,   m8,   m12,       tx
   m1,   m5,   m9,   m13,   *   ty 
   m2,   m6,   m10,  m14,       tz
   m3,   m7,   m11,  m15,       1

(m0, m1, m2)  和 (m4, m5, m6) 和 (m8, m9, m10) 是x, y, z三个轴的单位向量,那么变换后的向量可以写成, v = tx(m0, m1, m2) + ty(m4, m5, m6) + tz(m8, m9, m10) , 可以看成 在单位向量上进行tx, ty, tz的平移。


根据向量的乘法展开就是, (txm0, txm1, txm2) + ( tym4,  tym5,  tym6) +  (tzm8, tzm9, tzm10)

根据向量加法展开就是, (txm0 + tym4 +tzm8, txm1 + tym5 + tzm9, txm2 + tym6 + tzm10)

这就是矩阵乘以向量法则计算的结果



5. 矩阵在某个向量上缩放

	matrix->m[0]  *= sx;
	matrix->m[1]  *= sx;
	matrix->m[2]  *= sx;

	matrix->m[4]  *= sy;
	matrix->m[5]  *= sy;
	matrix->m[6]  *= sy;

	matrix->m[8]  *= sz;
	matrix->m[9]  *= sz;
	matrix->m[10] *= sz;

就是把矩阵中x, y, z向量乘以对应的缩放比例即可。



6. 矩阵在某个向量上旋转

在任意向量上旋转有些复杂,只说明一下特殊的情况,按照xyz轴旋转。在数学上,我们知道点(x, y)旋转一个a弧度后的坐标是:(x * cosa - y * sina, x * sina + y * cosa), 所以我们可以得出


单位矩阵在Z轴上旋转a弧度后的一个矩阵为:

{
	cosa,    sina, 0.0f, 0.0f,
	-sina,   cosa, 0.0f, 0.0f,
	0.0f,    0.0f, 1.0f, 0.0f,
	0.0f,    0.0f, 0.0f, 1.0f,
};

同理单位矩阵在X轴上旋转a弧度后的矩阵:

{
	1.0f,    0.0f, 0.0f, 0.0f,
	0.0f,    cosa, sina, 0.0f,
	0.0f,   -sina, cosa, 0.0f,
	0.0f,    0.0f, 0.0f, 1.0f,
};

同理单位矩阵在Y轴上旋转a弧度后的矩阵:

{
       cosa, 0.0f,   -sina,  0.0f,
       0.0f, 1.0f,    0.0f,  0.0f,
       sina, 0.0f,    ccosa, 0.0f,
       0.0f, 0.0f,    0.0f,  1.0f,
}

最后把需要旋转的矩阵乘以单位矩阵的旋转矩阵,就会把旋转的数值存储到结果矩阵中了。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tom_221x/article/details/44622011

智能推荐

适合入门的8个趣味机器学习项目-程序员宅基地

文章浏览阅读86次。首发地址:https://yq.aliyun.com/articles/221708谈到机器学习,相信很多除学者都是通过斯坦福大学吴恩达老师的公开课《Machine Learning》开始具体的接触机器学习这个领域,但是学完之后又不知道自己的掌握情况,缺少一些实际的项目操作。对于机器学习的相关竞赛挑战,有些项目的门槛有些高,参加后难以具体的实现,因此造..._scrath五子棋下载

oracle 12c avg,Oracle 12c新特性系列专题-安徽Oracle授权认证中心-程序员宅基地

文章浏览阅读83次。原标题:Oracle 12c新特性系列专题-安徽Oracle授权认证中心 随着Oracle database 12c的普及,数据库管理员 (DBA) 的角色也随之发生了转变。 Oracle 12c数据库对 DBA 而言是下一代数据管理。它让 DBA 可以摆脱单调的日常管理任务,能够专注于如何从数据中获取更多价值。未来我们会推出基于Oracle12c的技术文章,帮助DBA尽快掌握新一代数据库的新特性..._ilm add policy row store compress advanced row after

第七周项目三(负数把正数赶出队列)-程序员宅基地

文章浏览阅读150次。问题及代码:*Copyright(c)2016,烟台大学计算机与控制工程学院 *All right reserved. *文件名称:负数把正数赶出队列.cpp *作者:张冰 *完成日期;2016年10月09日 *版本号;v1.0 * *问题描述: 设从键盘输入一整数序列a1,a2,…an,试编程实现: 当ai>0时,ai进队,当ai<0时,将队首元素出队,当ai

Linux命名空间学习教程(二) IPC-程序员宅基地

文章浏览阅读150次。本文讲的是Linux命名空间学习教程(二) IPC,【编者的话】Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。而 LXC所实现的隔离性主要是来自内核的命名空间, 其中pid、net、ipc、mnt、uts 等命名空间将容器的进程、网络、消息、文件系统和hostname 隔离开。本文是Li..._主机的 ipc 命名空间

adb强制安装apk_adb绕过安装程序强制安装app-程序员宅基地

文章浏览阅读2w次,点赞5次,收藏7次。在设备上强制安装apk。在app已有的情况下使用-r参数在app版本低于现有版本使用-d参数命令adb install -r -d xxx.apk_adb绕过安装程序强制安装app

随便推点

STM32F407 越界问题定位_stm32flash地址越界怎么解决-程序员宅基地

文章浏览阅读290次。如果是越界进入硬件错误中断,MSP 或者 PSP 保存错误地址,跳转前会保存上一次执行的地址,lr 寄存器会保存子函数的地址,所以如果在 HardFault_CallBack 中直接调用 C 语言函数接口会间接修改了 lr,为了解决这个问题,直接绕过 lr 的 C 语言代码,用汇编语言提取 lr 寄存器再决定后面的操作。由于 STM32 加入了 FreeRTOS 操作系统,可能导致无法准确定位,仅供参考(日常编程需要考虑程序的健壮性,特别是对数组的访问,非常容易出现越界的情况)。_stm32flash地址越界怎么解决

利用SQL注入上传木马拿webshell-程序员宅基地

文章浏览阅读1.8k次。学到了一种操作,说实话,我从来没想过还能这样正常情况下,为了管理方便,许多管理员都会开放MySQL数据库的secure_file_priv,这时就可以导入或者导出数据当我如图输入时,就会在D盘创建一个名为123456.php,内容为<?php phpinfo();?>的文件我们可以利用这一点运用到SQL注入中,从拿下数据库到拿下目标的服务器比如我们在使用联合查询注入,正常是这样的语句http://xxx?id=-1 union select 1,'你想知道的字段的内容或查询语句',

Html CSS的三种链接方式_html链接css代码-程序员宅基地

文章浏览阅读2.9w次,点赞12次,收藏63次。感谢原文:https://blog.csdn.net/abc5382334/article/details/24260817感谢原文:https://blog.csdn.net/jiaqingge/article/details/52564348Html CSS的三种链接方式css文本的链接方式有三种:分别是内联定义、链入内部css、和链入外部css1.代码为:<html>..._html链接css代码

玩游戏哪款蓝牙耳机好?2021十大高音质游戏蓝牙耳机排名_适合游戏与运动的高音质蓝牙耳机-程序员宅基地

文章浏览阅读625次。近几年,蓝牙耳机市场发展迅速,越来越多的消费者希望抛弃线缆,更自由地听音乐,对于运动人士来说,蓝牙耳机的便携性显得尤为重要。但目前市面上的大多数蓝牙耳机实际上都是“有线”的,运动过程中产生的听诊器效应会严重影响听歌的感受。而在“真无线”耳机领域,除了苹果的AirPods外,可供选择的产品并不多,而AirPods又不是为运动场景打造的,防水能力非常差。那么对于喜欢运动又想要“自由”的朋友来说,有没有一款产品能够满足他们的需求呢?下面这十款小编专门为大家搜罗的蓝牙耳机或许就能找到适合的!网红击音F1_适合游戏与运动的高音质蓝牙耳机

iOS 17 测试版中 SwiftUI 视图首次显示时状态的改变导致动画“副作用”的解决方法-程序员宅基地

文章浏览阅读1k次,点赞6次,收藏7次。在本篇博文中,我们在 iOS 17 beta 4(SwiftUI 5.0)测试版中发现了 SwiftUI 视图首次显示时状态的改变会导致动画“副作用”的问题,并提出多种解决方案。

Flutter 自定义 轮播图的实现_flutter pageview轮播图 site:csdn.net-程序员宅基地

文章浏览阅读1.9k次。  在 上篇文章–Flutter 实现支持上拉加载和下拉刷新的 ListView 中,我们最终实现的效果是在 listView 上面留下了一段空白,本意是用来加载轮播图的,于是今天就开发了一下,希望能给各位灵感。一 、效果如下说一下大体思路   其实图片展示是用的 PageView ,然后,下面的指示器 是用的 TabPageSelector ,当然整体是用 Stack 包裹起来的。1、..._flutter pageview轮播图 site:csdn.net