SceneKit开发教程02 | SCNScene和SCNView

SceneKit开发教程02 | SCNScene和SCNView,第1张

本文结构如下:

开始之前,需要做一个名词的中英文对照。

SCNScene对象表示三维场景及其内容 。节点组成的层级结构(树形结构)构成整个场景的骨架,相机、灯光、几何体等“内容”附着在节点上,这些节点以及附着在节点上属性,构成了一个可见的3D场景。

场景通过 SCNView 、 SCNLayer (仅限macOS)或 SCNRenderer 来展示,这几个展示类都遵循 SCNSceneRenderer 协议,该协议定义这些类共享的属性和方法。

SCNScene类还提供读写场景文件的界面。

一般,可以使用一些软件,比如3Dsmax、maya,来制作3D场景,然后将这些场景文件导入到项目中来。

SceneKit提供了如下API来加载场景文件:

SceneKit 还提供了一个API,从Model I/O资源中加载场景:

Model I/O此处不做展开讲述,你知道有这种方法即可。

回忆我们之前创建的空AR项目,里面都会有个art.scnassets。

文件夹里存放场景资源(示例中的ship.scn)和纹理资源(示例中的texture.png),Xcode会优化这些资源,以便在每个设备上获得最佳性能,比如说应用瘦身和按需加载资源。

这部分内容,我在《 SceneKit | 加载 3D模型(obj/scn/dae)到你的AR项目中 》中,有demo演示!

SceneKit 提供了创建场景的类方法:

调用这个方法可以创建一个空场景,这个空场景只包含一个“不包含任何内容的 root 节点”,可以通过在root节点上添加子节点的方式,来创建一个场景。

这个功能是很重要的,比如,我们团队另外一位同事最近在做的一件事儿就是,将 ARKit 输出 含有深度数据的 ARFaceGeometry 人脸从iPhone X中导出来,然后利用3D打印设备打印人脸。我下面介绍的方法就是导出人脸的其中一种方式。

SceneKit 提供了 保存场景方法:

改方法可以将SceneKit的场景写入到文件中,文件的格式由 *** 作系统 你指定的文件后缀 来决定:

上面讲述了一些高频使用的API,SCNScene更多的API可以自行前往 开发者文档 查询。

SCNView继承自UIView,用来展示SceneKit 3D内容。

系统提供了如下init方法:

通过设置 scene 属性,在view上显示指定的场景。

SCNView 提供了三个方法,来管理当前场景中的动画:

SCNView 提供了一个快照当前场景的方法,可以将当前的场景渲染到新的图像对象上:

下一篇 《iOS 11 SceneKit开发教程03 | 使用SCNNode &&SCNReferenceNode定义场景结构》 ,会介绍SCNNode和SCNReferenceNode相关内容。

ios8之后苹果推出了一个3D模型渲染框架。SceneKit。但是国内针对这方面的教程并不是很多。前两天搞了一下也是一头雾水,终于把最基础的内容搞明白了之后,写下这篇随笔作为cnblogs的开篇,希望能一直写下去。

SceneKit现在可以支持有限的几种模型,截止到我写这篇文章为止似乎只有.dae和.abc后一种模型我没有使用过。这篇文章只针对.dae模型写。

首先如果是希望加载一个已有的,不需要程序在运行的时候动态添加的dae模型。那么我们可以直接新建一个game类型的工程。在选项中选择SceneKit,在程序中加载自带模型的那句话中将模型名称替换即可。本文主要讲一下如何导出dae模型,并在server端动态下载并显示。

首先我们手中有一个.stl或者其他的模型文件,将模型文件转换成.dae文件我使用Blender。

(1)在Blender中新建场景

(2)在右上侧栏中将自动生成的Cube、Camera等3个物体删掉

(3)导入我们已有的模型文件

(4)调整我们的模型文件的方向、大小

(5)在右上侧栏更改模型文件及子文件的名字为你要导出的dae文件的名字(这一步很重要!)

(6)在左侧栏中Edit Options中点击Smooth

(7)File->export->dae

(8)在接下来的页面中,我们选择导出的位置和文件的名字,并且在左侧选项Texture中选择include material texture(同样重要!)

接下来我们在桌面上新建一个文件夹,暂时起名为model,更改后缀为.scnassets,将我们生成好的模型文件拷贝进去。SceneKit对于动态添加文件夹写了两个脚本。不太清楚作用原理是什么,以后再研究吧。暂时知道怎么用就行。将copySceneKitAssets、scntool文件拷贝到model.scnassets所在的目录下,进入终端并cd到该目录下,运行

1 ./copySceneKitAssets model.scnassets -o model-o.scnassets

如果终端没有报错,并且生成了model-o.scnassets,则代表运行成功。

接下来我们把生成的model-o.scnassets文件打包成zip文件,目的是为了能让iPhone客户端下载的时候文件更小。

打包好了之后上传至服务器即可。

两个可执行文件下载链接 http://download.csdn.net/detail/u013588047/8937773

接下来是重头戏,如何在程序中下载,解压,并显示呢。

下载解压我使用了两个开源框架 AFNetworking 和 SSZipArchive ,朋友们可以自行查阅使用方法。

一步一步来,先是下载,解压

1 - (void)downloadZip {

2

3 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]

4 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]

5 //这里我们用本地链接替代一下,可以使用任意url链接

6 NSURL *URL = [NSURL URLWithString:@"file:///User/name/Desktop/model.scnassets.zip"]

7 NSURLRequest *request = [NSURLRequest requestWithURL:URL]

8

9 NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {

10 NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]

11 return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]

12 } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {

13 NSLog(@"File downloaded to: %@", filePath)

14

15 //对文件解压

16 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)

17 NSString *documentsDirectory = [paths objectAtIndex:0]

18 NSString *inputPath = [documentsDirectory stringByAppendingPathComponent:@"/product-1-optimized.scnassets.zip"]

19

20 NSError *zipError = nil

21

22 [SSZipArchive unzipFileAtPath:inputPath toDestination:documentsDirectory overwrite:YES password:nil error:&zipError]

23

24 if( zipError ){

25 NSLog(@"[GameVC] Something went wrong while unzipping: %@", zipError.debugDescription)

26 }else {

27 NSLog(@"[GameVC] Archive unzipped successfully")

28 [self startScene]

29 }

30

31 }]

32 [downloadTask resume]

33 }

而对于3d模型场景的创建,我们使用SCNSceneSource,代码如下

1 NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]

2//这里的dae文件名字是我们导出时定义的文件名,下面一段代码中加载的SCNNode是我们之前在面板中改过的模型名

3 documentsDirectoryURL = [documentsDirectoryURL URLByAppendingPathComponent:@"model.scnassets/cube.dae"]

4

5 SCNSceneSource *sceneSource = [SCNSceneSource sceneSourceWithURL:documentsDirectoryURL options:nil]

然后我们加载.dae文件中的模型,作为一个SCNNode,名字为我们在一开始改过的模型名

1 SCNNode *theCube = [sceneSource entryWithIdentifier:@"Cube" withClass:[SCNNode class]]

最后我们设置一下灯光等效果,其实是新建game文件中设置好了的,我们要做的是将SCNNode *theCube加载到Scene中

// Create a new scene

SCNScene *scene = [SCNScene scene]

// create and add a camera to the scene

SCNNode *cameraNode = [SCNNode node]

cameraNode.camera = [SCNCamera camera]

[scene.rootNode addChildNode:cameraNode]

// place the camera

cameraNode.position = SCNVector3Make(0, 0, 15)

// create and add a light to the scene

SCNNode *lightNode = [SCNNode node]

lightNode.light = [SCNLight light]

lightNode.light.type = SCNLightTypeOmni

lightNode.position = SCNVector3Make(0, 10, 10)

[scene.rootNode addChildNode:lightNode]

// create and add an ambient light to the scene

SCNNode *ambientLightNode = [SCNNode node]

ambientLightNode.light = [SCNLight light]

ambientLightNode.light.type = SCNLightTypeAmbient

ambientLightNode.light.color = [UIColor darkGrayColor]

[scene.rootNode addChildNode:ambientLightNode]

// Add our cube to the scene

[scene.rootNode addChildNode:theCube]

// retrieve the SCNView

SCNView *scnView = (SCNView *)self.view

// set the scene to the view

scnView.scene = scene

// allows the user to manipulate the camera

scnView.allowsCameraControl = YES

// show statistics such as fps and timing information

scnView.showsStatistics = YES

// configure the view

scnView.backgroundColor = [UIColor blackColor]

这样我们就可以动态下载一个dae文件并显示了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7878088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存