glm-math - 为什么 OpenGL 转换顺序与代码中写的相反?
问题描述
在上一个问题中,我对构建最终变换矩阵的乘法顺序感到困惑,但我没有清楚地描述这个问题。所以我在这里创建一个新问题。
作者说:
在这里,我们首先围绕原点 (0,0,0) 旋转容器,一旦旋转,我们将其旋转后的版本平移到屏幕的右下角。请记住,实际的变换顺序应该相反:即使在代码中我们先平移然后旋转,实际的变换首先应用旋转然后平移。
那么,为什么实际的转换顺序是以相反的顺序应用的呢?
我在网上搜索过,发现在某个地方提到过这个问题,比如 这个演讲03幻灯片的第16页和这个讲座的第12页,但他们都没有描述背后的原因
解决方案
通常,这些操作是通过在模型视图矩阵上对给定的变换矩阵进行右乘来定义的(例如,MV * T,其中 MV 是模型视图矩阵,T 是所讨论的变换)。
在变换链的末端,几何向量在矩阵变换的累积集合上隐式右乘(例如 MV * T1 * T2 * T3 * x,其中 T1、T2 和 T3 是变换(通常 T1 = translate,T2 =旋转,T3 = 比例),x 是任何几何矢量)。因此,最后应用的变换实际上首先接触几何矢量(例如 T3 * x)。它被有效地分组为 (MV * (T1 * (T2 * (T3 * x)))),但当然它等价于 ((((MV * T1) * T2) * T3) * x),因为矩阵乘法是关联的.
推荐阅读
- java - 在 else 子句中分组,火花 java
- bash - 禁用 shell 脚本的控制台弹出窗口
- reactjs - 你甚至如何在 React 中使用 ant design 的 ConfigProvider?
- python - pygame健康显示问题
- python - Sphinx 文档创建期间的扩展错误
- excel - 计算数组中的匹配,重复一次
- godot - 标识符未在 godot 的当前范围内声明
- javascript - 在不使用 startDate 和 endDate 的情况下禁用引导日期选择器中的未来日期
- ios - 在 Xcode 13 [[UINavigationBar 外观] setBarTintColor: 无法正常工作?
- c# - C# 创建 Active Directory 用户 - 异常未知错误 (0x80005000)