我打算用 OpenGL 创建一个平铺的世界,有轻微旋转的瓷砖和房屋,世界上的建筑将由模型构成。谁能建议我应该使用什么投影(正交,透视),以及如何设置视图矩阵(使用 OpenGL)?
如果你不知道我打算创造什么样的世界风格,看看这个游戏: http ://www.youtube.com/watch?v=i6eYtLjFu-Y&feature=PlayList&p=00E63EDCF757EADF&index=2
我打算用 OpenGL 创建一个平铺的世界,有轻微旋转的瓷砖和房屋,世界上的建筑将由模型构成。谁能建议我应该使用什么投影(正交,透视),以及如何设置视图矩阵(使用 OpenGL)?
如果你不知道我打算创造什么样的世界风格,看看这个游戏: http ://www.youtube.com/watch?v=i6eYtLjFu-Y&feature=PlayList&p=00E63EDCF757EADF&index=2
使用正交与透视投影完全是一种艺术风格选择。你所说的 Pokemon 是正交的——事实上,它完全是分层的 2D 精灵(不涉及 3D)。
OpenGL 没有 VIEW 矩阵。它有一个 MODELVIEW 矩阵和一个 PROJECTION 矩阵。对于 Pokemon 风格的关卡,我建议使用简单的 glOrtho 进行投影。
假设您的世界位于 XY 空间中(图块、相机和其他对象的坐标格式为 [x, y, 0])。如果单个图块的大小为 1,1,那么 glOrtho(12, 9, -10, 10) 之类的投影矩阵将是一个很好的投影矩阵(12 宽,9 高,Z=0 是地平面)。
对于 MODELVIEW,您可以先加载标识,glTranslate() 加载平铺位置,然后 glTranslate() 加载相机位置的负值,然后再绘制几何图形。如果您希望能够旋转相机,则 glRotate() 通过两个 Translate() 之间的相机旋转的负数(反向)。最后,您将得到以下矩阵链:
输出 = 投影 × (CameraTranslation -1 × CameraRotation -1 × ModelLocation × ModelRotation) × 输入
parens 中的部分是 MODELVIEW,“- 1 ”表示“反向”,对于平移和转置对于旋转确实是负数。
如果你也想旋转你的模型,你通常首先这样做(在第一个 glTranslate() 之前)。
最后,我建议 OpenGL 论坛 (www.opengl.org) 或 www.gamedev.net 的 OpenGL 子论坛可能是一个更好的地方来问这个问题:-)
那个电子游戏使用的投影在我看来是倾斜的。有许多不同的投影,而不仅仅是透视和正交。请参阅此处以获取最常见的列表:http ://en.wikipedia.org/wiki/File:Graphical_projection_comparison.png
您肯定想要透视,仅围绕 X 轴进行固定旋转。大约 45-60 度左右。如果您不关心自己设置投影代码,GLU 库中的 gluPerspective 函数很方便。假设 OpenGL 2.1:
glMatrixMode(GL_PROJECTION); //clip matrix
glLoadIdentity();
gluPerspective(90.0, width/height, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW); //world/object matrix
glLoadIdentity();
glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
/* render */
gluPerspective 的最后两个参数是到近剪裁平面和远剪裁平面的距离。它们的值取决于您用于环境的规模。