如何使用大量的3d模型

How to use a large number of 3d models

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

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

创建 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;

你可以这样做

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

}

这不是技术性的回答,更多的是描述如何管理多边形的复杂性和表现。

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

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

根据距离、模型的复杂程度以及您使用的照明和材料,答案会有所不同。

自从计算机上的 3D 艺术被首次构思和创造以来,一切都是 "hack" 在硬件限制下欺骗观众的演示。

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

因此,花时间去发现 detail/complexity 和感知的所有这些技巧是非常值得的。

其中一些是:

  • 纹理烘焙
  • 平滑顶点
  • LOD 交换
  • 正常Mapping/baking
  • 背面剔除

还有很多其他的。

也许最好的起点是:

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

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