ios开发scenekit导入模型后如何让模型动起来?

在ios8之后,苹果推出了3D模型渲染框架。SceneKit .但是国内这方面的教程并不多。前两天,我也很迷茫。在我终于明白了最基本的内容之后,我写了这篇短文作为cnblogs的开篇,希望能一直写下去。

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文件并显示它。