Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在GLM中旋转、缩放和平移二维点_C++_Opengl_Glm Math - Fatal编程技术网

C++ 在GLM中旋转、缩放和平移二维点

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组件了

我目前正在尝试创建一个2d游戏,我有点震惊,因为我找不到任何像旋转、缩放、vec2平移这样的变换

例如,据我所知,旋转仅适用于mat4x4,而mat4x4只能与vec4相乘

有什么原因吗

我想在CPU上计算顶点

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
    卡住了

  • 要获取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));