ios - 如何使用 3D 对象创建等距图 block map

标签 ios swift 3d sprite-kit scenekit

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

起初,我以为我可以结合使用 SpriteKit 和 SceneKit。我会生成 2D SKTileMapNode,然后允许玩家在其上构建 3D 建筑。但这效果不佳,因为 SKTileMapNode 不容易平移或缩放。

我的第二个想法是随机构建一个 SKTileMap(我知道如何轻松做到),然后将其用作构建 3D 场景的引用。这将使我能够完全控制什么去哪里,但有一个问题。每个 3D block (代表 tileMap 中的一个图 block )都将被视为一个节点并导致巨大的性能问题,这与 SpriteKits SKTileMapNode 不同,后者在图 block 填充后将图 block map 视为单个大节点。

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

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

最佳答案

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

我认为您的问题应该是“如何在 Scenekit 中以良好的性能渲染 3D 瓦片 map ”,因为 imo Scenekit 绝对是实现这一目标的方法,而且它肯定可以防止那些“巨大的性能问题”。

对于初学者,您如何创建磁贴?如果您使用内置原语,则可以通过使用来自 dae 或 obj 文件的图 block ,甚至通过编程方式创建它来获得巨大的性能提升。

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

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

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

还有一个可能非常快速的选择是使用 4vertices 创建一个平面,然后使用着色器和置换贴图创建平铺贴图。

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

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

关于ios - 如何使用 3D 对象创建等距图 block map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442655/

相关文章:

ios - 在 Swift 2 中从 slider 值执行计算

ios - 使用 UIModalPresentationStyleCurrentContext 呈现 View Controller 时的布局问题

ios - Xcode-编译Swift段错误11

Swift:从一个 View 转换到另一个 View 时的动画效果

graphics - MeshLab:使用我自己计算的法线渲染 obj 文件

python - 时代问题的秒数

python - 使用 Mayavi 和 tvkt 进行纹理映射

ios - 是否可以选择多个 MKAnnotationViews?

ios - 网点是零?

ios - 如何创建带有移动箭头的滑动开始按钮