我正在尝试学习如何在OpenGL中对3d点进行一些转换。使用this cheat sheet我相信我有正确的矩阵乘以我想要旋转的向量。但是,当我繁殖并打印新的coord时,我认为它是不正确的。 (旋转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变换,但除此之外我就是这是一个菜鸟
答案 0 :(得分:4)
在您的代码中,您在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的数字,预期结果。
答案 1 :(得分:2)
你自己的旋转矩阵没有改变输入的原因很简单:你的旋转只影响y和z坐标,因为它们为零,结果与输入完全相同。 X坐标在输出x坐标中的乘数为1,因此保持不变。
您可以制作矢量1.0, 2.0, 3.0, 1.0
,然后您会看到更改。
至于glm版本,不能说为什么它会给出奇怪的结果,我从来没有遇到过它们的问题但是没用多少。