旋转矩阵(Rotation Matrix)的推导及其应用

简介: 向量的平移,比较简单。   缩放也较为简单   矩阵如何进行计算呢?之前的文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘。在谷歌图片搜索旋转矩阵时,看到这张动图,觉得表述的很清晰了。     稍微复杂一点的是旋转,如果只是二维也很简单(因为很直观),但因为是三维的,有xyz三个轴,先推导二维的再延伸到三维。

向量的平移,比较简单。

向量平移的图片搜索结果

 

缩放也较为简单

向量平移的图片搜索结果

 

矩阵如何进行计算呢?之前的文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘。在谷歌图片搜索旋转矩阵时,看到这张动图,觉得表述的很清晰了。

rotation matrix animation的图片搜索结果

 

 

稍微复杂一点的是旋转,如果只是二维也很简单(因为很直观),但因为是三维的,有xyz三个轴,先推导二维的再延伸到三维。

YouTube上有很好的推导过程,视频链接地址(需穿.墙) https://www.youtube.com/watch?v=8XRvpDhTJpw

 

有点P(Xa,Ya),当坐标由 x –> y 旋转 θ 度后,求该点在新坐标轴的坐标是多少

image

image

image

image

所以对于二维旋转来讲,旋转矩阵就是

image

三维旋转,需要先搞清楚正、负方向(使用的是右手法则,在二维平面增加一维z,它的正方向朝向屏幕外)。

 

绕x轴进行旋转(在yz平面顺时针旋转)

XAxis

[1 0 0; 0 cosalpha sinalpha; 0 -sinalpha cosalpha]

 

绕y轴进行旋转(在zx平面顺时针旋转)

YAxis

[cosbeta 0 -sinbeta; 0 1 0; sinbeta 0 cosbeta]

 

绕z轴进行旋转(在xy平面顺时针旋转)

ZAxis

[cosgamma singamma 0; -singamma cosgamma 0; 0 0 1]

 

— 图片来源:http://mathworld.wolfram.com/RotationMatrix.html

参考:https://zh.wikipedia.org/wiki/旋转矩阵

 

 

了解这些有什么用处呢?之前有讲到渲染被分为三个阶段:应用 –> 几何 –> 栅格化,其中几何阶段做了大量的变换工作。

模型空间 –>( 模型矩阵) –> 世界空间 –> (视图矩阵) –> 观察空间(摄像机,右手坐标系,其余均采用左手) –> (投影矩阵) –> 裁剪空间 –> 屏幕空间,每一次变换都对应着相应的矩阵。

8c3cf1f1d289e81671ac76b6aa5b9aa6_thumb

 

190824532

而Unity中的 UNITY_MATRIX_MVP 矩阵表示的是从模型到裁剪坐标的矩阵变换,Model Matrix ● View Matrix ● Projection Matrix。在Unity2017中使用 UnityObjectToClipPos 进行了替换,MVP也即是 模型(M)、视图(V)、透视(P)三个单词的首字母简写。

 

了解上面这些,才更容易理解Unity内置的变换矩阵

变量名

描述

UNITY_MATRIX_MVP 当前的模型观察投影矩阵,用于将顶点/方向矢量从模型空间变换到裁剪空间
UNITY_MATRIX_MV 当前的模型观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间
UNITY_MATRIX_V 当前的观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间
UNITY_MATRIX_P 当前的投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间
UNITY_MATRIX_VP 当前的观察投影矩阵,用于将顶点/方向矢量从世界空间变换到裁剪空间
UNITY_MATRIX_T_MV UNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MV UNITY_MATRIX_MV人逆转置矩阵,用于将法线从模型空间变换到观察空间,也可以用于得到UNITY_MATRIX_MV的逆矩阵
_Object2World 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间(依上面规则,这个其实相当于UNITY_MATRIX_M  即模型空间 –> 世界空间)
_World2Object _Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间

 

对照下面这张图,更容易理解一些。

 

上面这些是基础,只有掌握这些之后,再配置切线、法线、光照模型,在写顶点着色器(Vertex Shader)的时候才不至于懞圈 微笑

目录
相关文章
|
安全 调度 虚拟化
阿里云郑晓:浅谈GPU虚拟化技术(第三章)
本系列文章推送门: 阿里云郑晓:浅谈GPU虚拟化技术(第一章) GPU虚拟化发展史 阿里云郑晓:浅谈GPU虚拟化技术(第二章)GPU虚拟化方案之——GPU直通模式  今天一个小伙伴@我说:“你浅谈一下,没点技术背景的,估计都看不懂…”,醍醐灌顶啊,面向公众的文章不是学术论文,应以普及基本概念为主。
21064 1
|
7月前
|
人工智能 安全 API
|
存储 前端开发 PHP
构建一个简单的网站,包括用户注册、登录功能
构建一个简单的网站,包括用户注册、登录功能
1629 1
|
数据可视化 Python
Visdom可视化学习笔记(一):通过visdom画曲线和显示图片总结
关于如何使用Visdom进行数据可视化的教程,包括画曲线、显示图片和文本等操作。
641 0
Visdom可视化学习笔记(一):通过visdom画曲线和显示图片总结
|
算法 机器人 数据安全/隐私保护
四自由度SCARA机器人的运动学和动力学matlab建模与仿真
本课题深入研究SCARA机器人系统,提出其动力学与运动学模型,并基于MATLAB Robotics Toolbox建立四自由度SCARA机器人仿真对象。通过理论结合仿真实验,实现了运动学正解、逆解及轨迹规划等功能,完成系统实验和算法验证。SCARA机器人以其平面关节结构实现快速定位与装配,在自动生产线中广泛应用,尤其在电子和汽车行业表现优异。使用D-H参数法进行结构建模,推导末端执行器的位姿,建立了机器人的运动学方程。
|
数据采集 机器学习/深度学习 Java
Java 大视界 -- Java 大数据在智能体育赛事运动员体能监测与训练计划调整中的应用(200)
本篇文章聚焦 Java 大数据在智能体育赛事中对运动员体能监测与训练计划的智能化应用。通过构建实时数据采集与分析系统,结合机器学习模型,实现对运动员体能状态的精准评估与训练方案的动态优化,推动体育训练迈向科学化、个性化新高度。
|
人工智能 JavaScript 前端开发
【HarmonyOS NEXT+AI】问答04:仓颉编程语言适合毕业设计吗?
本文探讨了仓颉编程语言是否适合用于毕业设计的问题。仓颉编程语言虽小众,但具备独特性与创新性,可开发鸿蒙应用及AI大模型应用,具有前瞻性。其语法与主流语言类似,易于上手,且有丰富课程支持学习。若时间充裕并结合相关主题,使用仓颉语言能让毕业设计在答辩中脱颖而出。同时,文章还介绍了毕业设计答辩的时间安排,帮助学生合理规划。
678 3
【HarmonyOS NEXT+AI】问答04:仓颉编程语言适合毕业设计吗?
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
798 9
|
安全 Linux 测试技术
OS 升级迭代与向前向后兼容问题
本次分享的主题是OS 升级迭代与向前向后兼容问题,由中科方德内核研发工程师李力琼分享。主要分为四个部分: 1. OS更新的兼容性问题 2. 内核API向后兼容 3. 内核API向前兼容 4. 内核API的修改
722 2
|
自然语言处理 算法 数据可视化
《一文吃透!NLTK与SpaCy,自然语言处理的神兵利器》
在自然语言处理(NLP)领域,NLTK和SpaCy是Python中两大利器。NLTK功能全面、语料库丰富,适合学术研究与教学;SpaCy则以高效、准确和易用性著称,专为工业级应用设计。两者各有所长,可根据需求选择或结合使用,助力开发者实现强大的NLP功能。
845 9

热门文章

最新文章