ARKit从入门到精通三部曲之三

此文章为转载文章:ARKit从入门到精通(3)-ARKit自定义实现

在上一小节中ARKit从入门到精通(2)-ARKit工作原理及流程介绍,我们完整的介绍了ARKit的工作原理,那么本小节我们就通过对ARKit工作原理的理解,手动的搭建一个ARKit虚拟增强现实环境

1.1-创建一个简单的工程

1.2-搭建ARKit工作环境

1.3-开启AR扫描

1.4-点击屏幕添加一个3D虚拟物体

1.5-效果展示

1.6-完整代码及代码下载地址

1.1-创建一个简单的工程

1.上一小节中介绍过,ARSCNView是UIView的子类的子类,所以从理论上来说,我们应用框架UIKit是可以加载AR场景的

0401.png

2.给界面添加一个按钮开启AR之旅,创建一个ARSCNViewController:继承于UIViewController,点击按钮跳转到自定义ARSCNViewController

0402.png

1.2-搭建ARKit工作环境

一个完整的ARKit工作环境必须要搭建三个对象:ARSCNView(一旦创建,系统会帮我们创建一个场景Scene和相机),ARSession(开启AR和关闭AR都是靠它),ARSessionConfiguration(少了会话追踪配置,AR会话是无法独立工作的)

定义全局属性

#import"ARSCNViewViewController.h"//3D游戏框架#import//ARKit框架#import@interfaceARSCNViewViewController()//AR视图:展示3D界面@property(nonatomic,strong)ARSCNView *arSCNView;//AR会话,负责管理相机追踪配置及3D相机坐标@property(nonatomic,strong)ARSession *arSession;//会话追踪配置:负责追踪相机的运动@property(nonatomic,strong)ARSessionConfiguration *arSessionConfiguration;//飞机3D模型(本小节加载多个模型)@property(nonatomic,strong)SCNNode*planeNode;@end

懒加载(笔者个人习惯)ARKit环境

#pragmamark -搭建ARKit环境//懒加载会话追踪配置- (ARSessionConfiguration *)arSessionConfiguration{if(_arSessionConfiguration!=nil) {        return_arSessionConfiguration;    }//1.创建世界追踪会话配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持ARWorldTrackingSessionConfiguration *configuration = [[ARWorldTrackingSessionConfiguration alloc] init];//2.设置追踪方向(追踪平面,后面会用到)configuration.planeDetection = ARPlaneDetectionHorizontal;_arSessionConfiguration= configuration;//3.自适应灯光(相机从暗到强光快速过渡效果会平缓一些)_arSessionConfiguration.lightEstimationEnabled = YES;    return_arSessionConfiguration;}//懒加载拍摄会话- (ARSession *)arSession{if(_arSession!=nil)    {        return_arSession;    }//1.创建会话_arSession= [[ARSession alloc] init];//2返回会话return_arSession;}//创建AR视图- (ARSCNView *)arSCNView{if(_arSCNView!=nil) {        return_arSCNView;    }//1.创建AR视图_arSCNView= [[ARSCNView alloc] initWithFrame:self.view.bounds];//2.设置视图会话_arSCNView.session = self.arSession;//3.自动刷新灯光(3D游戏用到,此处可忽略)_arSCNView.automaticallyUpdatesLighting = YES;    return_arSCNView;}

1.3-开启AR扫描

我们只需要先将AR视图添加到当前UIView中,然后开启AR会话即可开始我们的AR之旅

***这里需要特别注意的是,最好将开启ARSession的代码放入viewDidAppear而不是viewDidLoad中,这样可以避免线程延迟的问题。开启ARSession的代码可不可以放入viewDidLoad中呢?答案是可以的,但是笔者不建议大家那么做***

@implementationARSCNViewViewController- (void)viewDidLoad {    [superviewDidLoad];// Do any additional setup after loading the view.}- (void)viewDidAppear:(BOOL)animated{    [superviewDidAppear:animated];//1.将AR视图添加到当前视图[self.view addSubview:self.arSCNView];//2.开启AR会话(此时相机开始工作)[self.arSession runWithConfiguration:self.arSessionConfiguration];}

1.4-点击屏幕添加一个3D虚拟物体

默认情况下,节点SCNNode的x/y/z位置是(0,0,0),也就是摄像头所在的位置,每一个ARSession在启动时,摄像头的位置就是3D世界的原点,而且这个原点不再随着摄像头的移动而改变,是第一次就永久固定的

想要让飞机显示在你想要的位置,就需要更加深入的研究ARKit框架,需要了解ARKit的坐标系及API,笔者将会在下一小节慢慢介绍

pragma mark- 点击屏幕添加飞机

(void)touchesBegan:(NSSet)touches withEvent:(UIEvent)event

{

//1.使用场景加载scn文件(scn格式文件是一个基于3D建模的文件,使用3DMax软件可以创建,这里系统有一个默认的3D飞机)--------在右侧我添加了许多3D模型,只需要替换文件名即可

SCNScenescene = [SCNScene sceneNamed:@"Models.scnassets/ship.scn"];

//2.获取飞机节点(一个场景会有多个节点,此处我们只写,飞机节点则默认是场景子节点的第一个)

//所有的场景有且只有一个根节点,其他所有节点都是根节点的子节点

SCNNode

shipNode = scene.rootNode.childNodes[0];

//3.将飞机节点添加到当前屏幕中

[self.arSCNView.scene.rootNode addChildNode:shipNode];

}

1.5-效果展示

在笔者Xcode左侧已经导入了好几个3D模型,只需要修改文件名既可以加载不同的3D模型,注意路径区别

0403.png

飞机

0404.gif

来张椅子坐一下吧

椅子比较大,我们需要适当调整一下位置

0405.png

0405.gif

1.6-完整代码及代码下载地址

完整代码

#import"ARSCNViewViewController.h"//3D游戏框架#import//ARKit框架#import@interfaceARSCNViewViewController()//AR视图:展示3D界面@property(nonatomic,strong)ARSCNView *arSCNView;//AR会话,负责管理相机追踪配置及3D相机坐标@property(nonatomic,strong)ARSession *arSession;//会话追踪配置:负责追踪相机的运动@property(nonatomic,strong)ARSessionConfiguration *arSessionConfiguration;//飞机3D模型(本小节加载多个模型)@property(nonatomic,strong)SCNNode*planeNode;@end@implementationARSCNViewViewController- (void)viewDidLoad {    [superviewDidLoad];// Do any additional setup after loading the view.}- (void)viewDidAppear:(BOOL)animated{    [superviewDidAppear:animated];//1.将AR视图添加到当前视图[self.view addSubview:self.arSCNView];//2.开启AR会话(此时相机开始工作)[self.arSession runWithConfiguration:self.arSessionConfiguration];}#pragma mark- 点击屏幕添加飞机- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{//1.使用场景加载scn文件(scn格式文件是一个基于3D建模的文件,使用3DMax软件可以创建,这里系统有一个默认的3D飞机)--------在右侧我添加了许多3D模型,只需要替换文件名即可SCNScene*scene = [SCNScenesceneNamed:@"Models.scnassets/chair/chair.scn"];//2.获取飞机节点(一个场景会有多个节点,此处我们只写,飞机节点则默认是场景子节点的第一个)//所有的场景有且只有一个根节点,其他所有节点都是根节点的子节点SCNNode*shipNode = scene.rootNode.childNodes[0];//椅子比较大,可以可以调整Z轴的位置让它离摄像头远一点,,然后再往下一点(椅子太高我们坐不上去)就可以看得全局一点shipNode.position =SCNVector3Make(0,-1,-1);//x/y/z/坐标相对于世界原点,也就是相机位置//3.将飞机节点添加到当前屏幕中[self.arSCNView.scene.rootNode addChildNode:shipNode];}#pragma mark -搭建ARKit环境//懒加载会话追踪配置- (ARSessionConfiguration *)arSessionConfiguration{if(_arSessionConfiguration !=nil) {return_arSessionConfiguration;    }//1.创建世界追踪会话配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持ARWorldTrackingSessionConfiguration *configuration = [[ARWorldTrackingSessionConfiguration alloc] init];//2.设置追踪方向(追踪平面,后面会用到)configuration.planeDetection = ARPlaneDetectionHorizontal;    _arSessionConfiguration = configuration;//3.自适应灯光(相机从暗到强光快速过渡效果会平缓一些)_arSessionConfiguration.lightEstimationEnabled =YES;return_arSessionConfiguration;}//懒加载拍摄会话- (ARSession *)arSession{if(_arSession !=nil)    {return_arSession;    }//1.创建会话_arSession = [[ARSession alloc] init];//2返回会话return_arSession;}//创建AR视图- (ARSCNView *)arSCNView{if(_arSCNView !=nil) {return_arSCNView;    }//1.创建AR视图_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];//2.设置视图会话_arSCNView.session =self.arSession;//3.自动刷新灯光(3D游戏用到,此处可忽略)_arSCNView.automaticallyUpdatesLighting =YES;return_arSCNView;}- (void)didReceiveMemoryWarning {    [superdidReceiveMemoryWarning];// Dispose of any resources that can be recreated.}/*

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

// Get the new view controller using [segue destinationViewController].

// Pass the selected object to the new view controller.

}

*/@end

代码下载地址

http://download.csdn.net/detail/u013263917/9867258

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容