具有不同高度的相邻图块的图块地图/地形实现


10

我正在寻找有关切片地图的一些信息,或更确切地说,是什么类型的切片地图被称为。

我对过山车大亨或运输大亨系列游戏中使用的实现方式感兴趣,并且一直在研究矢量场地形和高度图地形,但我不确定它们是否适合我的期望发展。

很难找到任何像样的信息,因为大多数人将其称为等轴测图,但是我正在寻找以固定的正交透视图创建3D图像的方法。我了解磁贴图的基础存储与渲染方式无关,但我不希望像老式的口袋妖怪/塞尔达游戏一样创建2D磁贴图,更像暗黑破坏神那样具有包含功能悬垂的悬崖和倾斜的地形。

我只是想找到合适的条件来搜索google和stackoverflow的资源,以帮助我确定要走的道路。

到目前为止,我已经设法在不使用存储在VBO中并渲染为线框的height / y分量的情况下充实了基本的贴图。到目前为止,这看起来还不错,但是我设想在尝试操纵单个顶点以创建悬崖和坡度而不影响相邻图块时会遇到问题。

我应该研究一种特定类型的实现吗?我以为如果在矢量场地形上找到了相当数量的信息,就可以破解它,但我不确定这是否也会产生正确的结果。

如果有人可以帮助我了解一下,将非常感谢您的帮助:)

更新资料

我提供了一张图片,以进一步阐明我想要实现的目标:

2.5D瓷砖地图

如何创建倾斜(高度)等距图块借来的图像

此图像显示了我要生成的地形类型,但不包括我对建模感兴趣的“悬崖”或悬垂的地形类型。但是它确实提出了我没有考虑的其他一些问题,即;

  • 如何处理“水”等图层(在图像的左上方)以包括水之下的可见地面?
  • 如何适应地图的“边缘”,以便渲染泥土来将世界描述为非平坦的实体?
  • 是否可以使用这种地形的基础存储来建模物理模型,例如滚下山坡的球或穿越斜坡的运动员的运动速度?

我的想法是,可以使用8个顶点对地形的每个图块进行建模,其中4个主顶点覆盖实际图块本身,而其余4个顶点用于对每个图块的侧面/墙进行建模。我在此实现中看到的两个问题是:a)世界地图的尺寸​​实质上增加了一倍,b)鉴于并非所有图块都将包含“墙”,因此某些图块最终将具有未使用的冗余顶点。

我想创建一个地形编辑器,该编辑器允许每个图块变形以及在游戏过程中更改地形的功能。这本身带来了其他问题,例如;VBO可以在即时修改的同时用于存储和渲染地形吗?是否可以在不影响相邻图块的情况下修改顶点?

我的印象是我要么使事情变得过于复杂,要么陷入分析瘫痪,因为我忽略了编写任何代码来解决问题而又不清楚我将如何实现自己想要的目标。

再说一次,我真的只是在寻找正确的方向。有没有一种特定类型的tilemap / terrain实现,可以满足3D地图在地图编辑器以及游戏过程中变形的需要,或者我必须自己滚动一下?我并不想在这里重新发明轮子,但是由于我不确定要寻找的内容,我正在努力寻找任何资源。

如果任何人都可以提供任何信息,资源或代码片段,将不胜感激,因为我急于弄脏我的手,并开始生产除我现有的扁平线框以外的其他东西。

谢谢阅读!

Answers:


2

如果您是我,我会研究体素,更具体地说是Minecraft型立方体渲染。与高度图不同,它们可以处理悬垂,洞穴,多层建筑物等。

您将地形存储在3D整数数组中,其中数字映射到某种地形:0 =空气,1 =污垢,2 =水等。然后,要创建要渲染的网格,为每个非空体素创建一个立方体的面。

本教程很好地解释了如何使用Ogre3D在C ++中执行此操作。我认为您必须在OpenGL中进行一些更底层的设计。

创建多维数据集后,您需要平滑边缘以创建图像中显示的那种流动地形。我相信PolyVox(也在C ++中)做到了;您可以看一下他们的代码。我认为您基本上是在3D模式下完成图像在2D模式下的显示:平均周围的立方体位置以知道每个顶点的放置位置。

编辑:

  • 仿佛水瓷砖是空的,为与水相邻的立方体生成面,并透明地渲染水面。
  • 如果您认为世界以外的体素是空的,则可以像常规面一样生成“边缘”上的面。
  • 物理:您可能可以将渲染的网格作为静态对象输入到物理引擎。
  • 地图编辑器:您想编辑基础体素数据,而不是网格物体本身!(网格应该镜像数据,因此编辑体素应该会在网格中产生变化。)如果您不熟悉它,则可能需要查找“模型,视图,控制器(MVC)”。

如果您还有其他问题,请随时发表评论。欢迎来到gamedev.SE!


对于一个相对简单的问题,这是一个非常复杂的解决方案。在没有体素的复杂性的情况下,很多游戏都能完成OP所要求的功能。
肖恩·米德迪奇

我同意体素可能很复杂。您可以链接到这些游戏吗?我很想听听他们是如何做到的。
Wackidev

我玩弄使用体素的想法。这种实现方式是否意味着所有多维数据集都具有单位尺寸,还是可以挤出单个多维数据集?我猜想世界将需要分层存储,以允许水和其他可能沿y平面“重叠”的图块。
CaptainRedmuff 2012年

是的,体素通常为单位大小。我想一个人可以挤出它们,但是我认为那只会使其变得更加复杂。我不确定我是否理解您对图层的含义。您指的是可变高度的水瓦吗?
Wackidev

遵循这些原则。我在考虑更多有关简单定义“地板”的问题,该地板可以是挤压的立方体,然后在顶部由两个相交的平面定义水立方体。也许我又使事情变得复杂了。我将进一步阅读体素,看看会导致我什么。
CaptainRedmuff 2012年

6

这是:http: //30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png是我前段时间制作的地图示例。

我有一个表示地图和不同类型图块的XML。每种类型都有一些属性:

  • 高度
  • 位置
  • 合并类型:此图块将执行哪种合并ALL(如果它应合并到周围的任何图块),EQUAL(仅与相同类型的图块合并),NONE(从不合并)。
  • 合并高度:坡度的最大高度(适用于悬垂),假设您希望一个图块仅与相同高度或相差1的图块合并。该值应为1。

然后,我将阅读所有磁贴并在场景中创建它们。首先只考虑位置。每个图块都必须知道它的邻居,因此我必须遍历地图两次,一次创建所有内容,再一次将每个顶点移动到正确的位置。

尽管我的模型是十六进制的,但是概念是相同的,您将需要一个立方体来表示您的图块,然后将基本顶点移动到最低级别,并用周围的立方体“平滑”立方体的顶部。您还将检查多维数据集的两侧是否已合并,因此您只需从多维数据集中删除该侧(如果未合并,则可能是悬崖之类的东西)。

关于物理学,取决于您的目标。如果您正在做过山车大亨之类的事情,那么您实际上并不需要它们。您可以只检查每个图块之间的播放器高度并确定步行速度。您可以对本身移动的对象(例如球)执行相同的操作,可以检查周围的瓦片(或当前的瓦片角度)并确定方向/速度。如果需要逼真的物理(如重力,摩擦力等),则必须使用物理引擎,并且可以在引擎中使用立方体3D表示。

分层也是可能的,但是您需要像Minecraft之类的东西(在最顶层的多维数据集上进行平滑处理)。如果只需要水层,则可以在图块上放置一个“水弹簧”,并使代码填充到该图块周围的所有高度相同或更低的空间中(递归解决方案很适合此处)。

地形编辑器也很简单,如果您的代码足够灵活,则可以将转换应用于单个图块(您要更改的图块),或应用于图块列表(如果您要使用“画笔”选择并移动它们)。相同的代码可用于修改游戏的地形。是的,您可以更改VBO上的顶点,也可以更改顶点而不影响其他顶点(这也取决于您这样编码)。


+1感谢您对此的投入。您提出了一个关于我从未考虑过的“水泉”分层的好观点。现在,我知道可以进行即时修改VBO了:)
CaptainRedmuff 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.