使用OpenGL创建平铺世界

使用OpenGL创建平铺世界,opengl,3d,textures,tiles,Opengl,3d,Textures,Tiles,我计划用OpenGL创建一个平铺的世界,稍微旋转一点,世界上的房屋和建筑将由模型组成。 有谁能建议我应该使用什么投影(正交、透视),以及如何设置视图矩阵(使用OpenGL) 如果你不知道我打算创造什么样的世界,看看这个游戏: 使用正交投影与透视投影完全是一种艺术风格的选择。你所说的口袋妖怪是正交的——事实上,它是完全分层的2D精灵(不涉及3D) OpenGL没有视图矩阵。它有一个模型视图矩阵和一个投影矩阵。对于口袋妖怪风格的关卡,我建议使用简单的glOrtho进行投影 假设您的世界在XY空间中(

我计划用OpenGL创建一个平铺的世界,稍微旋转一点,世界上的房屋和建筑将由模型组成。 有谁能建议我应该使用什么投影(正交、透视),以及如何设置视图矩阵(使用OpenGL)

如果你不知道我打算创造什么样的世界,看看这个游戏:
使用正交投影与透视投影完全是一种艺术风格的选择。你所说的口袋妖怪是正交的——事实上,它是完全分层的2D精灵(不涉及3D)

OpenGL没有视图矩阵。它有一个模型视图矩阵和一个投影矩阵。对于口袋妖怪风格的关卡,我建议使用简单的glOrtho进行投影

假设您的世界在XY空间中(瓷砖、相机和其他对象的坐标为[x,y,0])。如果单个瓷砖的大小为1,1,则类似于glOrtho(12,9,-10,10)的东西将是一个良好的投影矩阵(12宽,9高,Z=0是地平面)

对于MODELVIEW,在绘制几何体之前,可以先加载标识,然后加载平铺位置的glTranslate(),然后加载相机位置的负数的glTranslate()。如果希望能够旋转摄影机,可以通过两个Translate()之间摄影机旋转的负方向(逆方向)来旋转()。最后,您将得到以下矩阵链:

输出=投影×(摄像机翻译-1×摄像机旋转-1×模型位置×模型旋转)×输入

parens中的部分是MODELVIEW,“-1”表示“反向”,这对于平移和旋转来说都是负面的

如果也要旋转模型,通常首先(在第一个glTranslate()之前)进行旋转


最后,我建议OpenGL论坛(www.OpenGL.org)或www.gamedev.net的OpenGL子论坛可能是一个更好的问这个问题的地方:-)

视频游戏使用的投影在我看来是倾斜的。有许多不同的投影,不仅仅是透视和正交投影。请参阅此处以获取最常见的列表:

您肯定需要透视,仅围绕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   */

透视图的最后两个参数是到近剪裁平面和远剪裁平面的距离。它们的值取决于您对环境使用的比例。

等等,那么,您所说的瓷砖位置和相机位置是什么意思?回答得好,但如果您想直接一点,请看这里:您显然没有理解我。我知道瓷砖是二维的,但它涉及到模型的使用。如果你仔细看一下视频,你会发现房子是模型。我的答案是专门针对二维平面上的三维模型的(尽管我想你也可以将其用于四边形)。说到“相机”和“瓷砖”的位置,我的意思是——相机在(想象的)世界空间中的位置,以及瓷砖在(想象的)世界空间中的(模型的)位置。好的,谢谢。所以基本上,这是相机的设置,我如何滚动,例如画2D瓷砖?我很乐意得到一些关于位置比例的信息,比如一个单位等于二十个像素,或者怎么样?用透视投影,单位不映射到像素。而且绝对不是线性的。在评论栏里,你问了太多问题,我无法回答。我知道单位不映射到像素,我问的是比例。例如,每个瓷砖后面的定位间隔应该是多少?这取决于瓷砖的大小。使用透视投影,x和y按z缩放。也就是说,z被插入w,然后x,y和z除以w。好的,我的解决方案是使用一个简单的单位1作为两个因子(x,y)中瓷砖的大小。但现在我在每个瓷砖之间都有了一点空间,可能是因为加载纹理时有缺陷,下面是我的代码:抱歉,代码太糟糕了。谢谢你的相关回答。