移动客户端

ARKit初学

2021-04-07  本文已影响0人  zhengxiaolang

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、虚实遮挡

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

上一篇下一篇

猜你喜欢

热点阅读