ARKit初学

作者: zhengxiaolang | 来源:发表于2021-04-07 17:14 被阅读0次

    1、背景

    同事老王推荐看了ARKit 4中LiDAR带来的炫丽效果~
    心生好奇,便想了解~

    2、什么是ARKit

    增强现实技术(Augmented Reality,简称 AR),
    是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

    简单说就是利用相机捕捉到的现实世界的图像,并在图像中显示一个或者多个虚拟的3D模型。

    这一过程可以分为两个步骤:

    一:相机捕捉现实世界图像

    由ARKit来实现

    二:在图像中显示虚拟3D模型

    由SceneKit来实现

    3、ARKit应用场景

    3.1 测距

    原理获取3D坐标2个点,
    距离计算公式
    sqrt((distanceX * distanceX)+(distanceY * distanceY)+(distanceZ * distanceZ))

    3.2 3D扫描

    使用ARKit 4.0中 LiDAR功能
    硬件支持的设备:
    iPhone 12 Pro,
    iPhone 12 Pro Max,
    iPad Pro
    视频地址

    3.3 虚实遮挡

    使用ARKit 4.0中 LiDAR功能
    硬件支持的设备:
    iPhone 12 Pro,
    iPhone 12 Pro Max,
    iPad Pro
    视频地址

    3.4 人物识别

    iPhoneX 及以上设备即可支持

    ARKit框架工作流程:

    1.ARSCNView加载场景SCNScene
    2.SCNScene启动相机ARCamera开始捕捉场景
    3.捕捉场景后ARSCNView开始将场景数据交给Session
    4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
    5.给ARSCNView的scene添加一个子节点(3D物体模型)

    4、代码 实现了3点功能

    1、在实景中新增3D模型
    2、在实景中捕捉平地,并在平地新增模型
    3、人脸识别

    demo地址

    5、代码解析

    @property(nonatomic,strong)ARSCNView *scnView;
    
    @property(nonatomic,strong)ARSession *session;
    
    @property(nonatomic,strong)ARConfiguration *config;
    
    -(ARSCNView *)scnView{
        if (!_scnView) {
            _scnView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
            _scnView.delegate = self;
        }
        
        return _scnView;
    }
    
    -(ARSession *)session{
        if (!_session) {
            _session = [[ARSession alloc] init];
        }
        return _session;
    }
    
    -(ARWorldTrackingConfiguration *)config{
        if (!_config) {
            _config = [[ARWorldTrackingConfiguration alloc] init];
            //2.设置追踪方向(追踪平面,捕捉平面)
            _config.planeDetection = ARPlaneDetectionHorizontal;
            //3.自适应灯光
            _config.lightEstimationEnabled = YES;
        }
        return _config;
    }
    

    5.1ARSCNView

    ARSCNView主要功能
    利用SCNScene里面的相机ARCamera开始捕捉场景,
    捕捉场景后ARSCNView开始将场景数据交给Session

    5.2ARSession主要功能

    主要起到一个桥梁沟通的作用

    通过管理5.3ARConfiguration实现场景的追踪并且返回一个ARFrame,
    再给ARSCNView添加子节点(3D物体模型)

    5.3ARConfiguration

    ARConfiguration是一个抽象的类,用于配置ARSession的配置,主要是关于相机的功能配置。实现这个抽象类的子类有:

    **1.ARWorldTrackingConfiguration**
    
    提供高质量的AR体验,使用后置摄像头精确跟踪设备的位置和方向,并允许平面检测,命中测试,基于环境的照明以及图像和目标检测。
    
    在空间之间创建和维护这种对应关系需要跟踪设备的运动。所述类跟踪设备的具有六个自由度(6DOF)移动:即,三个旋转轴(滚动,俯仰和偏转),三个平移轴(运动中的x,y和z)
    
    **2.AROrientationTrackingConfiguration**
    
    提供使用后置摄像头的基本AR体验,并仅跟踪设备的方向。
    
    在空间之间创建和维护这种对应关系需要跟踪设备的运动。所述类跟踪与三个自由度(3DOF)设备的运动:即,三个旋转轴(滚动,俯仰和偏转)。
    
    **3.ARImageTrackingConfiguration**
    
    提供基本的AR体验,使用后置摄像头并跟踪可见图像,无论用户的环境如何。
    
    **4.ARFaceTrackingConfiguration**
    
    提供使用前置摄像头的AR体验,并跟踪用户脸部的移动和表情。
    
    **5.ARObjectScanningConfiguration**
    
    提供使用后置摄像头收集现实空间数据,创建参考对象以便在其他AR体验中进行检测(把现实世界的物体解析成3D模型)
    

    5.4 ARFrame

    主要是追踪相机当前的状态,这个状态不仅仅只是位置,还有图像帧及时间等参数

    5.5人脸识别主要代码

    原理:
    1、config设置为跟踪用户脸部的移动和表情。
    2、再根据ARSCNViewDelegate回调事件获取到ARFaceAnchor的具体数据,
    NSDictionary *blendShips = faceAnchor.blendShapes;
    如上可以获取具体位置的值,所以可以判断某些部分的 变动情况。

    -(ARFaceTrackingConfiguration *)config{
        if (!_config) {
            _config = [MTARKitHelper createFaceTrackingConfig];
            //自适应灯光
            _config.lightEstimationEnabled = YES;
        }
        return _config;
    }
    
    
    #pragma mark - ARSCNViewDelegate
    - (void)renderer:(id<SCNSceneRenderer>)renderer didUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor {
        
        if (!anchor || ![anchor isKindOfClass:[ARFaceAnchor class]]) return;
    
        ARFaceAnchor *faceAnchor = (ARFaceAnchor *)anchor;
        
        BOOL isDetected = NO;
        
        switch (self.faceDetectionType) {
            case MTFaceDetectionTypeOpenMouth:
                isDetected = [MTFaceDetectionHelper isOpenMouthWithFaceAnchor:faceAnchor];
                break;
             
            default:
                break;
        }
        
    }
    
    //张嘴 判断
    +(BOOL)isOpenMouthWithFaceAnchor:(ARAnchor *)anchor{
        
        if (!anchor || ![anchor isKindOfClass:[ARFaceAnchor class]]) return NO;
        
        ARFaceAnchor *faceAnchor = (ARFaceAnchor *)anchor;
        
        CGFloat value = [self getFaceDetectionValueFromFaceAnchor:faceAnchor forShapeLocationKey:ARBlendShapeLocationJawOpen];
        
    //    ARBlendShapeLocationMouthFunnel 稍张嘴并双唇张开
        
    //    ARBlendShapeLocationJawOpen 张嘴时下巴向下
        
        NSLog(@"jawOpen = %f", value);
        CGFloat defaultValue = 0.3;
        if (value > defaultValue) {
            NSLog(@"检测到张嘴");
            return YES;
        }
        return NO;
    }
    
    +(CGFloat)getFaceDetectionValueFromFaceAnchor:(ARFaceAnchor *)faceAnchor forShapeLocationKey:(NSString *)shapeLocation{
        NSDictionary *blendShips = faceAnchor.blendShapes;
        return [blendShips[shapeLocation] floatValue];
    }
    

    6、总结:

    为期3天的学习,时间较短,认识有限。
    由于LiDAR的使用,需要相应的硬件,
    因此最好奇的功能点:

    1、3D建模
    
    2、虚实遮挡
    

    此次并未实现,以后如果有机会再实现下效果。

    相关文章

      网友评论

        本文标题:ARKit初学

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