蘋果的ARKit2.0有多可怕,看了就知道

序言

ARKit主要由三部分組成:session

「WWDC2018」-ARKit2 革新 What’s New in ARKit 2

跟蹤(Tracking)框架

跟蹤是ARKit的核心組件之一,其提供了設備在物理世界中的位置與方向信息,並對物體進行跟蹤,如人臉。學習

2.場景理解(Scene Understanding)測試

場景理解經過學習更多關於環境的屬性,以對水平平面進行檢測,如地面或桌面;iOS 11.3開始還支持檢測垂直平面。這些在場景中平面可用於放置虛擬物體。此外,場景理解還會了解當前環境的光照狀況,以提供光照信息用於在虛擬場景中反映真實環境,避免過亮或過暗。atom

3.渲染(Rendering)線程

經過ARKit能夠很容易地集成你所選的渲染引擎。ARKit可經過SceneKit和SpriteKit渲染。Xcode中還提供了Metal模板,方便快速地開始你的加強現實體驗(augmented reality experience)項目。此外,Unity和Unreal也已經集成ARKit完整的功能集到他們主流的遊戲引擎中,所以你能夠經過這些引擎開始使用ARKit。3d

ARKit 2 新特性

主要新特性以下:code

  1. 保存與加載地圖(Saving and Loading Maps):用於支持持久化與多用戶體驗的強大新特性。
  2. 環境紋理(Environment Texturing):用於更逼真地渲染你的加強現實場景(augmented reality scene)。
  3. 圖像跟蹤(Image Tracking):對真實場景中的2D圖像進行跟蹤。
  4. 物體檢測(Object Detection):對真實場景中的3D物體進行跟蹤。
  5. 人臉跟蹤的提高(Face Tracking Enhancements)

若是你有更好的建議或者對這篇文章有不滿的地方, 請聯繫我, 我會進行修改, 聯繫我時,請備註ARKit新技術(技術交流羣:656315826)視頻

話很少說先上乾貨對象

1.AR技術簡介

ARKit是2017年6月6日,蘋果發佈iOS11系統所新增框架,它可以幫助咱們以最簡單快捷的方式實現AR技術功能。加強現實技術(Augmented Reality,簡稱 AR),是一種實時地計算攝影機影像的位置及角度並加上相應圖像、視頻、3D模型的技術,這種技術的目標是在屏幕上把虛擬世界套在現實世界並進行互動。

ARKit框架提供了兩種AR技術,一種是基於3D場景(SceneKit)實現的加強現實,一種是基於2D場景(SpriktKit)實現的加強現實

誤區解讀

ARKit雖然是iOS11新出的框架,但並非全部的iOS11系統均可以使用,而是必需要是處理器A9及以上纔可以使用,蘋果從iPhone6s開始使用A9處理器,也就是iPhone6及之前的機型沒法使用ARKit

開發的環境

1.Xcode版本:Xcode9及以上

2.iOS系統:iOS11及以上

3.iOS設備:處理器A9及以上(6S機型及以上)

4.MacOS系統:10.12.4及以上(安裝Xcode9對Mac系統版本有要求)

下來進入小項目實戰

ARKit物體跟隨相機移動流程介紹

1.搭建環境 2.搭建ARKit工做環境 3.開啓AR掃描 4.點擊屏幕添加一個3D虛擬物體

搭建環境

1.ARSCNView是UIView的子類的子類,因此從理論上來講,咱們應用框架UIKit是能夠加載AR場景的

1

2.給界面添加一個按鈕開啓AR之旅,建立一個ARSCNViewController:繼承於UIViewController,點擊按鈕跳轉到自定義ARSCNViewController

2

搭建ARKit工做環境

一個完整的ARKit工做環境必需要搭建三個對象:ARSCNView(一旦建立,系統會幫咱們建立一個場景Scene和相機),ARSession(開啓AR和關閉AR都是靠它),ARSessionConfiguration(少了會話追蹤配置,AR會話是沒法獨立工做的)

#import "ARSCNViewViewController.h"

//3D遊戲框架
#import <SceneKit/SceneKit.h>
//ARKit框架
#import <ARKit/ARKit.h>

@interface ARSCNViewViewController ()

//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

pragma mark -搭建ARKit環境

#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;
}

開啓AR掃描

咱們只須要先將AR視圖添加到當前UIView中,而後開啓AR會話便可開始咱們的AR之旅

這裏須要特別注意的是,最好將開啓ARSession的代碼放入viewDidAppear而不是viewDidLoad中,這樣能夠避免線程延遲的問題。

@implementation ARSCNViewViewController

- (void)viewDidLoad {
    [super viewDidLoad];


    // Do any additional setup after loading the view.
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    //1.將AR視圖添加到當前視圖
    [self.view addSubview:self.arSCNView];
    //2.開啓AR會話(此時相機開始工做)
    [self.arSession runWithConfiguration:self.arSessionConfiguration];

}

點擊屏幕添加一個3D虛擬物體(飛機)

默認狀況下,節點SCNNode的x/y/z位置是(0,0,0),也就是攝像頭所在的位置,每個ARSession在啓動時,攝像頭的位置就是3D世界的原點,並且這個原點再也不隨着攝像頭的移動而改變,是第一次就永久固定的

點擊屏幕添加飛機

(void)touchesBegan:(NSSet<UITouch *> )touches withEvent:(UIEvent )event
{
//1.使用場景加載scn文件(scn格式文件是一個基於3D建模的文件,使用3DMax軟件能夠建立,這裏系統有一個默認的3D飛機)--------在右側我添加了許多3D模型,只須要替換文件名便可
SCNScene scene = [SCNScene sceneNamed:@"Models.scnassets/ship.scn"];
//2.獲取飛機節點(一個場景會有多個節點,此處咱們只寫,飛機節點則默認是場景子節點的第一個)
//全部的場景有且只有一個根節點,其餘全部節點都是根節點的子節點
SCNNode shipNode = scene.rootNode.childNodes[0];

//3.將飛機節點添加到當前屏幕中
[self.arSCNView.scene.rootNode addChildNode:shipNode];
}

接下來下面就快拿起你的手機測試吧

項目代碼獲取

有步驟講解視頻以及資料.由於簡書文章沒有地方放.你們能夠加一下個人羣獲取一下。在羣裏討論一下ARKit這一塊。 QQ羣號:656315826.

相關文章
相關標籤/搜索