【问题标题】:Why does my vector not rotate correctly OpenGL/GLM?为什么我的矢量不能正确旋转 OpenGL/GLM?
【发布时间】:2016-06-22 05:47:21
【问题描述】:

我正在尝试学习如何在 OpenGL 中对 3d 点进行一些转换。使用this cheat sheet 我相信我有正确的矩阵来乘以我想要旋转的向量。但是,当我乘以并打印新坐标时,我认为它是不正确的。 (旋转 1,0,0 90deg cc 应该会导致 0,1,0 正确?)为什么这不起作用?

我的代码:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f); 
glm::mat4 trans = {
    1.0f, 0.0f, 0.0f, 0.0f,
    0.0f, cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f,
    0.0f, sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0,
    0.0f, 0.0f, 0.0f, 1.0f 
};
vec = trans * vec; //I should get 0.0, 1.0, 0.0 right?
std::cout << vec.x << ", " << vec.y << ", " << vec.z << std::endl;

上面打印1.0, 0.0, 0.0表示完全没有变化?

我还尝试使用 GLM 中的 rotate 函数来生成我的矩阵,而不是手动指定,但我仍然没有得到我认为应该正确的结果(我得到了不同的错误答案)。

glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0));  //EDIT: my bad, should've been z axis not x, still not working

以上打印:-2.14..e+08, -2.14..e+08, -2.14..e+08

(PS:我上一学年刚学过几何学,如果数学不正确,我深表歉意。我对矩阵和矩阵乘法有基本的了解,我今天学习 OpenGL 转换,但除此之外,我是在这方面有点菜鸟)

【问题讨论】:

  • 如果输入为 (1,0,0,1),输出应为 (0,1,0,1),则旋转应围绕 Z 轴。
  • @HannesHauptmann 好的,我尝试进行更改,但仍然没有返回正确答案glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0));
  • 在左侧您可以看到 OpenGL 如何处理它。我是 100% 这是围绕 Z 轴的旋转 :)
  • @HannesHauptmann 你是对的,我敢肯定。我可能只是搞混了。但是我试了Z轴还是不行?
  • 我目前正在检查 glm 规范,我之前从未使用过 GLM ^^

标签: c++ opengl matrix glm-math


【解决方案1】:

在您的代码中,您在 x 轴上旋转一个单位向量 围绕 x 轴,这不会改变矢量(想象 围绕它自己旋转一支铅笔,方向根本不会改变)。

要达到您之前想要的效果,您应该旋转 使用如下矩阵围绕 z 轴的向量:

glm::mat4 trans = {
    cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f, 0.0f,
    sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 1.0f
};

除此之外,glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0)); 没有返回所需的结果,因为在将 trans 传递给 glm::rotate 之前需要对其进行初始化。试试这样写:

glm::mat4 trans; // Default constructor called, trans is an identity matrix
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));

不过,由于使用 glm::radians 和 cos/sen 时的精度损失,您可能无法获得预期的矢量(0.0f、1.0f、0.0f)。在我的测试中,我得到了向量 (-4.37113883e-008f, 1.0f, 0.0f) 和 -4.37113883e-008 实际上是 -0.0000000437113883,这是一个非常接近于 0 的数字,这是预期的结果。

【讨论】:

  • 啊,谢谢琼。这也是@HannesHauptmann 告诉我的。
  • 我认为我对 rotate() 命令感到困惑的原因是因为我习惯了 java。我没有意识到 mat4 是一个 obj(因为它不是以大写字母开头),而且我从未意识到它是用构造函数初始化的(因为在 java 中你会使用 new 然后显式调用构造函数)。看,这就是 C++ 让我困惑的原因,哈哈
【解决方案2】:

您自己的旋转矩阵不改变输入的原因很简单:您的旋转只影响 y 和 z 坐标,由于它们为零,因此结果与输入完全相同。 X 坐标在输出 x 坐标中乘以 1,因此保持不变。

例如,您可以制作矢量1.0, 2.0, 3.0, 1.0,然后您将看到更改。

至于 glm 版本,不能说为什么它会给出奇怪的结果,我从来没有遇到过问题,但没有使用太多。

【讨论】:

  • 感谢萨米的快速回答。 +1,因为这有帮助。我接受了 Jean 的,因为它有更多信息(解释了为什么 rotate() )命令不起作用。希望你不要介意。
猜你喜欢
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多