【问题标题】:Moving a shape / object in modern opengl在现代opengl中移动形状/对象
【发布时间】:2014-09-30 08:34:17
【问题描述】:

我正在使用 C++ / SFML / OpenGL 制作一个 Breakout 游戏,用于学习目的。这是我第一次接触现代 opengl。

我的问题是我不知道如何让桨移动(或者球)。现在,我平移整个视图,使相机移动,但形状保持在原始位置。我一直在关注某些在线教程(主要是 Arcsysnthesis 和 open.gl),但我只是不明白一些东西,所以我想知道是否可以得到反馈。我知道我需要转换桨的位置,目前我正在使用 MVP 矩阵设置。

在我的顶点着色器中

gl_Position = MVP * vec4(position, 1.0);

其中 MVP 是一个统一的 mat4 变量。我使用 glm::perspective 和 glm::lookAt 函数来生成 MVP 的 P * V 部分。最后,当我在 update() 函数中收集键盘输入时,我使用 glm::translate 并生成一个模型。我知道乘法顺序需要是 P*V*M(来自我收集的阅读教程),我使用结果来修改顶点着色器中的统一变量。结果是屏幕/相机平移了位置,但形状显然没有移动。 我想我理解为什么会发生这种情况,但我不知道如何只翻译形状并从本质上控制它们的运动。

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

【问题讨论】:

  • 通常MVP矩阵的P * V部分是相机的结果,M部分因形状而异。听起来您对所有事物都使用相同的 MVP 矩阵,而每个移动对象都有不同的(M 不同)。
  • 我想我明白你的意思了。我有一种感觉,每个形状都需要一个相应的“模型”,因为我的变换正在修改整个屏幕。

标签: c++ opengl sfml


【解决方案1】:

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

  • 位置的 3 个浮点向量
  • 更新方法
  • 渲染方法

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

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

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

这背后的数学是在这里:

TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;

模型视图矩阵是以下矩阵

[ 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多