C++ 在GLM中旋转、缩放和平移二维点
我目前正在尝试创建一个2d游戏,我有点震惊,因为我找不到任何像旋转、缩放、vec2平移这样的变换 例如,据我所知,旋转仅适用于mat4x4,而mat4x4只能与vec4相乘 有什么原因吗 我想在CPU上计算顶点C++ 在GLM中旋转、缩放和平移二维点,c++,opengl,glm-math,C++,Opengl,Glm Math,我目前正在尝试创建一个2d游戏,我有点震惊,因为我找不到任何像旋转、缩放、vec2平移这样的变换 例如,据我所知,旋转仅适用于mat4x4,而mat4x4只能与vec4相乘 有什么原因吗 我想在CPU上计算顶点 std::vector<glm::mat2> m; std::向量m; 收集所有矩阵,生成顶点,填充GPU缓冲区,然后在一次绘制调用中绘制所有内容 在glm中我将如何做到这一点?只需使用mat4,然后忽略z和w组件?您应该了解的一件事是,不能只忽略z组件,更不用说w组件了
std::vector<glm::mat2> m;
std::向量m;
收集所有矩阵,生成顶点,填充GPU缓冲区,然后在一次绘制调用中绘制所有内容
在glm中我将如何做到这一点?只需使用mat4,然后忽略z和w组件?您应该了解的一件事是,不能只忽略z组件,更不用说w组件了。这取决于你想如何看待这个问题。问题是,您希望在2D中使用mat2和vec2,但遗憾的是,这并不像您想象的那么简单。您使用的是OpenGL,大概也是着色器。您至少需要使用
glm::mat3
,或者更好的:mat4
。这样做的原因是,尽管您希望所有内容都是二维的,但它必须是三维的。2D实际上只是3D,z缓冲区为1,剪辑窗格相对于窗口大小是静态的
所以,我的建议是:
glm::mat4
,即使您不打算使用它。一致性在这里很重要,特别是对于转换glm::mat4
中的z和w组件;它们很重要,因为它们的值决定了它们在屏幕上的位置。OpenGL需要知道值在z平面中的位置。对于矩阵乘法,需要齐次坐标,因此w分量也很重要。换句话说,您实际上被glm::mat4
卡住了#包括
Sprite
类,并将它们分组到该类之外。不要递归地进行分组,因为这会导致混乱的代码。生成顶点应在每个精灵的基础上进行;不要担心优化,因为OpenGL会为你处理这些问题,更不用说C++的C++编译器了。你很快就会意识到,通过解决这个问题,你可以得到
std::vector<Sprite*> sprites;
for (const auto& : i)
i->init();
// etc...
for (const auto& : i)
i->render();
对于缩放,同样需要一个合适的setScale()
函数,该函数接受x和y的两个值。将z分量设置为1以防止精灵在z轴上缩放。将值输入到glm::scale
中,如下所示:
modelMatrix = glm::scale(modelMatrix, glm::vec3(scale));
记住,存储矩阵没有什么好处,因为它们只是数字;它们并没有表明你真正想用它们做什么。最好是一个Sprite
类封装一个矩阵,以便清楚它们代表什么
不客气 看来我看得不够仔细
modelMatrix = glm::scale(modelMatrix, glm::vec3(scale));