在现代opengl中移动形状/对象

时间:2014-08-07 07:40:33

标签: c++ opengl sfml

我正致力于在C ++ / SFML / OpenGL中制作一个Breakout游戏用于学习目的。这是我第一次踏上现代opengl。

我的问题是,我无法弄清楚如何让球拍移动(或球是为了这个问题)。现在,我翻译整个视图,导致相机移动但形状保持原始位置。我一直在线学习某些教程(主要是Arcsysnthesis和open.gl),但我只是不理解某些东西,所以我想知道我是否能得到反馈。我知道我需要翻译桨的位置,目前我正在使用MVP矩阵设置。

在我的Vertex着色器中,我有

gl_Position = MVP * vec4(position, 1.0);

MVP是统一的mat4变量。我使用glm :: perspective和glm :: lookAt函数来生成MVP的P * V部分。最后,当我在update()函数中收集键盘输入时,我使用glm :: translate并生成一个Model。我知道乘法顺序需要是P * V * M(来自我收集的阅读教程),我使用结果来修改顶点着色器中的统一变量。结果是屏幕/摄像机转换位置,但形状显然不会移动。 我想我明白为什么会这样,但我无法弄清楚如何只翻译形状并基本上控制它们的运动。

编辑 - 下面的评论是正确的 - 我需要更改我的更新/渲染序列,因为我在我的所有形状上使用相同的变换!

1 个答案:

答案 0 :(得分:3)

在您的C ++代码中,您可能有一个paddle类,其中应包含以下内容:

  • 位置的3个花车的向量
  • 更新方法
  • 渲染方法

在调用更新方法之前,您可以使用glm :: lookAt或类似方法从相机生成View矩阵。 然后调用paddle的更新方法并根据游戏逻辑更改位置。渲染球拍时,必须使用制服将视图/模型视图矩阵上传到着色器。 在设置制服之前,您可以更改模型视图矩阵并使用以下数学转换对象:

glm::mat4 mvp = glm::translate(orgModelView, glm::vec3(x,y,z));

这将转换应用此模型视图矩阵的所有对象。

这背后的数学是:

TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;

Modelview矩阵是以下矩阵

[ R      T ]
  0 0 0  1

R是旋转矩阵,T是平移向量。如果你不想旋转对象R是身份,如果你不想翻译对象,T是(0,0,0)

将此应用于对象的所有顶点,您可以旋转并平移对象(注意矩阵乘法的顺序很重要)。

如果要移动到不同的对象,如第一个到第二个,第二个到左边,则需要两个不同的Modelview矩阵。

在我的着色器中,我这样做:

in vec3 pos;
uniform  mat4 modelview;
uniform  mat4 projection;
void main(){
    gl_Position = projection * modelview * vec4(pos,1.0);
}