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

时间:2016-11-07 19:49:12

标签: ios iphone scenekit

在我的iOS应用程序中,我有一组行星地图作为图像,有些大到14k分辨率。我可以将缩小版本应用于球体以在SceneKit中创建行星模型。 但是,我希望用户能够放大以查看全分辨率图像的详细信息。我也希望能够在没有我的应用程序耗尽内存的情况下执行此操作。 有没有办法自动将纹理平铺到像谷歌地图那样的球体,只在需要时加载零件和分辨率?

2 个答案:

答案 0 :(得分:1)

使用非常少的编程工作可以应用的两种优化技术是mipmap和详细程度。

如果您设置代表行星地图的mipFilter的{​​{1}}属性,您将获得自动生成的mipmap。

如果您为行星的SCNMaterial提供了一些SCNLevelOfDetail个实例,您将获得具有高度减少的多边形数量的版本,这将节省内存。

这些都在2013 WWDC SceneKit谈话中提及。 2014年再次提到SCNGeometry。2014年示例代码包含两个示例:AAPLPresentationViewController中的mipmap生成和幻灯片58中的LOD。

答案 1 :(得分:1)

您需要做的是将纹理分割成更小的部分,并根据细节级别提供不同的尺寸。当您的相机放大到足够深时,您可以使用具有最高分辨率的纹理,但您还需要限制要显示的纹理数量。当您显示行星的表面放大时,只能在屏幕上看到一小部分,但会缩小整个前表面。因此,将纹理分割成小块,并为其他缩放级别生成较低分辨率的纹理。您还需要创建自定义几何体并在其上指定小的高分辨率纹理片段。最后,您需要根据距离或视角决定要为哪个摄像机视图显示哪个纹理几何体。使用视锥体,您还需要确定在当前场景中看到哪些部分。我目前面临同样的问题。我已经使用SCNNode创建了所有子网格和所有较小的纹理(不要在这里加载纹理 - 它们只需要按需加载!)但是我没有工作用于测试子节点可见的解决方案。场景中截然不同的方法在这里没有帮助,因为它只进行了一个边界框测试,边界框很大,大部分将总是部分在视锥体内(所以我现在正试图实施我自己的测试)。并且您还需要一些表面法线来测试表面的正面是否指向相机的方向。不幸的是,因为我还没有工作解决方案,所以我不能在这里发布任何代码 - 我只能描述我的编码计划"这将是有效的(至少使用OpenGL我已经实现了几年前的事情)。也许解决方案背后的基本思想已经对您有所帮助?否则,也许我们可以一起找出其余的......: - )