繁体   English   中英

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

[英]C++ With OpenGL and GLM libraries how do you create a simple 2d rotation without stretching of the primitive into 3d?

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

顶点着色器:

//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;
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM