graphics - 为什么缩放和平移的顺序对模型矩阵很重要?
问题描述
我正在尝试创建一个模型矩阵,并意识到缩放和平移的操作顺序很重要。我将 Qt 用于我的矩阵并使用 QMatrix4x4 并使用 openGL(但这应该与库和平台无关,并且与数学有关)。缩小模型然后翻译它的结果只能按预期工作,就像这样。
QMatrix4x4 model;
model.translate(some_vec3d);
model.scale(some_vec3d);
我的印象是,在数学上,由于比例出现在矩阵的前 3x3 中,并且平移只影响矩阵的最后一列(第 4 列),因此顺序是独立的。当我查看矩阵时,我明白顺序很重要,但我不明白为什么。
解决方案
考虑:
- 模型中的顶点
p
- 比例矩阵
S
T
位移向量的平移矩阵t
通过应用获得的变换点:
Translation first:
S * T * p = S * (p + t)
= S * p + S * t
----- <---
Scaling first:
T * S * p = S * p + t
- <---
矩阵乘法中说明的差异:
Translation first:
| Sx 0 0 0 | | 1 0 0 Tx | | Sx 0 0 Sx * Tx |
| 0 Sy 0 0 | * | 0 1 0 Ty | = | 0 Sy 0 Sy * Ty |
| 0 0 Sz 0 | | 0 0 1 Tz | | 0 0 Sz Sz * Tz |
| 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 |
Scaling first:
| 1 0 0 Tx | | Sx 0 0 0 | | Sx 0 0 Tx |
| 0 1 0 Ty | * | 0 Sy 0 0 | = | 0 Sy 0 Ty |
| 0 0 1 Tz | | 0 0 Sz 0 | | 0 0 Sz Tz |
| 0 0 0 1 | | 0 0 0 1 | | 0 0 0 1 |
推荐阅读
- html - 响应式缩放绝对定位的元素
- jquery - 有没有办法旋转 HTML 选择框的内容?
- unreal-engine4 - 为多个网格创建通用蓝图
- reactjs - 在 Sagas 测试中没有调用我的模拟函数
- regex - 用于基于多个值进行过滤的正则表达式
- python - Cocotb 协程从未调用过
- python - 高效查询多列 SQLAlchemy ORM
- windows - 在 PowerShell 中重命名文件夹中的文件
- android - 具有第三方库的动态功能,其清单中有一个带有自定义主题的活动 - 找不到资源
- testing - RobotFramework 使用 robotframework-imaplibrary2 打开电子邮件链接