代码之家  ›  专栏  ›  技术社区  ›  E. Huckabee

如何使用三维对象创建等轴测平铺贴图

  •  1
  • E. Huckabee  · 技术社区  · 6 年前

    所以,我正在构建一个基本的大亨游戏。在这个游戏中,我想有一个简单的3D生成的平铺地图,玩家可以在上面构建。我需要将平铺贴图设置为3D(或具有3D外观),因为我希望能够在播放器能够构建的3D模型上使用一些真实的着色器。

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

    我的第二个想法是随机构建一个SKTileMap(我知道如何轻松实现),然后将其用作构建3D场景的参考。这将使我能够完全控制什么东西去哪里,但有一个陷阱。与SpriteKits SKTileMapNode不同,每个3D块(表示tileMap中的一个平铺)将被视为一个节点,并会导致巨大的性能问题,SpriteKits SKTileMapNode将平铺贴图填充后视为单个大节点。

    我宁愿不使用等距SKTileMap,因为这不允许玩家能够平移/缩放地图,从而减少我希望通过此游戏实现的深度和感觉。

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   Xartec    6 年前

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

    我认为您的问题应该是如何在Scenekit中渲染性能良好的3D平铺贴图,因为imo Scenekit无疑是一种方法,并且可以防止这些巨大的性能问题。

    对于初学者,如何创建平铺?如果使用内置原语,通过使用dae或obj文件中的平铺,甚至通过编程方式创建平铺,可以获得巨大的性能提高。

    如果整个平铺都是相同的模型,则应仅添加一次,然后为所有其他平铺克隆该平铺: https://developer.apple.com/documentation/scenekit/scnnode/1408046-clone (注意,您必须创建材质的副本并将其指定给克隆,以防止其在所有平铺中共享)。

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

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

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

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

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