如何使用大量的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 模型演示)中考虑感知的优化有多少思考和考虑。
目前我在 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 模型演示)中考虑感知的优化有多少思考和考虑。