当前位置:  开发笔记 > 后端 > 正文

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

如何解决《OpenGL新手-在场景中移动对象的最佳方法》经验,为你挑选了1个好方法。

我是初学OpenGL和图形编程的新手,虽然我一直对这个主题感兴趣,所以在理论上有一个基础.

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

照明,场地和目标,不会改变

球,是一个单一的网格,将进行平移和旋转,但不会缩放

每个球员都由身体部位组成,每个身体部位都被翻译和旋转,以产生连体的幻觉

所以对于我的GL新手来说,我想将这些对象加载到场景中然后移动它们.顶点的属性不会改变,无论是它们的定位还是纹理/法线/等.只是整个'父母'对象的转变.

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

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

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

OpenGL的哪些部分给了我我需要的东西?我是否必须每帧重绘所有脸部?只是那些移动?我可以更新一些转换矩阵吗?使用OpenTK我能做到这么简单吗?psuedocode会是什么样子?要么,

是否有一个更好的框架是免费的(理想的开源)并提供这种抽象级别?

请注意,我需要在多个平台上运行.NET的任何解决方案.



1> shoosh..:

使用所谓的顶点数组可能是优化这种场景的最可靠方法.这是一个很好的教程:

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

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

这些数组通常驻留在主机内存上.进一步的优化是使用顶点缓冲区对象,这些对象与常规数组相同,但驻留在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();
}

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有