c++ - OpenGL - 从矩阵 4x4 本地向上和向右?
问题描述
我有一个按以下方式构建的变换矩阵 4x4:
glm::mat4 matrix;
glm::quat orientation = toQuaternion(rotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::translate(matrix, position);
matrix= glm::scale(matrix, scale);
orientation = toQuaternion(localRotation);
matrix*= glm::mat4_cast(orientation);
matrix= glm::scale(matrix, localScale);
其中rotation、position、scale、localRotation和localScale都是vector3。根据许多不同论坛上许多不同问题的建议,应该可以从结果矩阵中找出本地方向,如下所示:
right = glm::vec3(matrix[0][0], matrix[0][1], matrix[0][2]);
up = glm::vec3(matrix[1][0], matrix[1][1], matrix[1][2]);
forward = glm::vec3(matrix[2][0], matrix[2][1], matrix[2][2]);
所有这些方向都被归一化。然后我使用这些方向来获得一个视图矩阵,如下所示:
glm::lookAt(position, position + forward, up);
一切都很好——除了:当我在一个场景中飞行时,右向量和上向量是完全错误的。前进的方向总是完全正确的。当我在 0, 0, -1 看着 0,0,0 时,所有方向都是正确的。但是当我从不同的方向看时(除了从 0,0,-1 看原点的倒数),右和上是不一致的。它们不是世界向量,也不是局部向量。它们似乎几乎是随机的。我哪里错了?如何从 4x4 变换矩阵中获得一致的局部向上和局部右向量?
解决方案
matrix
是局部到世界的变换,而视图矩阵是世界到局部的,这意味着在这种情况下matrix
是视图矩阵的逆矩阵。您当前拥有的代码仅适用于视图矩阵。只需交换行和列:
right = glm::vec3(matrix[0][0], matrix[1][0], matrix[2][0]);
up = glm::vec3(matrix[0][1], matrix[1][1], matrix[2][1]);
forward = glm::vec3(matrix[0][2], matrix[1][2], matrix[2][2]);
它起作用的一个可能原因(0, -1, 0)
是视图矩阵的旋转/缩放部分如下所示:
1 0 0
0 0 1
0 1 0
的对应部分matrix
是上面的逆,当然是相同的。换个方向试试。
推荐阅读
- django - 如何将当前活动用户作为外键添加到 djangorestframework 中的创建帖子模型?
- docker - 从 docker 容器中代理后面的 minikube VM 内部连接到外部网络
- mysql - 从右连接表中获取所有行
- postgresql - postgresql 替换存储函数变量的符号?
- python - Python 3.9 Pygame 混频器频率更改不起作用
- python - 在 Pandas 数据框中为其查找特定的字符串和值
- python - 如果 python 烧瓶应用程序在 apache2 mod_wsgi 下运行,则无法写入日志文件
- reactjs - 如何管理托管在 Firebase 上的 React 应用程序的缓存行为
- html - 如何在 CSS 中输入具有多个类的类
- python - Apache2 和 Flask 问题