【问题标题】:Creating a Cube-based 3-Dimensional Game创建基于立方体的 3 维游戏
【发布时间】:2014-05-18 08:40:49
【问题描述】:

我正在尝试创建一个完全基于完全相同大小的立方体的 3 维游戏。我想学习如何仅使用 2 维游戏库制作自己的 3 维游戏。目前,我正在做的事情是我有一个数组来存储游戏中每个立方体的所有中心的位置。然后,在绘制单个立方体时,我会确定需要绘制立方体的哪 3 个面(因为您不需要绘制立方体的所有 3 个面)。然后,知道立方体所有角的 3 维点,我使用相机位置、相机角度和我正在投影的点将这些点投影到 2 维空间。

现在我真正的问题是:现在我可以绘制一个立方体,我如何绘制多个立方体,考虑到立方体需要按一定的顺序绘制(即需要先绘制更远的立方体,所以离我们较近的立方体出现在离我们很远的立方体的顶部)?在给定立方体中心列表及其大小以及相机位置/角度的情况下,如何确定首先绘制哪些立方体?

【问题讨论】:

  • 使用 3D 图形 ...(软、OpenGl 或 DirectX)并使用 Z-Buffering + 面部剔除。否则你的游戏会很慢......(每个体素的 Z 排序 + 自定义投影......这很疯狂,除非你有无限的 CPU 能力......)
  • @Spektre 感谢您回答我已经失去希望的问题 =) 我想现在,我会继续使用 3D 图形,但如果我要研究投影等 3D游戏使用,你能推荐任何流行语或参考资料吗?

标签: geometry 3d projective-geometry


【解决方案1】:

我学习3D图形已经好几年了……

我使用的所有网站现在都消失了(像往常一样在 WEB 上,但有很多新网站)。我是 OpenGL 用户,所以我建议使用它。我的许多学生都喜欢 NEHE 教程,所以请看here。另请查看 4x4 变换矩阵(齐次坐标)。

Z-BufferOpenGL 中是自动的,只需使用 Z-Buffer 创建上下文(所有教程都使用它)并调用 glEnable(GL_DEPTH_TEST);

面剔除(跳过对象的另一侧)由glEnable(GL_CULL_FACE); 完成,并在同一多边形绕组中绘制面(CWCCW

这里有几个相关的问题:

还有一些值得一看的好网站(强烈推荐):

对不起,链接列表,但我认为他们是相关的,在这里复制他们的东西太多了。现在回到你的问题如何渲染更多的立方体。我看到几个选项(在 OpenGL 中):

  1. 每个立方体都有自己的变换矩阵

    表示它在空间中的位置和方向,然后在渲染每个立方体之前更改GL_MODELVIEW 矩阵并绘制立方体(每个都使用相同的代码)。如果您有太多对象/立方体,它将消耗大量内存(每个立方体 +16 个浮点数)。

  2. 每个立方体都相互对齐

    在这种情况下,您只需要知道 3D 位置(每个立方体 +3 个浮点数),所以只需执行以下操作:

    glMatrixMode(GL_MODELVIEW);    // this store original matrix
    glPushMatrix();
    glTranslatef(x[i],y[i],z[i]); // position of i-th cube
    // here render cube (like glBegin(GL_QUADS); ... or use glDraw... )
    glMatrixMode(GL_MODELVIEW);    // this restore original matrix
    glPopMatrix();
    
  3. 着色器的使用

    在现代着色器管道中,您可以使用几何着色器在接收点发射立方体,但这对于 OpenGL 初学者来说太多了。但在这种情况下,您只需绘制点,着色器会将它们转换为 GPU 上的立方体,这要快得多......

  4. 使用 VBO 或 VAO

    • VAO 是顶点数组对象(VBO 的列表)
    • VBO是顶点缓冲对象


    VBO 基本上是一组参数复制到 GPU 作为一个块,而不是像glVertex,glColor,glNormal这样的单独调用...这要快得多.这允许您创建空间模型(所有立方体)并以足够的速度一次绘制它,除非您达到 GPU/CPU/MEM 速度限制

    VAO 类似地将更多 VBO 组合在一起,因此您只需为每个对象绑定一个 VAO 而不是一个 VBO 为每个参数进一步减少渲染所需的 API 调用次数。

【讨论】:

  • 这太棒了!感谢您抽出宝贵时间回答问题并找到一些链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多