2010-06-27 93 views
4

我是新手,总的来说是OpenGL和图形编程,虽然我一直对这个话题感兴趣,所以理论上有一个基础。OpenGL新手 - 在场景中移动物体的最佳方式

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

  • 照明,野外和目标,不改变
  • 球,这是一个网格,将进行平移和旋转,但不结垢
  • 的球员,这是每个组成的身体部位,其中每一个被翻译和旋转,给连接体的幻想

因此,我的GL新手心中,我想加载到场景中的这些对象,然后只是移动它们关于。没有任何属性的顶点会改变,无论是他们的定位,纹理/法线/等。只是他们的“父母”对象整体的转变。

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

我目前正在使用OpenTK,这是​​一个OpenGL库上的轻量级包装。

所以一个有用的回答这个问题要么是:

  • 哪些部分的OpenGL给我我需要什么?我是否必须重新绘制每一帧的所有面?那些移动?我可以只更新一些变换矩阵吗?我可以使用OpenTK做到这一点吗? psuedocode会是什么样子?或者,
  • 是否有更好的框架是免费的(理想的开源)并提供了这种抽象级别?

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

回答

5

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

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

顶点数组或更一般地,一个数据GL数组保存像顶点位置,法线,色彩数据。您还可以拥有一个数组,用于保存这些缓冲区的索引以指示以何种顺序绘制它们。
然后你有几个密切相关的函数来管理这些数组,分配它们,给它们设置数据并绘制它们。你可以就像glDrawElements()

这些阵列通常驻留在主机存储器中的单个的OpenGL命令来执行复杂的网格的渲染,A进一步的优化是使用是相同的概念,作为规则阵列,但驻留在顶点缓冲对象GPU内存并且可以稍快一点。下面是升技有关:

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

与缓冲区的工作,而不是好老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(); 
} 
+0

这解释了绘制网格的基本机制,但是如何移动它们(如问题的标题)呢?我可以在一帧中多次重复使用同一个网格并应用不同的变换吗?我应该使用哪种VBO或VA? – 2010-06-27 09:57:10

+0

查看新的编辑文本 – shoosh 2010-06-27 13:47:56

+0

感谢您的更新。这看起来不错,我有一个初步版本每帧绘制一个单一的VBO多次。非常兴奋地看到它在一起,但现在我需要整理照明。谢谢你的帮助。 – 2010-06-27 19:13:24

4

既然你开始,我建议坚持直接模式渲染,并获得该先工作。如果你感觉更舒适,可以改进顶点数组。如果你觉得更舒服,维也纳国际组织。最后,如果您获得超级舒适,实例化,这是您的案例中最快的解决方案(不变形,只有整个对象转换)。

除非您正在尝试实施类似于FIFA 2009的活动,否则最好坚持简单的方法,直到您遇到可证明的效率问题。不需要过早给自己头痛。

对于整个对象转换,您通常会转换模型视图矩阵。

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

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

1

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

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

最好的建议我可以给大家有没有发现他们的OpenGL的基础,当谁发现了这个问题。长时间阅读,但赋予权力。