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

智能推荐

java使用密文链接数据库_Java基础——数据库连接信息使用密文-程序员宅基地

文章浏览阅读492次。背景数据库连接配置文件一般都是使用明文,这会带来数据库泄露的安全问题。例如jdbc.properties配置文件中,数据库连接地址、用户名、密码都是明文,如何使配置文件中的数据库连接信息避免明文显示是本文重点内容,即如何使配置信息使用密文就可以达到跟明文一样的效果。分析假如数据库连接密码使用了密文。修改连接池源码顾名思义,修改dbcp、c3p0、Druid连接池的源码,先对加密的密码解密,然后再创..._java读取加密的密码连接数据库

鸿蒙操作系统游戏模式,鸿蒙OS 2.0采用鸿蒙和Android 10双架构,游戏性能比EMUI11表现好...-程序员宅基地

文章浏览阅读5.5k次。鸿蒙OS 2.0采用鸿蒙和Android 10双架构,来支持兼容安卓APP看到报道的这个成绩,鸿蒙系统下比EMUI11系统表现更加优秀,这一点就成功了,接下来当真正完全使用鸿蒙内核之后应该有很好的表现吧!但是网友似乎并不买单,怎么回事!反正不推出鸿蒙专用app,就是让我们认为是安卓换皮,任你如何解释也没用,第三方没有研发鸿蒙app,至少华为自己要推出几款鸿蒙系统专用的APP供人家下载吧。不然恐怕换..._鸿蒙2与安卓10哪个操作系统好用?

MySQL 用户权限和远程访问设置_mysql远程访问权限-程序员宅基地

文章浏览阅读9.2k次。MySQL 用户权限和远程访问设置_mysql远程访问权限

c#中计算三角形面积公式_三角形面积公式!你到底知道几个?-程序员宅基地

文章浏览阅读573次。微信公众号“中学数学教与学”教师群公告微信QQ教师群入群方式及介绍高中数学教与学★教师QQ群【324623715】初中数学教与学★教师QQ群【460287009】中学数学教与学★学生QQ群【837494287】你知道几个呢?三角形面积公式!第一种已知三角形的底边长为,高为,则三角形面积:第二种已知三角形的周长为,内切圆半径为,则三角形面积:第三种已知三角形的三边长的乘积为,外接圆半径为,..._c#直角三角形面积公式

基于Python爬虫山东青岛二手房数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状-程序员宅基地

文章浏览阅读1.2k次,点赞24次,收藏16次。基于Python爬虫山东青岛二手房数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状。通过采集、整理和分析二手房市场的数据,可以为购房者提供更全面、准确的市场信息,有助于优化购房决策,提高购房效率和准确性。二手房市场的区域差异研究 由于不同地区的经济发展水平、人口密度、交通条件等方面的差异,二手房市场在不同地区也存在一定的差异。二手房市场的价格预测研究 许多学者和研究人员通过统计分析、机器学习等方法,对二手房市场的价格走势进行研究和预测。

numba.jit警告:failed type inference due to: non-precise type pyobject-程序员宅基地

文章浏览阅读2.9k次。from numba import jit代码报错:failed type inference due to: non-precise type pyobject解决方法:把jit函数挪到类的外面去用。_non-precise type pyobject

随便推点

Libevent book 笔记(11) Connection listeners accepting TCP connections_.net启动 the connection listener failed to accept an-程序员宅基地

文章浏览阅读296次。文章目录Creating or freeing an evconnlistenerevconnlistener_newevconnlistener_new_bindevconnlistener_freeRecognized flagsThe connection listener callbackEnabling and disabling an evconnlistenerevconnlistener_disableevconnlistener_enableAdjusting an evconnliste_.net启动 the connection listener failed to accept any new connections

开源的 Sora 复现方案,成本降低近一半!-程序员宅基地

文章浏览阅读723次,点赞19次,收藏14次。近日,开发 ChatGPT 的 OpenAI 公司又放出王炸 Sora,一个可以根据文本生成视频的 AI 模型。上图就是 OpenAI 公布的 Sora 生成的视频片段,可以毫不夸张地说 Sora 直接将视频生成技术推向了新的高度,这也标志着人工智能视频生成技术迈入了新的时代。此项技术,可以广泛应用于电影、动画、游戏、广告等领域,为内容创作者提供更加便捷、高效的创作工具。虽然 Sora 没有开源,..._sora开源了吗

android8.1上新增camera设备_android 8.1 camera-程序员宅基地

文章浏览阅读1.3k次。在工作中,camera这一块上,可能会有各种各样的需求。比如有人想新增一个虚拟摄像头,当用户app打开摄像头设备时,打开的不是系统默认的camera hal代码,而是自己指定的代码,用自己事先准备好的视频数据,来喂给app;也有人想在系统默认的一套app框架上,新增一个外接的usbcamera,并且要能溶入到camera框架中。app只需要指定usbcamera的id,就能像打开普通摄像头那样,去打开我们的usbcamera;也有人,想在现有的框架上,同时兼容老的hal1+api1流程的androi..._android 8.1 camera

利用AD13设计PCB的问题总结1-10_ad13选择器件-程序员宅基地

文章浏览阅读1.2k次。利用AD13设计PCB问题总结1,PCB布线,不能有90度角,必须是45度或180度。2,根据项目的架构和功能,选择元器件的封装类型和电气特性。在画原理图的时候,必须要确定每个元器件的“封装类型”和“引脚标号”。_ad13选择器件

Win10+RTX3060配置CUDA等深度学习环境_wind10 cuda536 +3060-程序员宅基地

文章浏览阅读4.4w次,点赞47次,收藏390次。这里写目录标题1、下载准备2、下载安装Anaconda3、下载安装CUDA和CUDNN3.1 cuda和cudnn下载3.2 cuda和cudnn安装4、安装GPU版pytorch与TensorFlow4.1 下载4.2 安装1、下载准备 相关的安装包比如Anaconda、CUDA、CUDNN、Pytorch、TensorFlow等都可以在https://blog.csdn.net/weixin_43760844/article/details/113474_wind10 cuda536 +3060

分享多线程、线程池、hystrix_hystrix默认线程池是业务线程吗-程序员宅基地

文章浏览阅读588次。多线程的圣经:1、线程。1.1、我们的程序跑在哪个线程里?是怎样执行请求的?在不考虑自己写线程池的前提下。假如就是一句最普通的xxModel.setName(“xx");到底是运行在哪里的?我们找调用它的一条链,我相信总有一次调用,是你找不到的了。可能是controller,可能是dubbo,总而言之是别的框架,调进来的。这就是我总说的四大入口,controller,dubbo-server,mq-consumer和job。注意:这里正好能显现出来,dubbo-server是等着别人来调,du_hystrix默认线程池是业务线程吗

推荐文章

热门文章

相关标签