iOS - Scenekit3D引擎初探之 - 导入模型+上传服务器+下载并简单设置


SceneKit是ios8之后苹果推出了一个3D模型渲染框架。
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 sceneSCNScene *scene = [SCNScene scene];

// create and add a camera to the sceneSCNNode *cameraNode = [SCNNode node];cameraNode.camera = [SCNCamera camera];[scene.rootNode addChildNode:cameraNode];

// place the cameracameraNode.position = SCNVector3Make(0, 0, 15);

// create and add a light to the sceneSCNNode *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 sceneSCNNode *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 SCNViewSCNView *scnView = (SCNView *)self.view;

// set the scene to the viewscnView.scene = scene;

// allows the user to manipulate the camerascnView.allowsCameraControl = YES;

// show statistics such as fps and timing informationscnView.showsStatistics = YES;

// configure the viewscnView.backgroundColor = [UIColor blackColor];

这样我们就可以动态下载一个dae文件并显示了。
时间: 2024-10-23 08:02:09

iOS - Scenekit3D引擎初探之 - 导入模型+上传服务器+下载并简单设置的相关文章

Struts2上传与下载文件 简单例子

之前转载过一篇上传与下载的文章 ,参考一下自己整理验证了一下 package com.jereh.edu.entity; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Uns

iOS - Scenekit3D引擎初探之 - 给材质贴图

今天简单说一下 SceneKit 给材质贴图. 1,最简单的一种方法,直接打开dae 或者 scn 文件直接设置  如上图,这个dae 文件中只有一个几何体,几何体中只有一个材质球,然后设置材质球的diffuse 属性就可以了. 2,代码设置,还是针对这个最简单的dae 文件 ceilNode.geometry.firstMaterial.diffuse.contents = [UIColor redColor]; //可以设置颜色 ceilNode.geometry.firstMaterial

n文件的上传和下载,struts2和springmvc

首先,struts2的上传下载的配置 因为struts2是配置的上传的拦截器,很简单的步揍就可以上传, 首先是配置struts的action映射 <!-- 4. 修改上传文件的最大大小为30M --> <constant name="struts.multipart.maxSize" value="31457280"/> <!-- 注意: action 的名称不能用关键字"fileUpload" --> <

基于tcp协议的登录,文件上传和下载

? [1]先登录,登录不成功循环登录,直到成功.登录成功后可以选择上传或者下载,上传有对应的文件,可选择上传哪个:下载有对应的文件,可选择下载哪个 ? [2]登录,上传,下载时最好设置状态码,客户端和服务端约定好状态码,操作成功或者失败后,发送对应的状态码.注意,每一个操作要有唯一的状态码. ? 比如: 登录成功 100 登录失败 101 ? 注册成功 102 注册失败 103 ? 上传成功 104 上传失败 105 ? 下载成功 106 下载失败 107 ? [3]也可以用字典: dic =

ios网络学习------11 原生API文件上传之断点续传思路

#import "MainViewController.h" @interface MainViewController () @end @implementation MainViewController - (void)viewDidLoad { [super viewDidLoad]; //下载文件 [self download]; } -(void)download { //1. NSURL NSURL *url = [NSURL URLWithString:@"ht

iOS开发中文件的上传和下载功能的基本实现-备用

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc

iOS利用AFNetworking(AFN) 实现图片上传

1.上传图片以二进制流的形式上传 1 #pragma mark - 文件上传  2 - (IBAction)uploadImage  3 {  4     /*  5      此段代码如果需要修改,可以调整的位置  6        7      1. 把upload.php改成网站开发人员告知的地址  8      2. 把file改成网站开发人员告知的字段名  9      */ 10     // 1. httpClient->url 11      12     // 2. 上传请求P

iOS NSURLSession 实现网络请求-文件下载-上传-后台下载

*  会话NSURLSession NSURLConnection通过全局状态来管理cookies, 认证信息等公共资源, 如果两个连接需要使用不同的资源配置情况时就无法解决, 这个问题在NSURLSession可以解决, NSURLSession同时对应着多个连接, 会话通过工厂方法来创建, 同一个会话中使用相同的状态信息, NSURLSession支持进程三种会话: 1. defaultSessionConfiguration : 进程内会话 (默认会话), 用来硬盘来缓存数据. 2. ep

优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

目录 一.Recorder H5录音库的特性 (1)浏览器支持 (2)功能支持 二.使用预览截图 (1)移动端H5 (2)IOS Hybrid App (3)Android Hybrid App 三.应用场景 四.优化过程记录 (1)为什么要升级优化 (2)开始使用Web Worker加速转码 (3)剩下的问题 五.Hybrid App存在的意义 六.更多支持 Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化