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、人脸识别
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、虚实遮挡
此次并未实现,以后如果有机会再实现下效果。
网友评论