我正致力于在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(来自我收集的阅读教程),我使用结果来修改顶点着色器中的统一变量。结果是屏幕/摄像机转换位置,但形状显然不会移动。 我想我明白为什么会这样,但我无法弄清楚如何只翻译形状并基本上控制它们的运动。
编辑 - 下面的评论是正确的 - 我需要更改我的更新/渲染序列,因为我在我的所有形状上使用相同的变换!
答案 0 :(得分:3)
在您的C ++代码中,您可能有一个paddle类,其中应包含以下内容:
在调用更新方法之前,您可以使用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);
}