matrix - 多剪切矩阵作为旋转、非均匀比例和旋转的组合?
问题描述
我试图弄清楚如何仅使用平移、旋转和非均匀缩放来获得任意仿射 3D 矩阵的等价物。
处理剪切是棘手的部分。单个剪切变换可以表示为旋转、非均匀比例和旋转的组合,如下所述: 剪切矩阵作为基本变换的组合?
但是,对于 3D,可以同时在多个平面上进行剪切;例如 XY、XZ 和 YZ。虽然我可以用旋转、缩放、旋转来表达每一个,但总共需要 6 次旋转和 3 次缩放操作。我有一种直觉,所有的剪切都可以通过一次旋转、非均匀比例和旋转一次处理,但所涉及的数学问题超出了我的想象。
在查看任意仿射矩阵时,我不确定什么构成剪切与旋转(我认为对于如何拆分它有无限的解决方案?)所以我想解决“沿多个平面的任意共享”的问题与解决相同一般仅适用于仿射矩阵(无翻译)。无论哪种方式,任何可以帮助我的事情都会受到赞赏。
解决方案
一个(完整的)SVD 让你接近。这给出了,对于 3x3 矩阵 A
A = U*S*V'
其中所有矩阵都是 3x3,S 是对角线,U 和 V 是正交的。不幸的是,U 和 V 可能不是旋转,也就是说,它们可能具有行列式 -1。
一种方法是计算 U 的行列式,如果它是-1,则将其替换为
U~ = U * diag(-1,1,1) (ie negate the first col of U)
并将 S 替换为
S~ = S*diag( -1, 1, 1) (ie negate the top left elt of S)
然后对于 V 类似(尽管现在,由于转置,您想否定 V 的第一行)
推荐阅读
- c# - 如何通过 C# 检查重音字符
- c# - 返回 lambda 中的所有字段、分组和聚合函数
- makefile - makefile 错误:“make: *** No rule to make target …”
- flutter - 如何在 Flutter/Dart 中声明可变对象?
- r - 在 R 中生成给定百分比的删失数据
- python - 如何根据熊猫中的列值生成字符串
- c# - CsvHelper : 写作清单
转为 CSV - mongodb - 从集合中获取 N 个最新的不同记录 [Mongodb]
- c# - 无法使用 ASP.NET Core 标识从基于角色的 HttpGet 请求中列出数据
- ansible - 在 Ansible 中,如何将现有行移动到文件末尾?