在SceneKit中映射极高分辨率的球体



在我的iOS应用中,我有一组行星地图作为图像,有些分辨率高达14k。我可以在SceneKit中应用缩小版本的球体来创建行星模型。但是,我希望用户能够放大以查看全分辨率图像上的细节。我也希望能够做到这一点,没有我的应用程序运行内存不足。是否有一种方法可以像谷歌地图一样自动将纹理平铺到球体上,并且只在需要时加载部件和分辨率?

您可以使用很少的编程工作来应用两种优化技术:mipmap和细节级别。

如果你设置SCNMaterialmipFilter属性代表你的行星地图,你会得到一个自动生成的mipmap。

如果你为你的星球的SCNGeometry提供一些SCNLevelOfDetail实例,你将得到多边形数量高度减少的版本,这将节省内存。

这些都是在2013年WWDC SceneKit演讲中提到的。SCNLevelOfDetail在2014年再次被提及。2014年的示例代码有两个示例:AAPLPresentationViewController中的mipmap生成和幻灯片58中的LOD。

你需要做的是将纹理分成更小的部分,并根据细节水平提供不同的大小。当你的相机放大到足够深时,你可以使用最高分辨率的纹理,但你也需要限制要显示的纹理数量。当你把一颗行星的表面放大时,屏幕上只能看到它的一小部分,但把它放大后,整个表面就会显示出来。因此,将纹理分割成小块,并为其他缩放级别生成较低分辨率的纹理。你还需要创建自定义几何体,并在上面分配小的高分辨率纹理块。最后,你将需要根据距离或视角决定为哪个相机视图显示哪个纹理几何。使用视锥台,您还需要决定在当前场景中看到哪些部分。我现在也面临着同样的问题。我已经使用SCNNode创建了所有的子网格和所有较小的纹理(不要在这里加载纹理-它们只需要按需加载!),但是我没有一个有效的解决方案来测试哪些子节点是可见的。场景的isvisible inside frustof方法在这里没有帮助,因为它只做一个边界框测试,而边界框太大了,它们中的大多数总是部分位于视图的范围内(所以我目前正在尝试实现我自己的测试)。你还需要一些表面法线来测试表面的正面是否指向相机的方向。不幸的是,因为我仍然没有可行的解决方案,所以我不能在这里发布任何代码——我只能描述我的"编码计划",这将是可行的(至少使用OpenGL,我已经在几年前实现了类似的东西)。也许解决方案背后的基本思想已经对你有帮助了?否则,也许我们可以一起找出剩下的……: -)

最新更新