美文网首页iOS_苹果系统框架研究
(苹果框架学习)00001_ARkit.framework苹果框

(苹果框架学习)00001_ARkit.framework苹果框

作者: lyh165 | 来源:发表于2018-08-18 21:18 被阅读0次

    文丨lyh165
    发布时间:2018-08-17(周五 广州/雨)
    最后更新时间:2018-08-20 (周一 广州/晴)


    之前版本
    V1.0.1 开启第一个AR项目 (2018-08-17 周五 广州/雨)
    V1.0.2 添加苹果ARkit框架每个类的官方文档、示例代码、技术文章、视频讲解 (2018-08-18 周六 广州/晴)
    V1.0.3 添加demo的workspace和官方demo (2018-08-18 周六 广州/晴)

    本次更新
    V1.0.4 对苹果官方技术文章和示例代码进行简化翻译理解 (2018-08-20 周一 广州/晴)

    后续将更新
    ...敬请期待


    零、关键词

    <坐标系的表示>:(x,y,z)(x:左右,y:上下,z:前后) 
    <iOS3d包含 position、Euler、Scale> (position表示坐标系,Scale表示每个坐标的大小)
    世界坐标
    本地坐标
    场景
    帧
    <锚> : 是网页制作中超级链接的一种,又叫命名锚记。命名锚记像一个迅速定位器一样是一种页面内的超级链接,运用相当普遍。
    会话
    <映射> : 指两个元素的集之间元素相互“对应”的关系、两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射
    <投影矩阵> :https://www.cnblogs.com/wonderKK/p/5695116.html
    
    00、xyz坐标系.png

    一、ARKit类的官方文档

    框架标记
    📃 表示Article 说明是一篇技术文章
    C 表示class 说明是一个类
    M 表示method 说明是一个方法
    P 表示property 说明是一个属性
    Pr 表示protocol 说明是一个协议
    E 表示 Enumeration 说明是一个枚举
    
    K 表示 Enumeration Case 说明是一个枚举里面的一个常量
    V 表示 Global Variable 说明是一个全局变量
    {} 表示Sample Code 说明是示例代码
    
    
    ----
    Declaration 宣言
    Discussion 讨论
    Parameters 参数
    Return Value 返回值
    Overview    概述 (简单描述该类是干什么用的)
    Topics 主题 (拥有哪些方法)
    Relationships 关系 (继承于谁)
    See Also    另请参阅
    

    框架和类
    ARKit
    1、ARKit/ARSession
    2、ARKit/ARConfiguration
    3、ARKit/ARWorldTrackingConfiguration
    4、ARKit/AROrientationTrackingConfiguration
    5、ARKit/ARPlaneAnchor
    6、ARKit/ARFaceTrackingConfiguration
    框架和类
    7、ARKit/ARFaceAnchor
    8、ARKit/ARSCNView
    9、ARKit/ARSKView
    10、ARKit/ARReferenceImage
    11、ARKit/ARImageAnchor
    12、ARKit/ARHitTestResult
    13、ARKit/ARAnchor
    14、ARKit/ARTrackable
    15、ARKit/ARFrame
    16、ARKit/ARCamera
    17、ARKit/ARLightEstimate
    18、ARKit/ARDirectionalLightEstimate

    技术文章
    ------第一篇------
    1、About Augmented Reality and ARKit 了解ARKit中的世界跟踪
    知识点:
    1.世界分两个两种空间 (真实世界空间、虚拟空间)
    2.坐标系遵守右手定律
    y轴向上指向,并且(当相关时)z轴指向观察者并且x轴指向观察者的右侧。
    3.世界跟踪使用了一种称为视觉惯性测距法的技术。
    视觉惯性测距法 使用的是:iOS设备的运动感应硬件的信息与设备相机可见场景的计算机视觉分析相结合
    4.命中测试法,是世界跟踪用来分析和理解场景的内容实用的。
    对应ARKit的类是 ARHitTestResultplaneDetection
    ⚠️:世界追踪是一门不精准的科学。提高质量需要:
    1.清晰的图像
    2.不要频繁过度移动设备。比如 过快 或 激烈摇晃
    3.检测平面需要空出一点时间。需要大量算法计算
    ------第二篇------
    2、Displaying an AR Experience with Metal

    示例代码
    1、Building Your First AR Experience 建立您的第一个AR体验
    2、Handling 3D Interaction and UI Controls in Augmented Reality
    3、Creating Face-Based AR Experiences
    4、Recognizing Images in an AR Experience
    5、Using Vision in Real Time with ARKit
    6、Creating an Immersive AR Experience with Audio

    视频讲解
    https://developer.apple.com/videos/library/?q=ARKit

    01、ARKit框架类.jpg 01、ARKit框架类(2).jpg

    二、参考文章

    原理篇文章
    0000.参考文章(ARKit API)
    0000.参考文章(AR项目工作流程)
    (https://www.jianshu.com/p/7faa4a3af589)
    0000.参考文章(ARKit1.5版本支持垂直方向,iOS11.3)
    技术参考文章
    3d模型的obj,dae格式转scn
    制作传送门
    收费视频文章
    蛮牛AR

    02、ARKit关系图(1).jpeg 02、ARKit关系图(2).jpg

    三、ARKit常用的类

    UIView  视图
    ARSCNView AR视图(参考文章 https://blog.csdn.net/biangabiang/article/details/76619177)
    SCNScene AR场景
    SCNnode AR节点(3D模型)
    
    ARsession  AR会话 (参考文章 https://blog.csdn.net/biangabiang/article/details/76818441)
    ARSessioncofguration AR会话追踪位置(**已经废除**)
        新类: ARConfiguration AR追踪位置
        子类: ARWorldTrackingConfiguration AR世界追踪会话配置
    ARFarme AR位置
    ARCamare AR相机 (参考文章 https://blog.csdn.net/biangabiang/article/details/76819262)
    

    四、demo

    1 体验ARdemo

    通过点击按钮跳转到该页面
    该页面点击屏幕进行加载模型
    #import "LYH_ARSCNViewController.h" // AR控制器界面
    #import <SceneKit/SceneKit.h>   // 3D游戏框架
    #import <ARKit/ARKit.h>         // ARKit框架
    
    @interface LYH_ARSCNViewController ()
    /** AR视图:展示3D界面 */
    @property(nonatomic, strong)ARSCNView *arSCNView;
    /** AR会话:负责管理相机追踪配置以及3D相机的坐标 */
    @property(nonatomic, strong)ARSession *arSession;
    /** 会话追踪配置:负责追踪相机的运动 */
    @property(nonatomic, strong) ARConfiguration *arConfiguration; // 注意点 Xcode bate版 ARSessionConfiguration 在正式版已经被废除了 。使用 ARConfiguration 替代
    /** 飞机模型 */
    @property(nonatomic, strong) SCNNode *planeNode;
    @end
    
    @implementation LYH_ARSCNViewController
    
    #pragma mark -  💤 懒加载 Lazy loading start
    #pragma mark 搭建ARKit环境__懒加载  1.创建AR视图 2.创建AR会话 3.创建AR会话追踪配置
    - (ARSCNView *)arSCNView
    {
        if (_arSCNView == nil)
        {
            /**
             1.创建AR视图
             2.设置视图会话
             3.自动刷新灯光(3D游戏用到,此处可忽略)
             */
            _arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
            _arSCNView.session = self.arSession;
            _arSCNView.automaticallyUpdatesLighting = YES;
        }
        return _arSCNView;
    }
    - (ARSession *)arSession
    {
        if(_arSession == nil)
        {
            /**
             1.创建AR会话
             */
            _arSession = [[ARSession alloc] init];
        }
        return _arSession;
    }
    - (ARConfiguration *)arConfiguration
    {
        if (_arConfiguration == nil)
        {
            /**
             1.创建世界追踪会话配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持
             2.设置追踪方向(追踪平面,后面会用到)   ARPlaneDetectionHorizontal
             3.自适应灯光(相机从暗到强光快速过渡效果会平缓一些)
             */
            ARWorldTrackingConfiguration *configuration = [[ARWorldTrackingConfiguration alloc] init];
            configuration.planeDetection = ARPlaneDetectionHorizontal;
            _arConfiguration.lightEstimationEnabled = YES;
            _arConfiguration = configuration; // 将创建的属性赋值给全局变量
        }
        return _arConfiguration;
    }
    #pragma mark  💤 懒加载  Lazy loading end
    
    
    #pragma mark - ♻️ 视图的生命周期 view life cycle start
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    #pragma mark 视图已在屏幕上渲染完成 1、将AR视图添加到视图 2、开启AR会话
    - (void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
        /**
         1.将AR视图添加到当前视图
         2.开启AR会话(此时相机开始工作)
         */
        [self.view addSubview:self.arSCNView];
        [self.arSession runWithConfiguration:self.arConfiguration];
        
    }
    #pragma mark  ♻️ 视图的生命周期 view life cycle end
    
    #pragma mark - ✍🏻(系统方法) system method start
    
    - (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];
        
        // 椅子比较大,可以调整调整Z的位置让它离摄像头远一点,然后在往下一点(椅子太高我们做不上去)就可以看得全局一点
        //    shipNode.position = SCNVector3Make(0, -1, -1); // x | y | z 坐标相当于世界原点,也就是相机位置
        
        //3.将飞机节点添加到当前屏幕中
        [self.arSCNView.scene.rootNode addChildNode:shipNode];
    }
    
    #pragma mark  ✍🏻(系统方法) system method end
    
    @end
    

    2、AR捕捉平面demo
    3、00003_ARKit捕捉平地
    4、00004_ARKit让飞机跟着镜头飞起来
    5、00005_ARKit让飞机绕着你飞起来
    具体请到《五、资源和素材》 里面下载。已经上传到百度云分享。


    五、资源和素材

    workspace代码: 
    链接:https://pan.baidu.com/s/107h2PC9ssWuooSY3MLj5og  密码:r6v9
    框架注释版:
    拼命添加翻译中....
    

    相关文章

      网友评论

        本文标题:(苹果框架学习)00001_ARkit.framework苹果框

        本文链接:https://www.haomeiwen.com/subject/ttgtiftx.html