Language agnostic OpenGL新手-在场景中移动对象的最佳方式

Language agnostic OpenGL新手-在场景中移动对象的最佳方式,language-agnostic,opengl,graphics,3d,Language Agnostic,Opengl,Graphics,3d,我对OpenGL和图形编程基本上是新手,尽管我一直对这个主题感兴趣,所以我有一个理论基础 我想做的是创建一个场景,其中一组对象在其中移动。具体来说,他们是球场上的机器人足球运动员。这些对象是: 灯光、球场和球门,它们不会改变 球,这是一个单一的网格,将经历平移和旋转,但不缩放 玩家,每一个都由身体部分组成,每个部分都被平移和旋转以产生连接身体的错觉 所以对于我的GL新手来说,我想将这些对象加载到场景中,然后移动它们。顶点的属性不会改变,无论是它们的位置还是纹理/法线/等等。只是将它们的“父”

我对OpenGL和图形编程基本上是新手,尽管我一直对这个主题感兴趣,所以我有一个理论基础

我想做的是创建一个场景,其中一组对象在其中移动。具体来说,他们是球场上的机器人足球运动员。这些对象是:

  • 灯光、球场和球门,它们不会改变
  • 球,这是一个单一的网格,将经历平移和旋转,但不缩放
  • 玩家,每一个都由身体部分组成,每个部分都被平移和旋转以产生连接身体的错觉
所以对于我的GL新手来说,我想将这些对象加载到场景中,然后移动它们。顶点的属性不会改变,无论是它们的位置还是纹理/法线/等等。只是将它们的“父”对象作为一个整体进行变换

此外,运动员都有相同的身体。我是否可以通过将模型加载到内存中一次,然后每次使用不同的变换矩阵多次绘制来进行优化

我目前正在使用OpenTK,它是OpenGL库之上的一个轻量级包装器

因此,对这个问题的一个有用答案是:

  • OpenGL的哪些部分提供了我需要的东西?我必须每帧重画所有的脸吗?就那些会动的?我可以只更新一些变换矩阵吗?使用OpenTK我能让这变得多么简单?psuedocode会是什么样子?或者
  • 有没有更好的框架是免费的(理想情况下是开源的)并提供这种抽象级别

请注意,我需要运行任何解决方案。

使用所谓的顶点阵列可能是优化此类场景的最可靠的方法。这里有一个很好的教程:

顶点数组或更一般地说,gl数据数组保存顶点位置、法线、颜色等数据。您还可以使用一个数组来保存这些缓冲区的索引,以指示绘制它们的顺序。
然后有几个密切相关的函数来管理这些数组、分配它们、为它们设置数据并绘制它们。只需一个OpenGL命令即可执行复杂网格的渲染,如
gl抽屉元素()

这些阵列通常驻留在主机内存中,进一步的优化是使用顶点缓冲区对象,这些对象与常规阵列的概念相同,但驻留在GPU内存中,可以更快一些。这里有一点关于这一点:

使用缓冲区而不是旧的
glBegin()。。glEnd()
具有与OpenGL ES兼容的优点。在OpenGL ES中,数组和缓冲区是绘制内容的唯一方法

---编辑

在场景中移动、旋转和变换对象是使用模型视图矩阵完成的,不需要对网格数据进行任何更改。举例说明:

您已经完成了初始化:

void initGL() {
  // create set of arrays to draw a player
  // set data in them
  // create set of arrays for ball
  // set data in them
}

void drawScene {
  glMatrixMode(GL_MODEL_VIEW);
  glLoadIdentity();
  // set up view transformation
  gluLookAt(...);
  drawPlayingField();

  glPushMatrix();
  glTranslate( player 1 position );
  drawPlayer();
  glPopMatrix();

  glPushMatrix();
  glTranslate( player 2 position );
  drawPlayer();
  glPopMatrix();

  glPushMatix();
  glTranslate( ball position );
  glRotate( ball rotation );
  drawBall();
  glPopMatrix();
}

既然您刚刚开始,我建议您坚持立即模式渲染,并首先让它工作。如果您感到更舒适,可以改进顶点阵列。如果你觉得更舒服,VBOs。最后,如果你感觉非常舒适,实例化是最快的解决方案(没有变形,只有整个对象变换)

除非你想实施像Fifa 2009这样的东西,否则最好还是坚持简单的方法,直到你遇到明显的效率问题。没有必要过早地让自己头疼

对于整个对象变换,通常要变换模型视图矩阵

glPushMatrix();
// do gl transforms here and render your object
glPopMatrix();

对于加载对象,您甚至需要想出一些格式或实现一些可以加载网格格式的东西(obj是最容易支持的格式之一)。有高级库可以简化这一点,但我建议您使用OpenGL,以获得所需的体验和控制。

我希望OpenGL API可以通过IDE支持(intellisense等)轻松导航。几个小时后,显然需要制定一些基本规则。所以我停止了打字和RTFM


我能给任何在找到OpenGL立足点时发现这个问题的人的最好建议。这本书读得很长,但很有说服力。

这解释了绘制网格的基本原理,但如何移动网格(如问题的标题所示)?我可以在一帧中多次重复使用相同的网格并应用不同的变换吗?我应该使用哪一种,VBO还是VA?谢谢更新。这看起来不错,我有一个初步的版本,在每帧中多次运行单个VBO。看到它一起出现非常激动人心,不过现在我需要整理一下灯光。谢谢你的帮助。