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

Ios 在SceneKit中将极高分辨率映射到球体,ios,iphone,scenekit,Ios,Iphone,Scenekit,在我的iOS应用程序中,我有一组行星地图作为图像,有些分辨率高达14k。我可以将缩小的版本应用于球体,在SceneKit中创建行星模型。 但是,我希望用户能够放大以查看全分辨率图像的详细信息。我也希望能够做到这一点,而我的应用程序运行的内存不足。 有没有办法像谷歌地图那样自动将纹理平铺到球体上,并且只在需要时加载部分和分辨率 两种优化技术是mipmap和levelofdetail,您可以使用很少的编程工作来应用它们 如果设置代表行星地图的scnmatary的mipFilter属性,您将获得自动生

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

两种优化技术是mipmap和levelofdetail,您可以使用很少的编程工作来应用它们

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

如果您为您的星球的
scngometry
提供一些
SCNLevelOfDetail
实例,您将获得多边形计数大大减少的版本,这将节省内存


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

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

从我使用mipFilter进行的不科学的测试来看,内存使用率似乎在缩放级别上保持不变。对象上的8k纹理占用了约400mb的内存,无论该对象是超小的、很远的还是很近的。我使用的是线性滤波器模式。还有什么我必须实现的吗?