ARkit框架学习

我不知道怎么切入这个ARKit的主题,也不想胡乱吹一套,AR是一个什么技术,反正我明白一件事情,那就是Apple 做AR最牛逼的公司给收购了! 他为啥收购? 好了 不BB了,本人对AR也比较感兴趣。!通过学习,Apple 官方的IPA,结合大牛的博客。(其中过程还是比较痛苦的。)
一:首先建议下。。
ARKit不能理解,如果你是纯做iOS的这个正常。
但是还有一个SceneKit,这个就有点!你懂的。!还有我有点基础,一路看过来都可以理解,但是关于换算这块。!还是很多不懂的,后续会继续学习!
二:先说个他是怎么样在iOS上运行AR的。!
首先要A9 的芯片,就是说要6S以上的手机。。!才能运行。。!我拿的是7pulse。
ARKit重要包含的class
ARSession 他负责调接显示,和数据的传输(他是中介)
在iOS框架中,凡是带session或者context后缀的,这种类一般自己不干活,作用一般都是两个:1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦 2.负责帮助我们管理复杂环境下的内存
context与session不同之处是:一般与硬件打交道,例如摄像头捕捉ARSession,网卡的调用NSURLSession等使用的都是session后缀。没有硬件参与,一般用context,如绘图上下文,自定义转场上下文等
1.你对象提供接收视频图像捕获和跟踪信息,或对会话状态的变化,代理是捕获视频流的。。(方法可以实现接收视频帧图像捕获和跟踪状态的AR会话。) var
self.arsession.delegate = self;
2.暂停 func
[self.arsession pause];
3.支持多线程的 var
self.arsession.delegateQueue ;
4.翻译为当前帧,我对这个ARframe还不是很了解 先不做回答。。!??? var
ARFrame *frame = self.arsession.currentFrame;
5.这个函数还真不知道什么意思。 。
[self.arsession runWithConfiguration:self.arsessionconfiguration options:(nil)];
6.运行追踪者! func
[self.arsession runWithConfiguration:self.arsessionconfiguration];
7.增加删除锚点,func
ARAnchor *ar = [[ARAnchor alloc]initWithTransform:matrix_sub];
[self.arsession addAnchor:ar ];
[self.arsession removeAnchor:ar];
重点需要理解的。。!
✨ARSession搭建沟通桥梁的参与者主要有两个ARWorldTrackingSessionConfiguration与ARFrame
*/
与他配合的是ARSessionConfiguration 这个追踪类,功能是非常强大的。。!
RWorldTrackingSessionConfiguration(会话追踪配置)的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部实现了一系列非常庞大的算法计算以及调用了你的iPhone必要的传感器来检测手机的移动及旋转甚至是翻滚
该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型
当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理(与前面说的session管理内存相呼应),而相机的位置数据对应的类就是ARFrame
--ARSessionConfiguration--父类
ARSessionConfiguration *arsessionconfiguration = [[ARSessionConfiguration alloc]init];
1.是否支持A9芯片 ,AR
@property(class, nonatomic, readonly) BOOL isSupported;
//这是一个类方法
BOOL b = ARSessionConfiguration.isSupported;
2.会话的对其方式,这里的对其指的是3D世界的坐标。
arsessionconfiguration.worldAlignment = ARWorldAlignmentGravity;
num : ARWorldAlignmentGravity 相机位置 vector (0, -1, 0)
ARWorldAlignmentGravityAndHeading 相机位置及方向. vector (0, -1, 0)
ARWorldAlignmentCamera 相机方向
3.是否需要灯光
arsessionconfiguration.lightEstimationEnabled = YES;
--ARWorldTrackingSessionConfiguration--
只有两个选项,第一个不侦查!第二个侦查地形。!
self.arsessionconfiguration.planeDetection = 1;
/
以上基本上搭建好了,ARKit这边了,!但是还有;
但是要使用的话还得会几个工具类!
/

ARFrame
ARFrame *frame = [ARFrame alloc];
ARFrame主要是追踪相机当前的状态,这个状态不仅仅只是位置,还有图像帧及时间等参数
1.时间戳.
float time = frame.timestamp;
2.缓冲区图像帧
CVPixelBufferRef ref = frame.capturedImage;
3.相机(表示这个ARFrame是哪一个相机的,iPhone7plus有两个摄像机)
ARCamera *camera = frame.camera;
4. 返回当前相机捕捉到的锚点数据(当一个3D虚拟模型加入到ARKit中时,锚点值得就是这个模型在AR中的位置)
NSArray *anchorsarr = frame.anchors;
5.灯光,详情可见本章节ARLightEstimate类介绍(指的是灯光强度 一般是0-2000,系统默认1000)
ARLightEstimate *light = frame.lightEstimate;
6.特征点(应该是捕捉平地或者人脸的,比较苹果有自带的人脸识别功能)
ARPointCloud *point = frame.rawFeaturePoints;
7.根据2D坐标点搜索3D模型,这个方法通常用于,当我们在手机屏幕点击某一个点的时候,可以捕捉到这一个点所在的3D模型的位置,至于为什么是一个数组非常好理解。手机屏幕一个是长方形,这是一个二维空间。而相机捕捉到的是一个由这个二维空间射出去的长方体,我们点击屏幕一个点可以理解为在这个长方体的边缘射出一条线,这一条线上可能会有多个3D物体模型
point:2D坐标点(手机屏幕某一点)
ARHitTestResultType:捕捉类型 点还是面
(NSArray *):追踪结果数组

 CGPoint pin = CGPointMake(10, 10);
 NSArray *arr =  [frame hitTest:pin types:ARHitTestResultTypeFeaturePoint];
 跟ARSCnview一样的
 8.相机窗口的的坐标变换(可用于相机横竖屏的旋转适配)
 CGSize sizi = CGSizeMake(100, 100);
   [frame displayTransformWithViewportSize:sizi orientation:UIDeviceOrientationUnknown];
 */

/*
--ARAnchor--
锚点,
1. 标识符
NSString *NSuuid = anchor.identifier ;
2. 锚点的旋转变换矩阵,定义了锚点的旋转、位置、缩放。是一个4x4的矩阵
matrix_float4x4 mat = anchor.transform;
3. 构造方法,一般我们无需构造。因为添加一个3D物体时ARKit会有代理告知我们物体的锚点
matrix_float4x4 a ;
ARAnchor *anchor = [[ARAnchor alloc]initWithTransform:a];
*/

/*
ARHitTestResult *hittestresult = [ARHitTestResult alloc];
1.捕捉类型是一个枚举类型
hittestresult.type;
点.
ARHitTestResultTypeFeaturePoint

 水平面 y为0.
ARHitTestResultTypeEstimatedHorizontalPlane

已结存在的平面.
ARHitTestResultTypeExistingPlane

已结存在的锚点和平面.
ARHitTestResultTypeExistingPlaneUsingExtent
 2. 3D虚拟物体与相机的距离(单位:米)
 float distance = hittestresult.distance;
 3.自身坐标
 matrix_float4x4 local =   hittestresult.localTransform;
 4.世界坐标
 matrix_float4x4 word =   hittestresult.worldTransform;
 5.锚点
 ARAnchor *anchor =  hittestresult.anchor;
 */
接下来是ARSession;

/*
--ARSCNView--
非常重要的一个类,他是一个支持3D的AR场景和2D的AR场景,ARSCNView是3D的AR场景视图
1.您提供协调同步的对象视图的基于“增大化现实”技术与SceneKit场景信息内容。
self.sceneView.delegate = self; var
2.添加会话
self.sceneView.session = self.arsession;
3.添加3D场景
self.sceneView.scene = scnscen;
4.是否自动适应灯光
self.sceneView.autoenablesDefaultLighting = YES;
5.返回对应节点的锚点,节点是一个3D虚拟物体,它的坐标是虚拟场景中的坐标,而锚点ARAnchor是ARKit中现实世界的坐标。
ARAnchor *anchor = [self.sceneView anchorForNode:scnscen];
6.上对于
self.sceneView nodeForAnchor:<#(nonnull ARAnchor *)#>
7.
根据2D坐标点搜索3D模型,这个方法通常用于,当我们在手机屏幕点击某一个点的时候,可以捕捉到这一个点所在的3D模型的位置,至于为什么是一个数组非常好理解。手机屏幕一个是长方形,这是一个二维空间。而相机捕捉到的是一个由这个二维空间射出去的长方体,我们点击屏幕一个点可以理解为在这个长方体的边缘射出一条线,这一条线上可能会有多个3D物体模型
point:2D坐标点(手机屏幕某一点)
ARHitTestResultType:捕捉类型 点还是面
(NSArray *):追踪结果数组
数组的结果排序是由近到远

 ARHitTestResult  这两个东西比较难,!目前我不理解???
 ARHitTestResultType  这是一个枚举
 CGPoint pin = CGPointMake(10, 10);
 
 NSArray *arr =  [self.sceneView hitTest:pin types:ARHitTestResultTypeFeaturePoint];
 */

pragma mark --SCNScene--

/*
 --SCNScene--
 场景内!这包括游戏的任何东西。。!AIP已经写好了。!
 这个类场景类,用来读取相对场景。!
 具体的方法可以在API 中查看。。!
 2. 上面已经说了,!ARSCRView是继承SCNView的。。!
 SCRView就是用来显示场景的。。。
 3.  在手机中是右手坐标系。
 3.1其中场景中的负责显示的SCNView,最底层的就是SCN节点。。(相对于各种组件)
 3.2  (在这里你想想场景里基本的包括的东西!需要显示出来还差什么,已经有transform 了),这个还提供 了一个类,渲染类!
 4。 渲染这块包括 五块
 SCNSceneRenderer
 SCNSceneRendererDelegate
 SCNLayer
 SCNRenderer
 SCNHitTestResult
 5.在这个场景框架里,该有的都有!接下来就是相机类了,!到这里就有点奇怪了。。!
 (不是还有一个ARCameras么?)
 SCRCameras 一组相机属性可以被附加到一个节点提供一个角度显示现场。(官网上说的)
 ARCaneras  摄像机的位置和成像特征信息捕获视频帧的AR会话。
 SCRCameras  这个是用来编辑相机位置的。。!
 ARCaneras    负责显示在手机屏幕上的。。!(这是我对他的理解)
 
 6. 灯光类! SCNlight
 7.      class SCNMaterial 材质球
 7.1  class SCNMaterialProperty
 8.Geometry  几何类吗、,一个三维形状(也称为一个模型或网格),可以显示在一个场景中,附加材料定义其外观。
 9.Animation and Constraints 动画类
 10.物理类,Physics Simulation
 11.Particle Systems 粒子系统
 12.Audio 音频
 13.Renderer Customization 渲染器定制
 14.Scene Asset Import  场景的资源导入
 15.JavaScript  使SceneKit类和全局常量用于指定JavaScript上下文。
 
 */
ARSCNViewDelegate

// Override to create and configure nodes for anchors added to the view's session.

  • (SCNNode *)renderer:(id)renderer nodeForAnchor:(ARAnchor *)anchor {
    SCNNode *node = [SCNNode new];

    // Add geometry to the node..., 当添加节点是会调用,我们可以通过这个代理方法得知我们添加一个虚拟物体到AR场景下的锚点(AR现实世界中的坐标)

return node;

}
/**
将要刷新节点
*/

  • (void)renderer:(id )renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}

/**
将要刷新节点
*/

  • (void)renderer:(id )renderer willUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}
/**
已经刷新节点
*/

  • (void)renderer:(id )renderer didUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}

/**
移除节点
*/

  • (void)renderer:(id )renderer didRemoveNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}
//系统提供一下!

  • (void)session:(ARSession *)session didFailWithError:(NSError *)error {
    // Present an error message to the user,向用户显示一条错误消息

}

  • (void)sessionWasInterrupted:(ARSession *)session {
    // Inform the user that the session has been interrupted, for example, by presenting an overlay,/ /通知用户会话已经中断,例如,通过提供一个覆盖

}

  • (void)sessionInterruptionEnded:(ARSession *)session {
    // Reset tracking and/or remove existing anchors if consistent tracking is required
    //重置跟踪和/或删除现有的定位是否需要持续跟踪

}
ARSessionDelegate 代理

pragma mark - ARSessionDelegate

/**
这就是所谓的新框架时已更新。
会话正在运行的会话。
帧的帧更新。
每一帧都在调
*/

  • (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame{

// if (self.planeNode) {
// //positon 位置 ,matrix_float4x4 这个类不知道是什么意思!
// self.planeNode.position = SCNVector3Make(frame.camera.transform.columns[3].x, frame.camera.transform.columns[3].y, frame.camera.transform.columns[3].z);
//// NSLog(@"x = %f y = %f z = %f",frame.camera.transform.columns[2].x,frame.camera.transform.columns[2].y,frame.camera.transform.columns[2].z);
//
// }

}

/**
This is called when new anchors are added to the session.
这叫做当新的锚被添加到会话
@param session The session being run.会话正在运行的会话
@param anchors An array of added anchors.锚的数组添加锚点
*/

  • (void)session:(ARSession )session didAddAnchors:(NSArray>*)anchors{

}
在这里写的是第一次学习的比较,也是直接写在Xcode上的。。!
希望以后一起学习。。!双手奉上QQ 有问题一起解决。。!
345996501 !

你可能感兴趣的:(ARkit框架学习)