ios开发scenekit导入模型后如何让模型动起来?
SceneKit现在可以支持有限数量的模型。截止到写这篇文章的时候,似乎只有。dae和。abc是后面的型号,我没用过。这篇文章只是为。dae型号。
首先,如果要加载一个已有的dae型号,不需要在程序运行时动态添加。然后我们可以直接新建一个游戏类型的项目。在选项中选择SceneKit,在程序中加载自含模型的句子中替换模型名称。本文主要讲述如何导出dae模型,并在服务器端动态下载显示。
首先我们手里有一个. stl或者其他模型文件。我使用Blender将模型文件转换为. dae文件。
(1)在Blender中创建新场景
(2)在右上方的侧边栏中删除三个自动生成的对象,如立方体和相机。
(3)导入我们现有的模型文件
(4)调整我们的模型文件的方向和大小。
(5)将模型文件和子文件的名称在右上侧边栏改为你要导出的dae文件的名称(这一步很重要!)
(6)在左栏的编辑选项中单击平滑。
(7)文件-->导出->;航空学博士(doctorofaeronautics的缩写)
(8)在下一页中,我们选择导出位置和文件的名称,并在左侧选项中选择包括材质纹理(同样重要!)
接下来,我们在桌面上创建一个新文件夹,暂时命名为model,将后缀改为。scnassets,并将我们生成的模型文件复制到其中。SceneKit写了两个动态添加文件夹的脚本。我不确定作用原理是什么。以后再研究吧。只是暂时知道怎么用而已把copySceneKitAssets和scntool文件复制到model.scnassets所在的目录,进入终端cd到这个目录,运行。
1 ./copySceneKitAssets model . SCR assets-o model-o . SCR assets
如果终端没有报告错误,并且生成了model-o.scnassets,则意味着操作成功。
接下来,我们将生成的model-o . scna sets文件打包成一个zip文件,以便在iPhone客户端下载它时使文件变得更小。
打包上传到服务器就行了。
两个可执行文件下载链接assets . zip "];
7 NSURLRequest * request =[nsurlrequestwithfurl:URL];
八
9 nsurlsessiondownloadtask * downloadtask =[manager downloadtaskwithrequest:请求进度:nil destination:^nsurl *(nsurl * target path,NSURLResponse *response) {
10 NSURL * documentsDirectoryURL =[[NSFileManager default manager]URLForDirectory:NSDocumentDirectory indo domain:NSUserDomainMask appropertyforurl:nil create:NO error:nil];
11 return[documentsDirectoryURL URLByAppendingPathComponent:[response suggested filename]];
12 } completionhandler:^(nsurlresponse *响应,nsurl *文件路径,nserror *错误){
13 NSLog(@“文件下载到:%@”,文件路径);
14
15 //解压缩文件
16 NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
17 ns string * documents directory =[paths objectAtIndex:0];
18 ns string * input path =[documents directory stringByAppendingPathComponent:@ "/product-1-optimized . scna sets . zip "];
19
20 NSError * zipError = nil
21
22[sszip archive unzipFileAtPath:input path to destination:documents directory overwrite:YES password:nil error:& amp;zip error];
23
24 if( zipError ){
25 NSLog(@"[GameVC]解压缩时出错:%@ ",zip error . debug description);
26 }其他{
27 NSLog(@[GameVC]存档解压成功);
28【self start scene】;
29 }
30
31 }];
32【下载任务简历】;
33 }
对于3d模型场景的创建,我们使用SCNSceneSource,代码如下。
1 NSURL * documentsDirectoryURL =[[NSFileManager default manager]urlforderiory:NSDocumentDirectory indo domain:NSUserDomainMask approportforurl:nil create:NO error:nil];
2//这里的dae文件名是我们导出时定义的文件名,下面代码中加载的SCNNode是我们之前在面板中更改的型号名称。
3 documentsDirectoryURL =[documentsDirectoryURL URLByAppendingPathComponent:@ " model . scna sets/cube . DAE "];
四
5 SCNSceneSource * sceneSource =[SCNSceneSource sceneSourceWithURL:documentsDirectoryURL options:nil];
然后,我们将模型加载到。dae文件作为一个SCNNode,它具有我们在开始时更改的型号的名称。
1 SCN node * the Cube =[scene source entry with identifier:@ " Cube " with class:[SCN node class]];
最后,让我们来设置灯光和其他效果,这些实际上是在新的游戏文件中设置的。我们需要做的是将SCNNode *立方体加载到场景中。
//创建一个新场景
SCN scene * scene =[SCN scene scene];
//创建摄像机并将其添加到场景中
SCN node * camera anode =[SCN node node];
camera anode . camera =[SCN camera camera];
[scene . root node add child node:camera anode];
//放置摄像机
camera anode . position = scnvector 3 make(0,0,15);
//创建灯光并添加到场景中
SCN node * light node =[SCN node node];
light node . light =[SCNLight light];
light node . light . type = SCNLightTypeOmni;
light node . position = SCN vector 3 make(0,10,10);
[scene . root node add child node:light node];
//创建环境光并添加到场景中
SCN node * ambient lightnode =[SCN node node];
ambientlight node . light =[SCN light light];
ambientlight node . light . type = SCNLightTypeAmbient;
ambientlight node . light . color =[ui color dark gray color];
[scene . root node add child node:ambientlight node];
//将我们的立方体添加到场景中
[scene . root node add child node:the cube];
//检索SCNView
SCN view * SCN view =(SCN view *)self . view;
//将场景设置为视图
scnView.scene = scene
//允许用户操纵摄像机
SCN view . allows camera control = YES;
//显示统计信息,如fps和时序信息
SCN view . shows statistics = YES;
//配置视图
SCN view . background color =[ui color black color];
因此,我们可以动态下载一个dae文件并显示它。