解构变换矩阵:如何使变换矩阵分解为位移(T),旋转(R),缩放(S)矩阵

article/2025/9/12 2:43:38

解构变换矩阵

 

给定一个转换的复合矩阵,关于组成该转换的任何单个转换的信息就会丢失。 我们如果有一个复合矩阵,怎么能使其分解为TRS三个矩阵呢?即如何完成下述变化:

其中M是给定的变换矩阵,T是平移矩阵,R是旋转矩阵,S是缩放矩阵。其中提取T矩阵使非常简单的。因为我们知道平移矩阵形式为:

所以我们可以通过M[0][3],M[1][3],M[2][3]来分别找到xyz的位移量。我们可以写出:

T->x = m.m[0][3];
T->y = m.m[1][3];
T->z = m.m[2][3];

我们的M矩阵删除掉平移的元素,就只剩下旋转和缩放了。因此在删除平移后,剩下的是上面的3*3矩阵,它们一起表示缩放和旋转。 该矩阵被复制到新矩阵M中以进行进一步处理:

//获取除去平移的新矩阵M
Matrix4x4 M = m;
for (int i = 0; i < 3; ++i)M.m[i][3] = M.m[3][i] = 0.0f;
M.m[3][3] = 1.0f;

接下来就是如何去获取旋转矩阵了。只要获得旋转矩阵,那么缩放矩阵也就可以直接通过:

计算得出。接下来,我们要提取M的纯旋转分量R。我们将使用一种称为"极分解(polar decomposition)"的技术来做到这一点。 可以证明,矩阵M的极分解可以分解为旋转R和缩放S。该方法通过对M的逆的转置进行连续平均来计算:

直到收敛,此时Mi = R。(很容易看出,如果M是纯旋转,则对其进行求逆再转置平均将使其保持不变,因为其逆等于其转置)。我们可以看旋转矩阵的形式:

因为旋转矩阵为正交阵,满足上述操作。Shoemake和Duff(1992)讨论了该级数收敛的证明,所得矩阵是最接近M的正交矩阵,这是理想的特性。为了计算该序列,我们迭代应用公式,直到连续项之间的差很小或执行了固定的迭代次数为止。 实际上,该系列通常会很快收敛。我们代码如下:

// 从M分离出RFloat norm;int count = 0;Matrix4x4 R = M;do {// 计算Mi+1Matrix4x4 Rnext;Matrix4x4 Rit = Inverse(Transpose(R));for (int i = 0; i < 4; ++i)for (int j = 0; j < 4; ++j)Rnext.m[i][j] = 0.5f * (R.m[i][j] + Rit.m[i][j]);// 计算Mi和Mi+1之间的差norm = 0;for (int i = 0; i < 3; ++i) {Float n = std::abs(R.m[i][0] - Rnext.m[i][0]) +std::abs(R.m[i][1] - Rnext.m[i][1]) +std::abs(R.m[i][2] - Rnext.m[i][2]);norm = std::max(norm, n);}R = Rnext;} while (++count < 100 && norm > .0001)//当迭代次数超过上限,或者连续项之间的差足够小,则退出循环;

获得R之后就可以轻松计算S:
 

*S = Matrix4x4::Mul(Inverse(R), M);

我们完整的解构代码如下:

void AnimatedTransform::Decompose(const Matrix4x4 &m, Vector3f *T,Quaternion *Rquat, Matrix4x4 *S) {// 获取平移TT->x = m.m[0][3];T->y = m.m[1][3];T->z = m.m[2][3];// 获取除去平移的新矩阵MMatrix4x4 M = m;for (int i = 0; i < 3; ++i) M.m[i][3] = M.m[3][i] = 0.f;M.m[3][3] = 1.f;// 从M分离出RFloat norm;int count = 0;Matrix4x4 R = M;do {// 计算Mi+1Matrix4x4 Rnext;Matrix4x4 Rit = Inverse(Transpose(R));for (int i = 0; i < 4; ++i)for (int j = 0; j < 4; ++j)Rnext.m[i][j] = 0.5f * (R.m[i][j] + Rit.m[i][j]);// 计算Mi和Mi+1之间的差norm = 0;for (int i = 0; i < 3; ++i) {Float n = std::abs(R.m[i][0] - Rnext.m[i][0]) +std::abs(R.m[i][1] - Rnext.m[i][1]) +std::abs(R.m[i][2] - Rnext.m[i][2]);norm = std::max(norm, n);}R = Rnext;} while (++count < 100 && norm > .0001)//当迭代次数超过上限,或者连续项之间的差足够小,则退出循环;// 获取旋转矩阵的四元数形式*Rquat = Quaternion(R);// 计算缩放矩阵S*S = Matrix4x4::Mul(Inverse(R), M);
}

 


http://chatgpt.dhexx.cn/article/M4IFZw6m.shtml

相关文章

SS2022-Z变换-性质-什么是z变换的时移特性?

简 介&#xff1a; 本文介绍了z变换时移特性。 关键词&#xff1a; z变换&#xff0c;时移特性 #mermaid-svg-EnOHOPxDmWhoesDM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EnOHOPxDmWhoesDM .error-icon{fill:#…

【转】传递函数中拉普拉斯变换的s是用来干什么的?

自控书里一上来就到处是s,这个s到底是个什么东西? 好我知道s是拉普拉斯变换出来的,但为什么要搞这样一个变换?这个s的物理意义是什么? 为什么传递函数的极点决定系统的性质? …… 要解答这些问题,首先要从拉普拉斯变换讲起。 -----------------------------------------…

S变换的Python代码

S变换的Python代码 S变换简介S变换Python程序 S变换简介 S变换&#xff0c;又称为Stockwell变换&#xff0c;由R. G. Stockwell于1996年提出。具体的定义如下&#xff1a; S变换在傅里叶域的表示形式为&#xff1a; 离散的S变换为&#xff1a; S变换克服了短时傅里叶变换固…

S变换画图

The S -transform with windows of arbitraryand varying shape 想画如上的三张图&#xff0c;可是问题 &#xff08;1&#xff09;滤波窗口的平滑实现 The filter (applied to the full 200£400 S-transform matrix)is constructed in Matlab by constructing a two-dime…

【广义S变换】一维广义S变换对非平稳信号处理的matlab仿真

1.软件版本 matlab2013b 2.本算法理论知识 参考文献: 《广义S变换时频分析的应用研究》 《时频分布与地震信号谱分析研究》 《非平稳信号广义S不变换及其在SAR图像分析中的应用研究》 《S变换时变滤波在去噪处理中的应用研究》 《广义S变换域时频特征分析及微弱目标检测…

频域/s域/z域三大变换的性质对比

本文主要介绍三大变换&#xff08;傅里叶变换、拉普拉斯变换及Z变换&#xff09;的性质对比及其常用信号变换。

S域到Z域变换和差分方程

1.s域的传递函数 G(s) 2 / (1500s 1) * exp(-100s) matlab 里面的命令是 sys tf(2,[1500,1],inputdelay,100) 得到 2 exp(-100*s) * ---------- 1500 s 1 2.求 Z域传递函数 dsy c2d(sys,10,z) % 10 为间隔采样时间 得到 0.01329 z^(…

matlab实现从s域变成z域、matlab实现长除法逆z变换实例

今天在复习微型计算机控制技术这门课时&#xff0c;感觉还是和当初学习时一样&#xff0c;计算量有点大。 主要是体现在&#xff1a;&#xff08;1&#xff09;、连续S域到离散Z域的变换。&#xff08;2&#xff09;、在画数字控制器和输出波形前对Y(z)和U(z)的长除法化简。 …

s域和z域变换笔记

连续函数 1、常见信号的拉普拉斯变换&#xff1a; 脉冲信号 δ&#xff08;t&#xff09;------------1 阶跃信号 μ&#xff08;t&#xff09;------------- 斜坡信号 t ------------------ 加速度信号 ---------------- 指数类信号 --------------- 正弦…

傅里叶变换(FS、FT、DTFT、DFT、DFS、FFT)、拉普拉斯变换和Z变换

傅里叶变换的目的&#xff1a;时域转为频域&#xff0c;滤波&#xff0c;求解微分方程等 1. FS&#xff08;Fourier Series&#xff09; 傅里叶级数&#xff1a;时域周期连续&#xff0c;频域离散。 前提&#xff1a;任何信号都可以看作是无限多的正弦波的叠加。 时域&#x…

Z变换

信号与系统的分析方法 可以分为两大类&#xff1a;时域分析和变换域分析 1.时域分析法&#xff1a; &#xff08;1&#xff09;连续时间信号与系统&#xff1a;信号的时域运算、分解&#xff0c;微分方程的经典解法&#xff1b;卷积积分 &#xff08;2&#xff09;离散时间…

matlab实现S域到Z域变换

传递函数如下: Z变换: 代码如下: %构造传递函数 h tf(10, [0.2 1 0]) %Z变换 zh c2d(h, 0.2,zoh) %得到分子分母系数 [num den] tfdata(zh, v) %得到零极点 [z, p, k] tf2zpk(num, den) 运行结果如下: h 10-----------0.2 s^2 sContinuous-time transfer functio…

S变换在特征提取中的使用

S变换 S变换采用高斯窗函数且窗宽与频率的倒数成正比&#xff0c;免去了窗函数的选择和改善了窗宽固定的缺陷&#xff0c;并且时频表示中各频率分量的相位谱与原始信号保持直接的联系&#xff0c;S变换具有良好的时频特性&#xff0c;适合用S变换对信号的一些时频与特征进行提取…

S变换

哈哈&#xff0c;这两天在整理时频分析的方法&#xff0c;大部分参考网上写的比较好的资料&#xff0c;浅显易懂&#xff0c;在这谢过各位大神了&#xff01; 今天准备写下S变换&#xff0c;由于网上资料较少&#xff0c;自己尝试总结下&#xff0c;学的不好&#xff0c;望各位…

S变化广义s变化和时频域特征-matlab

S变换(S-transform)最先出现是在1996年,由外国学者Stockwell提出,一般情况下,可以通俗的将S变换理解为小波变换和傅里叶变换的提升,充分弥补了傅里叶变换和小波变换所存在的不足之处,例如傅里叶变换的窗口尺度不可以随意改变,但是S变换就无此限制,与此同时,S变换还实…

S变换介绍(附代码)

1、S变换 作为小波变换和短时傅里叶变换的继承和发展&#xff0c; S 变换采用高斯窗函数且窗宽与频率的倒数成正比&#xff0c;免去了窗函数的选择和改善了窗宽固定的缺陷&#xff0c;并且时频表示中各频率分量的相位谱与原始信号保持直接的联系&#xff0c;使其在 PQD 分析中可…

S(Stockwell)变换的Matlab代码

S变换的Matlab代码 S变换简介Stockwell版S变换程序Dash版S变换程序博主自己编写的S变换主函数仿真结果 S变换简介 S变换&#xff0c;又称为Stockwell变换&#xff0c;由R. G. Stockwell于1996年提出。具体的定义如下&#xff1a; S变换在傅里叶域的表示形式为&#xff1a; 离…

如何进行支付功能的测试

非现金支付时代&#xff0c;非现金支付已经成为了生活不可或缺的一部分&#xff0c;我们只需要一台手机便可走遍全国各地&#xff08;前提是支付宝&#xff0c;微信有钱<00>&#xff09;,那么作为测试人员&#xff0c;支付测试也是非常重要的一环&#xff0c;那么下面我就…

Wireshark对京东网站进行抓包

Wireshark对京东网站进行抓包 一、首先获取京东IP地址 二、写捕获器筛选条件抓包 1、设置捕获过滤器的host为自己主机IP和目的地址IP 开始抓包 在浏览器中打开京东&#xff0c;点击京东上物品信息&#xff0c;Wireshark就会抓取 抓包结束&#xff0c;保存pcap文件。 解析出cs…

支付宝、京东支付场景之策略模式实战

我是「猿码天地」&#xff0c;一个热爱技术、热爱编程的IT猿。技术是开源的&#xff0c;知识是共享的&#xff01; 写作是对自己学习的总结和记录&#xff0c;如果您对 Java、分布式、微服务、中间件、Spring Boot、Spring Cloud等技术感兴趣&#xff0c;可以关注我的动态&…