【问题标题】:How to create an Isometric tile-map with 3D objects如何使用 3D 对象创建等距平铺地图
【发布时间】:2018-07-04 16:32:28
【问题描述】:

所以,我正在构建一个基本的大亨游戏。在这个游戏中,我想要一个简单的 3D 生成的瓦片地图,玩家可以在上面进行构建。我需要 tile-map 是 3D(或具有 3D 外观),因为我希望能够在玩家将能够构建的 3D 模型上使用一些逼真的着色器。

起初,我以为我可以将 SpriteKit 和 SceneKit 结合起来。我会生成 2D SKTileMapNode,然后允许玩家在其上构建 3D 建筑物。但这不会很好,因为 SKTileMapNodes 不容易平移或缩放。

我的第二个想法是随机构建一个 SKTileMap(我知道如何轻松完成),然后将其用作构建 3D 场景的参考。这将使我能够完全控制去哪里,但有一个问题。每个 3D 块(表示 tileMap 中的图块)都将被视为一个节点并导致巨大的性能问题,这与 SpriteKit 的 SKTileMapNode 不同,后者将 tile-map 视为一个大节点,一旦它被填充了图块。

我宁愿不使用等距的 SKTileMap,因为那不允许玩家平移/缩放地图,因此会降低我希望通过这款游戏实现的深度和感觉。

例如,this 就是我想要的(构建相似但风格完全不同)

【问题讨论】:

  • 绝对是 SceneKit 的工作。您的问题相当广泛,我认为如果您就在 Scenekit 中设置的特定问题寻求帮助,您会得到更好的答复。
  • 我只是要求“最佳”方法来实现这一目标。我可以删除这个问题,等我到世界生成阶段再问。现在我只是在规划各种建筑物以及它们的用途。 (如发电厂和宿舍等)

标签: ios swift 3d sprite-kit scenekit


【解决方案1】:

“每个 3D 块(在 tileMap 中表示一个图块)将被视为一个节点并导致巨大的性能问题,”

我认为您的问题应该是“如何在 Scenekit 中渲染具有良好性能的 3D 瓦片地图”,因为 imo Scenekit 绝对是解决问题的方法,而且它肯定可以防止那些“巨大的性能问题”。

首先,如何创建图块?如果您使用内置原语,则可以通过使用 dae 或 obj 文件中的 tile 甚至通过编程方式创建它来获得巨大的性能提升。

如果图块始终是同一个模型,您应该只添加一次,然后为所有其他图块克隆它: https://developer.apple.com/documentation/scenekit/scnnode/1408046-clone (请注意,您必须创建材料的副本并将其分配给克隆,以防止其在所有图块之间共享)。

此外,通过将它们全部添加到单个父节点,您可以创建一个所谓的扁平克隆以将所有图块组合到单个节点中。 https://developer.apple.com/documentation/scenekit/scnnode/1407960-flattenedclone 大大减少了绘制调用的数量。

如果这还不够快,另一种选择是以编程方式创建整个地图。也就是说,创建所有顶点并基于这些顶点创建一个 SCNGeometry。

另一个可能非常快的选项是使用 4 个顶点来创建一个平面,然后使用着色器和置换贴图来创建平铺贴图。

关于克隆和扁平克隆的部分也适用于具有相同几何形状的建筑物。

为了完整起见,如果不明显,您应该将相机的 https://developer.apple.com/documentation/scenekit/scncamera/1436621-usesorthographicprojection 属性设置为 true 以获得等距外观。

【讨论】:

  • 非常有用的答案! :) 如果我想要地形的变化,比如水和草地上的不同变化,该怎么办? (以及我将包括的其他“图块”)如果您看一下我链接的视频,您会注意到地图的图块有不同的变化。此外,相机将是可平移的,因此等距外观不会产生影响。
  • 如果这些变化存在于几何图形中,您可能仍然有许多相同的图块,那么它们应该被克隆和/或“展平”在一起。如果瓷砖的几何形状相同,每个克隆仍然可以分配有自己独特的材质,然后您仍然可以将它们展平为单个节点。如果图块有很多变化但地图数量有限,那么在 3D 建模软件中对整个地图进行建模和纹理处理可能会更好。
  • 我不明白可平移相机如何弥补正交投影。如果不启用该属性,则远处的图块将小于前面的图块,这也基于示例,这不是您想要的。
  • 没错,直到我查看了链接,我才知道您在说什么,我也不想这样。 (我也为我链接的 YouTuber 道歉,这是我能想到的第一个。也是我最喜欢的 YouTuber 之一;)
  • 在这种情况下,flattenedClone 可能会降低性能而不是提高性能。如果整个世界都被展平,SceneKit 将无法剔除屏幕上不可见的对象,并且将始终绘制所有内容。这是对 GPU 使用的巨大浪费。此外,通过展平,SceneKit 可以有效地利用实例化在单个绘制调用中绘制多个相似的对象。
猜你喜欢
  • 1970-01-01
  • 2014-09-05
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多