繁体   English   中英

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

[英]Mapping extremely high resolution to sphere in SceneKit

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

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

如果设置表示行星地图的SCNMaterialmipFilter属性,您将获得自动生成的mipmap。

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

这些都在2013 WWDC SceneKit谈话中提到。 2014年再次提到SCNLevelOfDetail :AAPLPresentationViewController中的mipmap生成和幻灯片58中的LOD。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM