C++如何使用OpenGL和GLM库创建一个简单的2D旋转而不将图元拉伸为3D?

pxiryf3j  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(188)

除了GLM、Glad和GLFW之外,我一直在使用OpenGL来创建2D游戏。我想实现简单的2D旋转,大概是沿着Z轴,因为它不会是3D的。问题是,当我创建一个简单的模型矩阵时,使用旋转矩阵乘以平移和膨胀矩阵。当图元被渲染时,旋转变成了3d。2正方形被拉伸,两边不再是相同的长度。3有没有办法避免这种拉伸,使正方形在旋转时保持相同的比例?
顶点着色器:

//shader vertex

# version 430 core

layout(location = 0) in vec3 aPos;
layout(location = 1) in vec2 aTexCoord;
//uniform mat4 transform;
uniform mat4 model;

out vec2 TexCoord;
void main()
{
    gl_Position = model * vec4(aPos, 1.0);
    TexCoord = aTexCoord;
}

我有一个函数,通过迭代矩阵的向量来处理大批量的对象。首先创建的矩阵等于glm::mat4(1.0f)。

void Trans::moveBatch(std::vector <glm::vec2>& speed, std::vector <float>& rot)
{
    for (unsigned int i = 0; i < speed.size(); i++)
    {
        batchRotator[i] = glm::rotate(batchRotator[i], glm::radians(rot[i]), glm::vec3(0.0f, 0.0f, 1.0f));
        batchMover[i] = glm::translate(batchMover[i], glm::vec3(speed[i].x, speed[i].y, 0.0f));
        batchBox[i].x += speed[i].x;
        batchBox[i].y += speed[i].y;
        batchBox[i].z += speed[i].x;
        batchBox[i].w += speed[i].y;
    }
}

然后,我将矩阵相乘,并将其作为模型矩阵发送到着色器中。

zbq4xfa0

zbq4xfa01#

非常感谢!我能够使用glm::ortho来创建一个投影矩阵,这解决了我的问题,当我在1920/1080内制作世界坐标时,因为这是正确的纵横比。

相关问题