空间变换与计算_04_4x4矩阵
六自由度:
在了解了3x3矩阵能够代三维空间的表旋转后,下面介绍4x4矩阵中每行每列所代表三维空间的含义。
在虚拟现实、3D游戏中,仅仅能够三个自由度地旋转是不够的,在通常认识的三维空间中,自由物体总共有六个自由度:沿XYZ三个坐标轴的移动、绕XYZ三轴的旋转。3x3矩阵能够到表空间旋转信息,因此,我们还需要移动位置信息。
通常,位置信息可以使用point代表,因此,理论上,我们可以使用point中的xyz代表物体的空间位置,用3x3的矩阵道标物体的姿态,就能够将物体的空间六自由度完全表述清楚。当然,也可以用四元数和点两部分来表示。
但是,计算相对变得复杂,例如:当我们计算物体绕自己的XYZ中的某个轴旋转时,可以直接使用3x3矩阵或者四元数旋转即可,位置是不会变化的,但当我们需要物体沿着世界坐标的轴、其他定义的轴旋转时,物体在世界中不仅仅姿态会发生变化,位置也会发生变化。
4x4矩阵刚好就能解决这一问题,直接通过4x4矩阵的线性代数运算,就能表达物体的姿态和位置。
Matrix4x4:
在4x4矩阵中,总共时16个浮点数,默认的单位矩阵如下图:
若仅用于空间计算,则只看矩阵的前三行即可,第一列的(1,0,0)代表X轴,第二列的(0,1,0)代表Y轴,第三列的(0,0,1)代表Z轴,第四列的(0,0,0)代表空间位置。此外,第四行永远为(0,0,0,1)。
代码解析部分:
4x4矩阵的构造函数和析构函数如下:
/// constructor, unit matrix default.matrix4x4();/// construct from another matrix4x4.matrix4x4(const matrix4x4& mat);/// move constructor.matrix4x4(matrix4x4&& mat) noexcept;/// construct from pointer, there must be sixteen values.matrix4x4(const real* data);/// destructor.virtual ~matrix4x4();
其他计算函数:
public:/// print on console.void print() const;/// is real, is available.bool isReal();/// set rotate form x and y axis, calculate z axis automatically.void rotateFromXYAxis(const vector& vecX, const vector& vecY);/// set rotate from z axis, x and y are random, normalized vector.void rotateFromZAxis(const vector& vecZ);/// set rotate form matrix3x3.void rotateFromMatrix3x3(const matrix3x3& mat);/// set rotate form quaternion.void rotateFromQuaternion(const quaternion& q);/// set position form point.void positionFromPoint(const point& pt);/// set position form data.void positionFromData(const real x, const real y, const real z);/// get rotate from matrix4x4.[[nodiscard]] matrix3x3 getRotate() const;/// get position from matrix4x4.[[nodiscard]] point getPosition();/// zero all data.void zero();/// convert to unit matrix.void identity();/// convert to invert matrix.void invert();/// convert to transpose matrix.void transpose();/// *this *= mat, save in this.void multiplied(const matrix4x4& mat);/// mat *= *this, save in this.void preMultiplied(const matrix4x4& mat);/// return *this * mat, non change in *this.[[nodiscard]] matrix4x4 multiply(const matrix4x4& mat) const;/// return mat * *this, non change in *this.[[nodiscard]] matrix4x4 preMultiply(const matrix4x4& mat) const;/// return *this * pt, non change in *this.[[nodiscard]] point multiply(const point& pt) const;/// return *this * vec, non change in *this.[[nodiscard]] vector multiply(const vector& vec) const;/// retuan determinate.real determinate() const;/// rotate around axisvoid rotateAxis(const real radians, const vector& vec);/// rotate around axisvoid rotateAxis(const real radians, Axis axis);/// rotate around self axisvoid rotateSelfAxis(const real radians, Axis axis);/// rotate around self axisvoid rotateSelfAxis(const real radians, const vector& vec);
大部分函数和Matrix3x3基本一样,不做介绍。
测试:
一、构造函数和析构函数部分:
qytk::matrix4x4 mat0;mat0.print();qytk::matrix4x4 mat1(mat0);mat1.print();double d[16]{0,-1,0,0,1,0,0,0,0,0,1,0,0,0,0,1};qytk::matrix4x4 mat2(d);mat2.print();
运行结果均为默认的单位矩阵,如下图:
对于空间数据的赋值与计算,例如:
qytk::matrix3x3 mat3x3;mat3x3.rotateSelfAxis(PI / 2, qytk::Axis::X);mat4.rotateFromMatrix3x3(mat3x3);mat4.print();qytk::quaternion q0;q0.rotateAxis(PI / 2, qytk::Axis::Z);mat4.rotateFromQuaternion(q0);mat4.print();
mat4的旋转部分来源于mat3x3,可以看出,mat3x3是在世界坐标原点的基础上绕X轴旋转90度得到的,结果如下:
可以看出,矩阵所代表的空间X轴时没有变化的,Y轴与最开始的Z轴重合,Z轴变为与最开始的-Y轴重合了,这符合我们的认知,计算式正确的。从第二部分代码的四元数计算中,可以看出,结果也是完全吻合的。
矩阵的旋转数据除了通过设置3x3矩阵、四元数之外,还能够通过设置XY轴、Z轴实现,如下:
mat5.identity();mat5.rotateFromZAxis(vec1);mat5.print();mat5.transpose();mat5.print();mat5.identity();mat5.rotateFromXYAxis(vec0, vec1);mat5.multiplied(mat5);mat5.print();
需要特别注意的是,设置XY轴时,需要自己保证XY轴时正确的,相互垂直的,程序会自动计算Z轴。在通过Z轴设置旋转数据时,程序随机生成姿态的XY轴。
总结:
4x4的矩阵可用于表示三维空间的姿态、位置等信息,在空间计算中,既可以平移也可以旋转,同时,可以旋转旋转的轴位自身或者其他任何轴。为了更方便地进行空间计算,后续抽象出Transform类专门用于空间六自由度的运算。
qySpace下载地址(github):qySpace
qySpace下载地址(csdn):qySpace
空间变换与计算_04_4x4矩阵相关推荐
- 形象理解线性代数(三)——列空间、零空间(核)、值域、特征值(特征向量)、矩阵与空间变换、矩阵的秩
这里,我们还是要以 形象理解线性代数(一)--什么是线性变换?为基础.矩阵对向量的作用,可以理解为线性变换,同时也可以理解为空间的变换,即(m*n)的矩阵会把一个向量从m维空间变换到n维空间. 一.矩 ...
- DirectX 11---从空间变换来看3D场景如何转化到2D屏幕
DirectX 11---从空间变换来看3D场景如何转化到2D屏幕 在看<Introduction to 3D Game Programming with DirectX 11>的时候,发 ...
- ker矩阵是什么意思_矩阵分析(一):空间变换与基变换
"在这个小测验里,我让你们求一个2*3矩阵的行列式.让我感到非常可笑的是,你们当中竟然有人尝试去做."(摘自http://mathprofessorquotes.com,作者佚名) ...
- Unity Shader入门精要笔记(四):矩阵与空间变换
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/73612170 上一篇我们学习 ...
- Opencv——几何空间变换(仿射变换和投影变换)
几何空间变换 [1]几何变换(空间变换)简述 [2]变换矩阵知识简述 齐次坐标的概念 几何运算矩阵 [3]图像的仿射变换 1.平移变换 2.比例缩放 3.旋转 4.对称变换(不做展示) 1.关于X轴变 ...
- OpenCV之灰度空间变换
OpenCV入门之灰度空间变换 本系列博客主要以数字图像处理第三版为算法基础,以OpenCV为工具进行图像处理基础知识的分享.该教材的前两张基础知识这里不详述,有需要的读者自行查阅.本篇博客介绍第三章 ...
- 土圭垚㙓数学课(四)空间变换
我曾经在Shader山下(十六)坐标空间与转换矩阵中介绍过,一个物体要显示在平面上,需要经过四步空间变换(实际上是五步): 物体空间->世界空间->观察空间->裁剪空间(->归 ...
- 点的空间变换与坐标系的空间变换
博主小白,分享一下自己对于点变换和坐标系变换的理解,不对的地方请大家指出~ 目录 坐标系变换 点变换 KITTI数据集中的坐标系关系 参考 坐标系变换 以最简单的坐标系变换为例,如下图 图中有两个坐标 ...
- 使用eigen库进行空间变换
使用eigen库进行空间变换 在三维空间中,常常需要变换当前机器人的位姿计算定义的绝对坐标系和当前机器人所处相对坐标系之间的关系.而主要的变换则是平移和旋转,有时候可能需要尺度变换,那么就可以描述为: ...
- 图像坐标空间变换:透视变换(Perspective Transformation),或称为单应性(Homography)变换
文章目录 透视变换简介 预备知识 透视变换公式推导 投影 二维坐标向齐次坐标的变换 公式求解 例子:A4纸视角校正 原始图片和坐标变换模板 计算程序 结果 透视变换的限制 前向映射与后向映射矩阵不互逆 ...
最新文章
- Visdom数据可视化工具绘制Loss曲线
- 马云缺席的一个半小时,李彦宏和马化腾都聊了什么
- 语音控制面板 通过linux_在Linux中,通常把设备作为( )来处理.
- Frequency 频率统计
- JavaFX鼠标点击事件
- ExecuteScalar
- 深入了解Struts2返回JSON数据的原理及具体应用范例
- ADO编程中ATL所遇到的定义问题
- 苹果全新10.2英寸iPad再爆实锤 或造成史上最乱的iPad产品线
- mysql 多个网卡_seriver -- 多个网卡只能认到一个网卡的解决方法
- 119. PHP 性能问题(2)
- 51单片机12864的使用方法
- Neo4j的下载与安装
- 安装ADB Interface驱动
- unity读取Json文件
- Vue.js快速原型开发问题汇总
- CodeForces703D Mishka and Interesting sum(树状数组)
- layui表格工具条
- 软件工程第三章节结构化方法
- Linux下如何正确停止重启启动redis服务
热门文章
- DeepFake捏脸真假难辨,汤姆·克鲁斯比本人还像本人!
- Python编写微信打飞机小游戏(四)
- HeadFirstJava——11_异常处理
- DataDictionaryTool 一款生成数据库字典工具支持mysql和oracle
- java计算交点高程_卡西欧9860CG20图形计算程序(直线相交求交点坐标程序、距离后方交会带高程程序)...
- HTML5期末大作业:家具家居网站设计——智能家居(10页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 学生静态网页制作...
- Qt安卓开发环境搭建
- 如何下载百度文库文章
- 计算机excel2010完整教程视频,刘伟公益课-Excel2010基础大全(1-66集)视频教程-高清版...
- javaMD5加密生成key方法