首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL -从矩阵4x4向上和右转?

OpenGL -从矩阵4x4向上和右转?
EN

Stack Overflow用户
提问于 2018-04-28 22:05:43
回答 1查看 2.2K关注 0票数 4

我有一个转换矩阵4x4,其构建方式如下:

代码语言:javascript
运行
复制
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);

如果旋转、位置、比例尺、localRotation和localScale都是矢量3。根据许多不同论坛上许多不同问题的建议,应该可以从产生的矩阵中提取出局部方向,如下所示:

代码语言:javascript
运行
复制
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]);

所有这些方向都是标准化的。然后,我使用这些方向获得如下视图矩阵:

代码语言:javascript
运行
复制
glm::lookAt(position, position + forward, up);

这一切都很好--除了:当我在一个场景中飞行时,正确的和向上的向量是完全错误的。前进的方向总是完全正确的。当我在0,0,-1的时候,所有的方向都是正确的。但是当我向不同的方向看(除了从0,0,-1看原点的逆),右和向上是不一致的。它们不是世界向量,也不是局部矢量。它们看起来几乎是随机的。我哪里出问题了?如何从4x4变换矩阵中得到一致的局部向上向量和局部右向量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-28 23:31:05

matrix是一个局部到世界的转换,而视图矩阵是从世界到局部的,这意味着在这种情况下,matrix是视图矩阵的逆。您当前拥有的代码仅适用于视图矩阵。只需交换行和列:

代码语言:javascript
运行
复制
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)的一个可能原因是视图矩阵的旋转/缩放部分看起来如下:

代码语言:javascript
运行
复制
1 0 0
0 0 1
0 1 0

matrix的对应部分与上面的相反,这当然是相同的。用另一个方向试试。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50081475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档