当前位置: 首页 > 知识库问答 >
问题:

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

劳麒
2023-03-14

我正在用C / SFML / OpenGL制作一个突破游戏,用于学习目的。这是我第一次跋涉到现代开放式。

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

在我的顶点着色器中,我有

gl_Position = MVP * vec4(position, 1.0);

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

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

共有1个答案

阎璞瑜
2023-03-14

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

  • 位置的 3 个浮点数的矢量
  • 更新方法
  • 呈现方法

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

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)

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

如果要移动到不同的对象,例如右侧的第一个对象和左侧的第二个对象,则需要两个不同的模型视图矩阵。

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

in vec3 pos;
uniform  mat4 modelview;
uniform  mat4 projection;
void main(){
    gl_Position = projection * modelview * vec4(pos,1.0);
}
 类似资料:
  • 只是对lwjgl做一些修修补补,制作一些2D形状。我不确定我做错了什么,但我不能在屏幕上显示比第一个绿色方块更多的东西。下面是我的窗口循环函数的代码: 任何帮助都将不胜感激,如果我太含糊,请告诉我。谢了。

  • 问题内容: 我试图创建一个Java方法move(),它将更改对象的位置(这是一个椭圆形)。我的椭圆有一个初始的x,y位置,所以我想通过从JComponent调用以下方法来沿Jframe移动它。 问题答案: 您在中使用x变量,但未在函数中声明它,因此java假定它是 因此您的代码如下所示: 您需要将其更改为: maxX和maxY应该具有x和y可以具有的最大值 注意-此代码在某些迭代过程中不会移动对象

  • 现在,我当前的渲染代码如下: 着色器: 假设我想像JavaAWT一样,成功地填充这个形状。。。我该怎么做?(已经尝试使用GL_多边形,但它只填充整个O,我有一个填充圆,而不是O。也尝试使用jogamp glu的部分,但它只是没有渲染任何东西,不知道为什么)

  • 构造函数方法: PaintComponent方法和MouseDlold、MousePressed和MouseReleased方法:

  • 问题内容: 我正在尝试使用圆在Tkinter中为一个简单的太阳系建模,并在画布中四处移动。但是,我一直在努力寻找一种使它们动起来的方法。我环顾四周,发现该功能与创建动画循环结合在一起。我尝试使用参数来烦躁,以改变偏移量并在弯曲路径中创建运动,但是在尝试递归或循环执行时却失败了。这是我到目前为止的代码: 问题答案: 这里显示了一种使用tkinter方法更新对象和关联的画布对象的位置的方法。它使用生成

  • 问题内容: 我做了一个绘制椭圆并相互链接的迷你代码,现在我尝试移动椭圆(圆),但是我在编码时遇到了问题 移动两个圆圈,并且直线一定不能移动(Graph节点),请帮帮我,谢谢:)更新后(感谢MadProgrammer),现在我可以移动所有 图形了 问题答案: 基本上,因为可以使用而不是使用 这将确保整个组件被重新粉刷。 虽然我不反对使用repaint(int, int),因为您的绘画过程相对简单,但

  • OpenGL是一个跨编程语言、跨平台的专业图形程序接口,是一个功能强大,调用方便的底层图形库。对于这份教程,它先从最基本的图形绘制讲起,然后由浅及深的介绍了可编程渲染管线中的各种矩阵设置、光照计算,以及许多常用的渲染技术,而我也是通过这份教程,对OpenGL有了比较深入的认识,所以将其翻译出来,希望对那些准备深入学习OpenGL的朋友提供一些帮助。

  • 问题内容: 我正在作为学习项目来开发2D游戏,但遇到了麻烦。我无法弄清楚如何使用JPanel(添加到JFrame)中的KeyListener移动Polygon对象。我已经尝试过frog.translate(int x,int y)方法,该方法不会更新位置。我也尝试过手动更改数组坐标。我的代码示例如下: /////////////////////// 问题答案: 这段代码有一个简单的问题: 每次绘制