【问题标题】:How to use a large number of 3d models如何使用大量的 3d 模型
【发布时间】:2018-09-05 16:49:08
【问题描述】:

目前我在 SceneKit 中使用多个模型时遇到问题。我有一个 .dae 格式的 1MB 3d 对象文件。当我尝试大量使用这些(比如说 1000 个模型)时,应用程序的内存会增加并且应用程序崩溃。我什至使用场景工具包内置函数clone()flattenedClone() 来制作模型的副本。我该怎么办?

【问题讨论】:

  • 我觉得scenekit粒子系统可以完成你的工作
  • 能否详细说明。

标签: ios swift scenekit


【解决方案1】:

有很多顶点需要推动。你真的需要一次加载它们吗?你能简化模型吗?

创建SCNLevelOfDetail 实例会有所帮助。这在 WWDC 2014 SceneKit 幻灯片示例代码中的 AAPLSlideLOD.m 中有说明。

NSMutableArray *levelsOfDetail = [NSMutableArray array];

for (NSUInteger i = 1; i < 5; i++) {

    SCNNode *teapotNode = [self.groundNode childNodeWithName:[NSString stringWithFormat:@"Teapot%lu", (unsigned long)i] recursively:YES];
    SCNGeometry *teapot = teapotNode.geometry;

    // Unshare the material because we will highlight the different levels of detail with different colors in the next step
    teapot.firstMaterial = [teapot.firstMaterial copy];

    // Build the SCNLevelOfDetail instance
    SCNLevelOfDetail *levelOfDetail = [SCNLevelOfDetail levelOfDetailWithGeometry:teapot worldSpaceDistance:distances[i - 1]];
    [levelsOfDetail addObject:levelOfDetail];
}

teapot.geometry.levelsOfDetail = levelsOfDetail;

【讨论】:

  • 是的,没错,我必须一次加载所有模型。如果使用 levelofdetails,我可以加载多少个模型?如果应用完全优化,它可以渲染多少个模型?
  • 一根绳子有多长? iPhone 6S 还是原装 iPad Mini?说真的,这个答案取决于很多事情。但为什么需要 12 平方英寸内可见的 1000 个高分辨率模型?
  • 非常感谢哈尔。我非常感谢您的回答。但我想要的不是所有高分辨率模型,而是可以是不太详细的模型,应该看起来像原始模型。只是想将数千个模型展示到一个场景中。有没有其他想法可以做同样的事情?
  • 这正是 levelOfDetail 的意义所在。但是,您必须进行修补,因为没有记录精确的限制/范围。试试看。如果它不起作用,你应该不接受我的回答,希望鼓励其他人参与进来。
【解决方案2】:

这不是一个技术性的答案,它更多的是对如何管理多边形复杂性和表示的描述。

LOD = 细节级别,虽然它是 Scene Kit 和其他 3D 应用程序和框架中的一个技术术语,但值得花点时间将这三个词视为对设备和观众/用户感知敏感度的预兆。

问问自己,在距相机视点的任何给定距离内,您的模型需要什么级别的细节。

答案会因距离、模型的复杂程度以及您使用的照明和材料而异。

自从计算机上的 3D 艺术最初被构思和创造以来,一切都是在演示中的“黑客”,以在硬件的限制下欺骗观众。

我们仍然(很大程度上)受到硬件的限制。

因此,花时间去发现所有这些细节/复杂性和感知技巧是非常值得的。

其中一些是:

  • 纹理烘焙
  • 平滑顶点
  • LOD 交换
  • 法线贴图/烘焙
  • 背面剔除

还有很多其他的。

也许最好的起点是这里:

http://www.katsbits.com/tutorials/blender/baking-normal-maps-from-models-advanced.php

因为这会让您了解在技术设计的一个方面(即 3D 模型演示)中考虑到感知优化需要多少思考和考虑。

【讨论】:

    【解决方案3】:

    你可以这样做

    int numberOfSpheres = 20;
    
    for(int i=0;i<numberOfSpheres;i++) {
    
    
        NSURL *itemUrl = [[NSBundle mainBundle] URLForResource:@"yourResourceScene" withExtension:@".dae"];
        SCNSceneSource *source = [SCNSceneSource sceneSourceWithURL:itemUrl options:nil];
        SCNGeometry *nodeGeometry = (SCNGeometry *)[source entryWithIdentifier:@"objectInScene" withClass:[SCNGeometry class]];
    
        SCNNode *myNode = [SCNNode nodeWithGeometry:nodeGeometry];
    
        [MainScene.rootNode addChildNode:myNode];
        // set position for each node here
        // set scale of each node here
    
        // set material of each node here
    
    }
    

    【讨论】:

    • 解释一下你的代码在做什么?这只是为场景添加了 20 个球体,但没有回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多