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