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<ARHitTestResult *> *):追踪结果数组

 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 *> *):追踪结果数组
数组的结果排序是由近到远

 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<SCNSceneRenderer>)renderer nodeForAnchor:(ARAnchor *)anchor {
    SCNNode *node = [SCNNode new];

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

return node;

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

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

}

/**
将要刷新节点
*/

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

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

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

}

/**
移除节点
*/

  • (void)renderer:(id <SCNSceneRenderer>)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<ARAnchor>*)anchors{

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容