为什么我的矢量不能正确旋转 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 的数字,预期结果。
我正在尝试学习如何在 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 的数字,预期结果。