如何使用3D对象

时间:2018-01-25 12:16:02

标签: ios swift 3d sprite-kit scenekit

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

起初,我以为我可以将SpriteKit和SceneKit结合起来。我将生成2D SKTileMapNode,然后允许玩家在其上构建3D建筑物。但是那也不会起作用,因为SKTileMapNodes不容易浮雕或缩放。

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

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

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

1 个答案:

答案 0 :(得分:2)

“每个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。

另一个可能是超快的选择,就是使用4vertices创建一个平面,然后使用着色器和置换贴图来创建平铺地图。

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

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