在现代opengl中移动一个形状/对象
Moving a shape / object in modern opengl
我正在用c++/SFML/OpenGL制作一个Breakout游戏,用于学习目的。这是我第一次探索现代opengl。
我的问题是我不知道如何使桨移动(或球)。现在,我转换了整个视图,使摄像机移动,但形状保持在原来的位置。我一直在网上跟随一些教程(arcsythesis和open)。(主要是),但我就是有些地方不明白,所以我想知道我是否能得到反馈。我知道我需要翻译桨的位置,目前我正在使用MVP矩阵设置。
在顶点着色器中有
gl_Position = MVP * vec4(position, 1.0);
其中MVP是一个统一的mat4变量。我使用glm::perspective和glm::lookAt函数来生成MVP的P * V部分。最后,当我在update()函数中收集键盘输入时,我使用glm::translate并生成一个Model。我知道乘法顺序需要是P*V*M(从我收集的阅读教程),我使用结果来修改顶点着色器中的统一变量。结果是,屏幕/摄像机可以转换位置,但形状显然不会移动。我想我明白为什么会这样,但我不知道如何只转换形状并从根本上控制它们的运动。
编辑-下面的评论是正确的-我所需要的只是改变我的更新/渲染序列,因为我在所有的形状上使用相同的变换!
在你的c++代码中,你可能有一个关于桨的类,它应该包含以下内容:
- 位置 的3个浮点向量
- 更新方法
在调用更新方法之前,您使用glm::lookAt或类似的东西从相机生成视图矩阵。然后你调用桨的更新方法,并根据你的游戏逻辑改变位置。当你渲染桨时,你必须使用统一的着色器上传视图/模型视图矩阵。在设置统一之前,您可以更改modelview矩阵并使用以下数学方法转换对象:
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);
}
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值