代码之家  ›  专栏  ›  技术社区  ›  Drew Noakes

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

  •  4
  • Drew Noakes  · 技术社区  · 14 年前

    一般来说,我对OpenGL和图形编程还比较陌生,不过我一直对这个话题很感兴趣,所以我有一个理论基础。

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

    • 球,这是一个单一的网格,将经历平移和旋转,但不缩放

    所以对于我的GL新手来说,我想把这些对象加载到场景中,然后移动它们。顶点的属性不会改变,无论是它们的位置还是纹理/法线等。只是它们的“父”对象作为一个整体的变换。

    所以这个问题的一个有用的答案是:

    • 有没有更好的框架是免费的(理想情况下是开源的)并提供这种抽象级别?

    请注意,我需要任何解决方案来运行 .NET across multiple platforms .

    3 回复  |  直到 7 年前
        1
  •  5
  •   shoosh    14 年前

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

    http://www.songho.ca/opengl/gl_vertexarray.html

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

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

    http://www.songho.ca/opengl/gl_vbo.html

    glBegin() .. glEnd()

    --- 编辑

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

    您有您的初始化:

    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();
    }
    
        2
  •  4
  •   stinky472    14 年前

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

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

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

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

        3
  •  1
  •   Drew Noakes    14 年前

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

    http://www.glprogramming.com/red/

    最好的建议,我可以给任何人谁发现这个问题时,找到自己的OpenGL立足点。长时间的阅读,但授权。