为什么我的矢量不能正确旋转 OpenGL/GLM?

Why does my vector not rotate correctly OpenGL/GLM?

我正在尝试学习如何在 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 变换而学习的,但是除此之外,我在这方面有点菜鸟)

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

例如,您可以制作矢量 1.0, 2.0, 3.0, 1.0,然后您会看到变化。

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

在您的代码中,您在 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)); 没有返回所需的结果,因为在将其传递给 glm::rotate 之前需要初始化 trans。试试这样写:

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 的数字,预期结果。