我正在尝试创建一个完全基于完全相同大小的立方体的三维游戏。我想学习如何仅使用二维游戏库制作自己的三维游戏。目前,我的做法是我有一个数组来存储游戏中每个立方体的所有中心的位置。然后,在绘制单个立方体时,我会弄清楚我需要绘制立方体的哪 3 个边(因为您不需要绘制立方体的所有 3 个边)。然后,知道立方体所有角的三维点,我使用相机位置、相机角度和我正在投影的点将这些点投影到 2 维空间上。
现在我真正的问题是:既然我可以画一个立方体,那么考虑到立方体需要按一定的顺序绘制(即需要先绘制离我们较远的立方体,以便离我们更近的立方体出现在离我们很远的立方体的顶部)?如何在给定立方体中心列表及其大小以及相机位置/角度的情况下确定首先绘制哪些立方体?
我学习 3D 图形已经有好几年了......
我使用的所有网站现在都消失了(像往常一样在 WEB 上,但有大量的新网站)。我是OpenGL用户,所以我建议使用它。许多我的学生都喜欢NEHE教程,所以看这里。另请查看 4x4 变换矩阵(齐次坐标)。
Z-Buffer 在 OpenGL 中是自动的,只需使用 Z-Buffer 创建上下文(所有教程都使用它)并调用glEnable(GL_DEPTH_TEST);
面剔除(跳过对象的另一侧)是通过在同一多边形缠绕(CW
或CCW
)中glEnable(GL_CULL_FACE);
和绘制面来完成的
这里有几个相关的问题:
- 了解 4x4 齐次变换矩阵
- 3D(软件)渲染管线计算
- 一些变换矩阵 3x3 和 4x4 见解
- 如何投影点和向量...固定管道OpenGL将为您完成
- 逆 4x4 矩阵的代码
- 这是 Borland/Embarcadero BDS2006 Turbo C++ 中的我的干净 OpenGL 应用程序示例
- 一些投影数学
还有一些好网站可以看(强烈推荐):
- 变换
- 学习现代 3D 图形编程
- GL_PROJECTION矩阵滥用
很抱歉链接列表,但我认为它们是相关的,在这里复制他们的东西会太多了。现在回到你的问题,如何渲染更多的立方体。我看到几个选项(在OpenGL中):
-
每个多维数据集都有自己的转换矩阵
表示其在空间中的位置和方向,然后在渲染每个立方体之前更改矩阵
GL_MODELVIEW
并绘制立方体(每个立方体使用相同的代码)。如果你有太多的对象/多维数据集,它将消耗大块内存(+16个浮点数)。 -
每个立方体都相互对齐
在这种情况下,您只需要知道 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();
-
着色器的使用
在现代着色器管线中,您可以使用几何着色器在接收点发出立方体,但这对于 OpenGL 初学者来说太多了。但是在这种情况下,您只需绘制点,着色器就会将它们转换为 GPU 上的立方体,这要快得多......
-
使用 VBO 或 VAO
- VAO 是顶点数组对象(VBO 的列表)
- VBO 是顶点缓冲区对象
VBO 基本上是一个参数数组,作为一个块复制到 GPU,而不是像glVertex,glColor,glNormal
这样的单个调用......这要快得多。这允许您创建空间(所有立方体)的模型并以足够的速度立即绘制它,除非您达到 GPU/CPU/MEM 速度限制VAO 同样将更多的 VBO组合在一起,因此您只需为每个对象绑定一个 VA,而不是为每个参数绑定一个 VBO,从而进一步减少渲染所需的 API 调用次数。