iOS~ARKit開發(fā)(OC):文檔翻譯

1.ARAnchor.h

  • ARAnchor表示一個(gè)物體在3D控件的位置和方向(ARAnchor通常稱為物體的3D錨點(diǎn),有點(diǎn)像UIKit框架中的CALayer的Anchor)

  • ARFrame表示的也是物體的位置和方向, 但是ARFrame通常表示的是AR相機(jī)的位置和方向已經(jīng)追蹤相機(jī)的時(shí)間, 還可以捕捉相機(jī)的幀圖片

  • 也就是說ARFrame用于捕捉相機(jī)的移動, 其他虛擬物體用ARAnchor

@interface ARAnchor : NSObject <NSCopying>

/**
 錨的惟一標(biāo)識符
 */
@property (nonatomic, readonly) NSUUID *identifier;

/**
 錨點(diǎn)的旋轉(zhuǎn)變換矩陣,定義了錨點(diǎn)的旋轉(zhuǎn)嘁傀、位置椎侠、縮放苛蒲。是一個(gè)4x4的矩陣
 */
@property (nonatomic, readonly) matrix_float4x4 transform;

/**
 構(gòu)造方法,一般我們無需構(gòu)造掂为。因?yàn)樘砑右粋€(gè)3D物體時(shí)ARKit會有代理告知我們物體的錨點(diǎn)
 */
- (instancetype)initWithTransform:(matrix_float4x4)transform;

@end

/**
 在被跟蹤的場景中,一個(gè)真實(shí)的世界物體或位置甩十。
 */
@protocol ARTrackable <NSObject>

/**
 跟蹤錨的狀態(tài)
使用isTracked值來確定錨變換的有效性闹炉。當(dāng)被跟蹤的對象不再被檢測到攝像頭圖像懈糯,它的錨定將返回不為isTracked脊框。
 */
@property (nonatomic, readonly) BOOL isTracked;

@end

2.ARCamera.h

  • 表示相機(jī)的模型及其參數(shù)颁督。
  • ARCamera是一個(gè)相機(jī),它是連接虛擬場景與現(xiàn)實(shí)場景之間的樞紐浇雹。在ARKit中沉御,它是捕捉現(xiàn)實(shí)圖像的相機(jī),在SceneKit中它又是3D虛擬世界中的相機(jī)昭灵。(一般第一人稱3D游戲吠裆,主角其實(shí)就是一個(gè)3D相機(jī)伐谈,我們電腦屏幕看到的畫面就是這個(gè)相機(jī)捕捉的畫面)
  • 一般我們無需去創(chuàng)建一個(gè)相機(jī),因?yàn)楫?dāng)我們初始化一個(gè)AR試圖時(shí)硫痰,他會為我們默認(rèn)創(chuàng)建一個(gè)相機(jī)衩婚,而且這個(gè)相機(jī)就是攝像頭的位置,同時(shí)也是3D世界中的原點(diǎn)所在(x=0,y=0,z=0)
  • ARCamera的API一般我們無需關(guān)心效斑,因?yàn)锳RKit會默認(rèn)幫助我們配置好
/**
 描述攝像機(jī)跟蹤狀態(tài)的值非春。
 */
typedef NS_ENUM(NSInteger, ARTrackingState) {
    /** 不被允許. */
    ARTrackingStateNotAvailable,
    
    /** 最小. */
    ARTrackingStateLimited,
    
    /**正常. */
    ARTrackingStateNormal,
} NS_REFINED_FOR_SWIFT;

/**
 描述為什么相機(jī)的跟蹤狀態(tài)是有限的一個(gè)原因 : 追蹤運(yùn)動類型
 */
typedef NS_ENUM(NSInteger, ARTrackingStateReason) {
    /** 無. */
    ARTrackingStateReasonNone,
    
    /** 初始化. */
    ARTrackingStateReasonInitializing,
    
    /** 運(yùn)動. */
    ARTrackingStateReasonExcessiveMotion,
    
    /** 臉部捕捉. */
    ARTrackingStateReasonInsufficientFeatures,
} NS_REFINED_FOR_SWIFT;


@interface ARCamera : NSObject <NSCopying>

/**
 4x4矩陣表示相機(jī)位置,同ARAnchor
 在世界坐標(biāo)中定義攝像機(jī)旋轉(zhuǎn)和平移的變換矩陣缓屠。
 */
@property (nonatomic, readonly) matrix_float4x4 transform;

/**
 * 相機(jī)方向(旋轉(zhuǎn))的矢量歐拉角奇昙。
 * @dicussion組件的順序在這個(gè)向量場的軸旋轉(zhuǎn):
 * 1。音高(x分量)是關(guān)于節(jié)點(diǎn)的軸的旋轉(zhuǎn)(弧度)
 * 2敌完。偏航(y分量)是關(guān)于節(jié)點(diǎn)的軸的旋轉(zhuǎn)(弧度)
 * 3所示储耐。卷(z分量)是關(guān)于節(jié)點(diǎn)的z軸的旋轉(zhuǎn)(弧度)
 * ARKit適用這些旋轉(zhuǎn)的倒序組件:
 * 1 第一卷
 * 2 然后偏航
 * 3 所示。然后投球
 */
@property (nonatomic, readonly) vector_float3 eulerAngles;

/**
 *  相機(jī)追蹤狀態(tài)(在下方會有枚舉值介紹)
 */
@property (nonatomic, readonly) ARTrackingState trackingState NS_REFINED_FOR_SWIFT;

/**
 * 追蹤運(yùn)動類型
 */
@property (nonatomic, readonly) ARTrackingStateReason trackingStateReason NS_REFINED_FOR_SWIFT;

/**
 * 相機(jī)曲率(筆者有點(diǎn)費(fèi)解滨溉,反復(fù)揣摩應(yīng)該是與焦距相關(guān)參數(shù))
 * 3x3矩陣
 * fx 0   px
 * 0  fy  py
 * 0  0   1
 * fx和fy是像素的焦距什湘。
 * px和py是像素點(diǎn)的坐標(biāo)。
 * 原點(diǎn)位于左上角的像素中心晦攒。
 */
@property (nonatomic, readonly) matrix_float3x3 intrinsics;

/**
 攝像頭分辨率
 */
@property (nonatomic, readonly) CGSize imageResolution;

/**
 投影矩陣
*/
@property (nonatomic, readonly) matrix_float4x4 projectionMatrix;

/**
 將世界坐標(biāo)系統(tǒng)的三維點(diǎn)投射到二維視窗空間闽撤。
 @ param點(diǎn)三維點(diǎn)在世界坐標(biāo)系統(tǒng)。
 @param取向視窗取向脯颜。
 @param viewportSize Viewport(或圖像)大小哟旗。
 @return 2D點(diǎn),在viewport坐標(biāo)系中栋操,原點(diǎn)在左上角闸餐。
 */
- (CGPoint)projectPoint:(vector_float3)point orientation:(UIInterfaceOrientation)orientation viewportSize:(CGSize)viewportSize;

/**
 * 創(chuàng)建相機(jī)投影矩陣
 * @discussion 返回的投影矩陣提供了一個(gè)方面填補(bǔ)和旋轉(zhuǎn)提供視窗的大小和方向。
 * @param - viewportSize視窗大小矾芙。
 * @param - 取向視窗取向舍沙。
 * @param - zNear附近深度的限制。
 * @param - zFar深度限制
 */
- (matrix_float4x4)projectionMatrixForOrientation:(UIInterfaceOrientation)orientation viewportSize:(CGSize)viewportSize zNear:(CGFloat)zNear zFar:(CGFloat)zFar;

/**
 為攝像機(jī)創(chuàng)建一個(gè)視圖矩陣剔宪,并給出一個(gè)界面朝向场勤。
 @ discussion這個(gè)視圖矩陣可以用來將幾何圖形轉(zhuǎn)換為一個(gè)給定方向的攝像機(jī)空間
 @ param定位用于渲染相機(jī)視圖的界面朝向。
 */
- (matrix_float4x4)viewMatrixForOrientation:(UIInterfaceOrientation)orientation;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end

3.ARError.h

/**
 * 錯(cuò)誤碼描述
 * 100:不支持會話追蹤配置歼跟,主線由于A9芯片以下的機(jī)型會報(bào)錯(cuò)
 * 101:失活狀態(tài)
 * 102:傳感器故障
 * 200:追蹤失敗
 */
typedef NS_ERROR_ENUM(ARErrorDomain, ARErrorCode) {
    /** 不支持會話配置 */
    ARErrorCodeUnsupportedConfiguration   = 100,
    
    /** 一個(gè)傳感器運(yùn)行會話所需是不可用的 */
    ARErrorCodeSensorUnavailable          = 101,
    
    /** 一個(gè)傳感器未能提供必要的輸入 */
    ARErrorCodeSensorFailed               = 102,

    /** 跟蹤世界遇到了一個(gè)致命錯(cuò)誤 */
    ARErrorCodeWorldTrackingFailed        = 200,
};

4.ARConfiguration.h

  • ARConfiguration會話追蹤配置和媳,主要就是追蹤相機(jī)的配置
  • 注意:該類還有一個(gè)子類:ARWorldTrackingConfiguration,它們在同一個(gè)API文件中
/**
 世界會話的對齊方式哈街,這里的對齊指的是3D世界的坐標(biāo)留瞳,枚舉值見下方
 */
typedef NS_ENUM(NSInteger, ARWorldAlignment) {
    /** 相機(jī)位置 vector (0, -1, 0) */
    ARWorldAlignmentGravity,
    
    /** 相機(jī)位置及方向. vector (0, -1, 0)  heading :(0, 0, -1) */
    ARWorldAlignmentGravityAndHeading,
    
    /** 用相機(jī)的方向?qū)?zhǔn)世界 */
    ARWorldAlignmentCamera
} NS_SWIFT_NAME(ARConfiguration.WorldAlignment);

/**
 偵查類型 - 選項(xiàng)設(shè)置指示飛機(jī)探測的類型。.
 */
typedef NS_OPTIONS(NSUInteger, ARPlaneDetection) {
    /** 不偵查 */
    ARPlaneDetectionNone        = 0,
    
    /** 平地偵查 - 飛機(jī)在現(xiàn)場檢測確定橫向飛機(jī) */
    ARPlaneDetectionHorizontal  = (1 << 0),
} NS_SWIFT_NAME(ARWorldTrackingConfiguration.PlaneDetection);


/**
 描述和配置在ARSession中使用的增強(qiáng)現(xiàn)實(shí)技術(shù)的對象, 主要就是追蹤相機(jī)的配置
 注意:該類還有一個(gè)子類:ARWorldTrackingSessionConfiguration骚秦,它們在同一個(gè)API文件中
 */
@interface ARConfiguration : NSObject <NSCopying>

/**
 當(dāng)前設(shè)備是否支持她倘,一般A9芯片以下設(shè)備不支持
 */
@property(class, nonatomic, readonly) BOOL isSupported;

/**
 如何構(gòu)建基于真實(shí)世界設(shè)備運(yùn)動的場景坐標(biāo)系的選項(xiàng)
 確定坐標(biāo)系統(tǒng)應(yīng)該如何與世界對齊璧微。這里的對其指的是3D世界的坐標(biāo)。枚舉值見上方
 討論默認(rèn)的是ARWorldAlignmentGravity硬梁。
 */
@property (nonatomic, readwrite) ARWorldAlignment worldAlignment;

/**
 是否需要自適應(yīng)燈光效果前硫,默認(rèn)是YES
 */
@property (nonatomic, readwrite, getter=isLightEstimationEnabled) BOOL lightEstimationEnabled;

/**
 確定是否捕獲和提供音頻數(shù)據(jù), 默認(rèn)禁用。
 */
@property (nonatomic, readwrite) BOOL providesAudioData;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end


/**
 運(yùn)行世界跟蹤的配置荧止。
 世界跟蹤提供了6個(gè)自由度跟蹤裝置屹电。
 通過在場景中找到特征點(diǎn),世界跟蹤可以在幀上執(zhí)行hit- test跃巡。
 一旦會話暫停危号,跟蹤不能再恢復(fù)。
 所有AR配置在設(shè)備居住的現(xiàn)實(shí)世界和可以對內(nèi)容建模的虛擬3D坐標(biāo)空間之間建立對應(yīng)關(guān)系素邪。當(dāng)您的應(yīng)用程序?qū)?nèi)容與實(shí)時(shí)攝像機(jī)圖像一起顯示時(shí)外莲,用戶體驗(yàn)到您的虛擬內(nèi)容是真實(shí)世界的一部分。
 創(chuàng)建和維護(hù)空格之間的對應(yīng)關(guān)系需要跟蹤設(shè)備的運(yùn)動兔朦。所述類跟蹤設(shè)備的具有六個(gè)自由度(6DOF)移動:即偷线,三個(gè)旋轉(zhuǎn)軸(滾動,俯仰和偏轉(zhuǎn))沽甥,三個(gè)平移軸(運(yùn)動中的x淋昭,y和z)。ARWorldTrackingSessionConfiguration
 這種級別的跟蹤可以創(chuàng)建沉浸式的AR體驗(yàn):虛擬對象似乎可以保持在相對于現(xiàn)實(shí)世界的相同位置安接,即使用戶傾斜設(shè)備來查看對象的上方或下方,也可以移動設(shè)備以查看物體的側(cè)面和背面英融。
 */

@interface ARWorldTrackingConfiguration : ARConfiguration
/**
 偵查類型 默認(rèn)為不偵查盏檐,不偵查ARPlaneDetectionNone = 0 .
 如果設(shè)置,新的飛機(jī)將繼續(xù)被檢測和更新驶悟。探測到的飛機(jī)將被添加到會話中ARPlaneAnchor對象胡野。當(dāng)兩架飛機(jī)合并后,新飛機(jī)將被移除痕鳍。默認(rèn)為ARPlaneDetectionNone硫豆。
 */
@property (nonatomic, readwrite) ARPlaneDetection planeDetection;

- (instancetype)init;
// Swift不能使用這個(gè)初始化方法
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end


/**
 用于運(yùn)行定向跟蹤的配置。
 定向跟蹤提供了設(shè)備的3個(gè)自由度跟蹤笼呆。
 */
@interface AROrientationTrackingConfiguration : ARConfiguration

- (instancetype)init;
// Swift不能使用這個(gè)初始化方法
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end

/**
 用于運(yùn)行面部跟蹤的配置熊响。
 面部跟蹤利用前置攝像頭跟蹤3D人臉,提供臉部的拓?fù)鋱D和面部表情诗赌。
 一個(gè)檢測到的人臉將被添加到會話中作為一個(gè)ARFaceAnchor對象汗茄,它包含關(guān)于頭部姿勢,網(wǎng)格铭若,眼睛姿勢和混合形狀的信息系數(shù)洪碳。如果光估計(jì)能使被檢測的臉被當(dāng)作一個(gè)光探針递览,用來估計(jì)入射光的方向。
 */
@interface ARFaceTrackingConfiguration : ARConfiguration

- (instancetype)init;
// Swift不能使用這個(gè)初始化方法
+ (instancetype)new NS_SWIFT_UNAVAILABLE("Use init() instead");

@end

5.ARFaceAnchor.h

  • 混合形狀位置的人臉幾何
  • 每個(gè)位置定義了一個(gè)可以被提供的系數(shù)替換的面部區(qū)域瞳腌。
typedef NSString *ARBlendShapeLocation NS_STRING_ENUM NS_SWIFT_NAME(ARFaceAnchor.BlendShapeLocation) API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationBrowDownLeft           API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationBrowDownRight          API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationBrowInnerUp            API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationBrowOuterUpLeft        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationBrowOuterUpRight       API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationCheekPuff              API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationCheekSquintLeft        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationCheekSquintRight       API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeBlinkLeft           API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeBlinkRight          API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookDownLeft        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookDownRight       API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookInLeft          API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookInRight         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookOutLeft         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookOutRight        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookUpLeft          API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeLookUpRight         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeSquintLeft          API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeSquintRight         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeWideLeft            API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationEyeWideRight           API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationJawForward             API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationJawLeft                API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationJawOpen                API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationJawRight               API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthClose             API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthDimpleLeft        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthDimpleRight       API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthFrownLeft         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthFrownRight        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthFunnel            API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthLeft              API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthLowerDownLeft     API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthLowerDownRight    API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthPressLeft         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthPressRight        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthPucker            API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthRight             API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthRollLower         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthRollUpper         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthShrugLower        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthShrugUpper        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthSmileLeft         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthSmileRight        API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthStretchLeft       API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthStretchRight      API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthUpperUpLeft       API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationMouthUpperUpRight      API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationNoseSneerLeft          API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
FOUNDATION_EXTERN ARBlendShapeLocation const ARBlendShapeLocationNoseSneerRight         API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);

@class ARFaceGeometry;

/**
 代表臉孔及其幾何形狀的錨绞铃。
 */
@interface ARFaceAnchor : ARAnchor <ARTrackable>

/**
 基于計(jì)算的混合形狀的面部幾何更新。
 */
@property (nonatomic, readonly) ARFaceGeometry *geometry;

/**
 一種混合形狀系數(shù)的字典嫂侍。
 @discussion Blend shape系數(shù)定義了一個(gè)在面部特定位置的中性形狀的位移量.
 */
@property (nonatomic, readonly) NSDictionary<ARBlendShapeLocation, NSNumber*> *blendShapes;

/** 不可用 */
- (instancetype)initWithTransform:(matrix_float4x4)transform NS_UNAVAILABLE;

@end

6.ARFaceGeometry.h

/**
 表示一個(gè)面幾何形狀的物體儿捧。
 */
@interface ARFaceGeometry : NSObject<NSCopying>

/**
 幾何圖形的網(wǎng)格頂點(diǎn)數(shù)。
 */
@property (nonatomic, readonly) NSUInteger vertexCount NS_REFINED_FOR_SWIFT;

/**
 幾何圖形的網(wǎng)格頂點(diǎn).
 */
@property (nonatomic, readonly) const vector_float3 *vertices NS_REFINED_FOR_SWIFT;

/**
 面幾何的紋理坐標(biāo)的數(shù)目.
 */
@property (nonatomic, readonly) NSUInteger textureCoordinateCount NS_REFINED_FOR_SWIFT;

/**
 幾何的紋理坐標(biāo).
 */
@property (nonatomic, readonly) const vector_float2 *textureCoordinates NS_REFINED_FOR_SWIFT;

/**
 面幾何的三角形數(shù).
 */
@property (nonatomic, readonly) NSUInteger triangleCount;

/**
 幾何的三角指數(shù).
 */
@property (nonatomic, readonly) const int16_t *triangleIndices NS_REFINED_FOR_SWIFT;

/**
 通過應(yīng)用一組給定的混合形狀系數(shù)來創(chuàng)建和返回一個(gè)面幾何吵冒。
 可以提供一個(gè)空字典來創(chuàng)建一個(gè)中立的面幾何纯命。
 @param blendshape是一個(gè)混合形狀系數(shù)的字典。
 @return Face幾何學(xué)應(yīng)用了混合形狀痹栖。
 */
- (nullable instancetype)initWithBlendShapes:(NSDictionary<ARBlendShapeLocation, NSNumber*> *)blendShapes;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end

/**
 一個(gè)代表面孔的場景.
 */
@interface ARSCNFaceGeometry : SCNGeometry

/**
 使用金屬器件創(chuàng)建一個(gè)新的面部幾何圖形亿汞。
 @ param設(shè)備是一個(gè)金屬設(shè)備。
 @ return一個(gè)新的face幾何學(xué)
 */
+ (nullable instancetype)faceGeometryWithDevice:(id<MTLDevice>)device;


/**
 使用金屬器件創(chuàng)建一個(gè)新的面部幾何圖形揪阿。
 默認(rèn)情況下疗我,眼睛lids和區(qū)域之間的區(qū)域嘴唇之間沒有幾何形狀。將面部幾何作為一個(gè)occlusion幾何設(shè)置\ p fillMesh為YES南捂。這將填補(bǔ)在額外的幾何圖形中吴裤,眼睛的間隙和進(jìn)入的間隙嘴唇之間的差距。
 @param fillMesh是否填入額外的幾何圖形 眼睛之間的間隙和嘴唇之間的空隙溺健。
@ return一個(gè)新的face幾何學(xué)
 */
+ (nullable instancetype)faceGeometryWithDevice:(id<MTLDevice>)device
                              fillMesh:(BOOL)fillMesh;


/**
 用一個(gè)面幾何的頂點(diǎn)更新幾何圖形麦牺。
 @param face幾何學(xué)A face幾何學(xué)。
 */
- (void)updateFromFaceGeometry:(ARFaceGeometry *)faceGeometry;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end

7.ARFrame.h

  • ARFrame主要是追蹤相機(jī)當(dāng)前的狀態(tài)鞭缭,這個(gè)狀態(tài)不僅僅只是位置剖膳,還有圖像幀及時(shí)間等參數(shù)
  • 一個(gè)對象,它封裝了所有被跟蹤的時(shí)刻的狀態(tài)岭辣。
  • 模型提供呈現(xiàn)給定幀所需的所有數(shù)據(jù)的快照吱晒。
@interface ARFrame : NSObject <NSCopying>

/**
 標(biāo)識幀的時(shí)間戳。
 */
@property (nonatomic, readonly) NSTimeInterval timestamp;

/**
 幀的圖像捕獲 - 緩沖區(qū)圖像幀
 */
@property (nonatomic, readonly) CVPixelBufferRef capturedImage;

/**
 框架捕獲的深度數(shù)據(jù)
 Depth數(shù)據(jù)只提供在捕獲深度數(shù)據(jù)的幀上的face跟蹤
 */
@property (nonatomic, strong, readonly, nullable) AVDepthData *capturedDepthData;

/**
 確定深度數(shù)據(jù)的時(shí)間戳沦童。
 */
@property (nonatomic, readonly) NSTimeInterval capturedDepthDataTimestamp;

/**
 攝像機(jī)用來捕捉畫面的畫面仑濒。
 The camera提供了設(shè)備的位置和方向以及相機(jī)參數(shù)。
 表示這個(gè)ARFrame是哪一個(gè)相機(jī)的偷遗,iPhone7plus有兩個(gè)攝像機(jī)
 */
@property (nonatomic, copy, readonly) ARCamera *camera;

/**
 現(xiàn)場的一個(gè)錨點(diǎn)列表墩瞳。
 返回當(dāng)前相機(jī)捕捉到的錨點(diǎn)數(shù)據(jù)(當(dāng)一個(gè)3D虛擬模型加入到ARKit中時(shí),錨點(diǎn)值得就是這個(gè)模型在AR中的位置)
 */
@property (nonatomic, copy, readonly) NSArray<ARAnchor *> *anchors;

/**
 一種表示場景中光線的光估計(jì)氏豌。
 如果沒有光估計(jì)矗烛,就返回nil。
 燈光,詳情可見本章節(jié)ARLightEstimate類介紹(指的是燈光強(qiáng)度 一般是0-2000瞭吃,系統(tǒng)默認(rèn)1000)
 */
@property (nonatomic, strong, nullable, readonly) ARLightEstimate *lightEstimate;

/**
 特征點(diǎn)(應(yīng)該是捕捉平地或者人臉的碌嘀,比較蘋果有自帶的人臉識別功能)
 場景中的特征點(diǎn)與框架的原點(diǎn)有關(guān)。
 只提供了使用世界跟蹤的配置歪架。
 */
@property (nonatomic, strong, nullable, readonly) ARPointCloud *rawFeaturePoints;

/**
 根據(jù)2D坐標(biāo)點(diǎn)搜索3D模型股冗,這個(gè)方法通常用于,當(dāng)我們在手機(jī)屏幕點(diǎn)擊某一個(gè)點(diǎn)的時(shí)候和蚪,可以捕捉到這一個(gè)點(diǎn)所在的3D模型的位置止状,至于為什么是一個(gè)數(shù)組非常好理解。手機(jī)屏幕一個(gè)是長方形攒霹,這是一個(gè)二維空間怯疤。而相機(jī)捕捉到的是一個(gè)由這個(gè)二維空間射出去的長方體,我們點(diǎn)擊屏幕一個(gè)點(diǎn)可以理解為在這個(gè)長方體的邊緣射出一條線催束,這一條線上可能會有多個(gè)3D物體模型
 point:2D坐標(biāo)點(diǎn)(手機(jī)屏幕某一點(diǎn))(點(diǎn)在被捕獲圖像的圖像空間坐標(biāo)系統(tǒng)中集峦。取值范圍從(0,0)-左上角到(1,1)-右下角。)
 ARHitTestResultType:捕捉類型  點(diǎn)還是面(類型的搜索結(jié)果類型)
 (NSArray<ARHitTestResult *> *):追蹤結(jié)果數(shù)組  詳情見本章節(jié)ARHitTestResult類介紹
 */
- (NSArray<ARHitTestResult *> *)hitTest:(CGPoint)point types:(ARHitTestResultType)types;

/**
 返回提供的viewport大小和方向的顯示轉(zhuǎn)換。
 可以用來轉(zhuǎn)換圖像空間坐標(biāo)系統(tǒng)中的歸一化點(diǎn)在視圖的坐標(biāo)空間中被捕獲的圖像到歸一化點(diǎn)。轉(zhuǎn)換提供了正確的旋轉(zhuǎn)并在給定的方向和大小中顯示捕獲的圖像雨女。
 定位視圖端口的朝向。
 viewportSize大小的viewport帜消。
 相機(jī)窗口的的坐標(biāo)變換(可用于相機(jī)橫豎屏的旋轉(zhuǎn)適配)- 原來的API
 */
- (CGAffineTransform)displayTransformForOrientation:(UIInterfaceOrientation)orientation viewportSize:(CGSize)viewportSize;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end

8.ARHitTestResult.h

  • ARHitTestResult:點(diǎn)擊回調(diào)結(jié)果,這個(gè)類主要用于虛擬增強(qiáng)現(xiàn)實(shí)技術(shù)(AR技術(shù))中現(xiàn)實(shí)世界與3D場景中虛擬物體的交互。 比如我們在相機(jī)中移動。拖拽3D虛擬物體备恤,都可以通過這個(gè)類來獲取ARKit所捕捉的結(jié)果
/**
 hittest結(jié)果類型的選項(xiàng)集。
 捕捉類型枚舉
 */
typedef NS_OPTIONS(NSUInteger, ARHitTestResultType) {
    /** 結(jié)果類型與最接近的特征點(diǎn)相交 : 點(diǎn)*/
    ARHitTestResultTypeFeaturePoint              = (1 << 0),
    
    /**結(jié)果類型從相交的水平平面估計(jì)锦秒,確定為當(dāng)前幀 : 水平面 y為0 */
    ARHitTestResultTypeEstimatedHorizontalPlane  = (1 << 1),
    
    /** 結(jié)果類型與現(xiàn)有的平面錨相交 : 已結(jié)存在的平面 */
    ARHitTestResultTypeExistingPlane             = (1 << 3),
    
    /** 結(jié)果類型與現(xiàn)有的平面錨點(diǎn)相交露泊,考慮到飛機(jī)的范圍 : 已結(jié)存在的錨點(diǎn)和平面*/
    ARHitTestResultTypeExistingPlaneUsingExtent  = (1 << 4),
} NS_SWIFT_NAME(ARHitTestResult.ResultType);

@interface ARHitTestResult : NSObject

/**
 測試結(jié)果的類型 : 捕捉類型
 */
@property (nonatomic, readonly) ARHitTestResultType type;

/**
 從相機(jī)到交叉口的距離 : 3D虛擬物體與相機(jī)的距離(單位:米)
 */
@property (nonatomic, readonly) CGFloat distance;

/**
 這個(gè)變換矩陣定義了交叉的旋轉(zhuǎn),平移和縮放相對于錨或最近的特征點(diǎn) 
 本地坐標(biāo)矩陣(世界坐標(biāo)指的是相機(jī)為場景原點(diǎn)的坐標(biāo)脂崔,而每一個(gè)3D物體自身有一個(gè)場景,本地坐標(biāo)就是相對于這個(gè)場景的坐標(biāo))類似于frame和bounds的區(qū)別
 */
@property (nonatomic, readonly) matrix_float4x4 localTransform;

/**
 這個(gè)變換矩陣定義了交叉的旋轉(zhuǎn)梧喷,平移和縮放相對于這個(gè)世界 : 世界坐標(biāo)矩陣
 */
@property (nonatomic, readonly) matrix_float4x4 worldTransform;

/**
 hit- test交叉的錨, 只會為現(xiàn)有的飛機(jī)結(jié)果類型提供錨點(diǎn).
 錨點(diǎn)(3D虛擬物體砌左,在虛擬世界有一個(gè)位置,這個(gè)位置參數(shù)是SceneKit中的SCNVector3:三維矢量)铺敌,而錨點(diǎn)anchor是這個(gè)物體在AR現(xiàn)實(shí)場景中的位置汇歹,是一個(gè)4x4的矩陣
 */
@property (nonatomic, strong, nullable, readonly) ARAnchor *anchor;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end

9.ARLightEstimate.h

  • ARLightEstimate是一個(gè)燈光效果,它可以讓你的AR場景看起來更加的好
  • 一種表示場景中光線的光估計(jì)偿凭。
@interface ARLightEstimate : NSObject

/**
 照明的環(huán)境強(qiáng)度产弹。
 在一個(gè)照明良好的環(huán)境中,這個(gè)值接近1000。它通常從0(非常暗)到大約2000(非常明亮)痰哨。
 */
@property (nonatomic, readonly) CGFloat ambientIntensity;

/**
 燈光的環(huán)境色溫胶果。
 這指定了開爾文(6500對應(yīng)于純白色)照明的環(huán)境色溫。
*/
@property (nonatomic, readonly) CGFloat ambientColorTemperature;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end

/**
 A directional light estimate representing the light intensity and direction in the scene.
 */
API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos)
@interface ARDirectionalLightEstimate : ARLightEstimate

/**
 Second degree spherical harmonics coefficients representing the intensity of light.
 
 @discussion The data is an array of 27 32-bit floating-point values, containing three non-interleaved data sets
 corresponding to the red, green, and blue sets of coefficients.
 */
@property (nonatomic, copy, readonly) NSData *sphericalHarmonicsCoefficients;

/**
 The primary direction of light.
 */
@property (nonatomic, readonly) vector_float3 primaryLightDirection;

/**
 The intensity of light in the primary direction.
 */
@property (nonatomic, readonly) CGFloat primaryLightIntensity;

@end

10.ARPlaneAnchor

  • ARPlaneAnchor是ARAnchor的子類斤斧,筆者稱之為平地錨點(diǎn),平面在X和Z方向上定義早抠,其中Y是表面的正常。撬讽。ARKit能夠自動識別平地蕊连,并且會默認(rèn)添加一個(gè)錨點(diǎn)到場景中,當(dāng)然要想看到真實(shí)世界中的平地效果游昼,需要我們自己使用SCNNode來渲染這個(gè)錨點(diǎn)
  • 錨點(diǎn)只是一個(gè)位置
/**
一種描述平面錨定值的值甘苍。
 */
typedef NS_ENUM(NSInteger, ARPlaneAnchorAlignment) {
    /** 與重力平行的平面  */
    ARPlaneAnchorAlignmentHorizontal
} NS_SWIFT_NAME(ARPlaneAnchor.Alignment);

@interface ARPlaneAnchor : ARAnchor

/**
 :平面的對準(zhǔn) : 平地類型,目前只有一個(gè)烘豌,就是水平面 载庭。
 */
@property (nonatomic, readonly) ARPlaneAnchorAlignment alignment;

/**
 在錨的坐標(biāo)空間中平面的中心 : 3軸矢量結(jié)構(gòu)體,表示平地的中心點(diǎn)  x/y/z
 */
@property (nonatomic, readonly) vector_float3 center;

/**
 在錨的坐標(biāo)空間中平面的范圍 : 3軸矢量結(jié)構(gòu)體扇谣,表示平地的大忻两荨(寬度和高度)  x/y/z
 */
@property (nonatomic, readonly) vector_float3 extent;

/** 不可用 */
- (instancetype)initWithTransform:(matrix_float4x4)transform NS_UNAVAILABLE;

@end

11.ARPointCloud.h

  • ARPointCloud:點(diǎn)狀渲染云,主要用于渲染場景
@interface ARPointCloud : NSObject

/**
 點(diǎn)云中的點(diǎn)個(gè)數(shù)罐寨。
 */
@property (nonatomic, readonly) NSUInteger count;

/**
 包含點(diǎn)云的3D點(diǎn) : 每一個(gè)點(diǎn)的位置的集合(結(jié)構(gòu)體帶*表示的是結(jié)構(gòu)體數(shù)組)
 */
@property (nonatomic, readonly) const vector_float3 *points;

/**
 包含點(diǎn)云的3D點(diǎn)標(biāo)識符
 */
@property (nonatomic, readonly) const uint64_t *identifiers;

/** 不可用 */
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

@end

12.ARSCNView.h

  • ARSCNView是3D的AR場景視圖
  • 將ARSession渲染集成到SceneKit中的視圖
  • 視圖繪制相機(jī)背景靡挥,提供和更新相機(jī),管理錨點(diǎn)的節(jié)點(diǎn)鸯绿,并更新照明
@interface ARSCNView : SCNView

/**
 代理
 */
@property (nonatomic, weak, nullable) id<ARSCNViewDelegate> delegate;

/**
 視圖用來更新場景的會話 : AR會話視圖使用更新的場景
 */
@property (nonatomic, strong) ARSession *session;

/**
 指定視圖的場景跋破。
 */
@property(nonatomic, strong) SCNScene *scene;

/**
 確定視圖是否將更新場景的燈光
 視圖將自動創(chuàng)建和更新照明光。默認(rèn)值為YES瓶蝴。
 */
@property(nonatomic) BOOL automaticallyUpdatesLighting;

/**
 搜索與提供節(jié)點(diǎn)相關(guān)的錨點(diǎn)的場景層次結(jié)構(gòu)毒返。
 @ param節(jié)點(diǎn)在視圖的場景中。
 * 返回對應(yīng)節(jié)點(diǎn)的錨點(diǎn)舷手,節(jié)點(diǎn)是一個(gè)3D虛擬物體拧簸,它的坐標(biāo)是虛擬場景中的坐標(biāo),而錨點(diǎn)ARAnchor是ARKit中現(xiàn)實(shí)世界的坐標(biāo)
 */
- (nullable ARAnchor *)anchorForNode:(SCNNode *)node;

/**
 返回已映射到特定錨的節(jié)點(diǎn)男窟。
 @ param用現(xiàn)有的節(jié)點(diǎn)映射錨定錨盆赤。
 * 返回對應(yīng)錨點(diǎn)的物體
 */
- (nullable SCNNode *)nodeForAnchor:(ARAnchor *)anchor;

/**
 在當(dāng)前幀中搜索與視圖中某個(gè)點(diǎn)對應(yīng)的對象。
 在視圖的坐標(biāo)空間中歉眷,一個(gè)2D點(diǎn)可以參考線段上的任意點(diǎn)
 在三維空間中牺六。hit- testing是在這個(gè)線段上找到世界上的物體的過程。
 @ param點(diǎn)在視圖的坐標(biāo)系統(tǒng)中汗捡。
 @ param類型的搜索結(jié)果類型淑际。
 @返回一個(gè)所有的hittest結(jié)果的數(shù)組,從最近到最遠(yuǎn)。

 * 根據(jù)2D坐標(biāo)點(diǎn)搜索3D模型春缕,這個(gè)方法通常用于盗胀,當(dāng)我們在手機(jī)屏幕點(diǎn)擊某一個(gè)點(diǎn)的時(shí)候,可以捕捉到這一個(gè)點(diǎn)所在的3D模型的位置淡溯,至于為什么是一個(gè)數(shù)組非常好理解读整。手機(jī)屏幕一個(gè)是長方形,這是一個(gè)二維空間咱娶。而相機(jī)捕捉到的是一個(gè)由這個(gè)二維空間射出去的長方體米间,我們點(diǎn)擊屏幕一個(gè)點(diǎn)可以理解為在這個(gè)長方體的邊緣射出一條線,這一條線上可能會有多個(gè)3D物體模型
 point:2D坐標(biāo)點(diǎn)(手機(jī)屏幕某一點(diǎn))
 ARHitTestResultType:捕捉類型  點(diǎn)還是面
 (NSArray<ARHitTestResult *> *):追蹤結(jié)果數(shù)組  詳情見本章節(jié)ARHitTestResult類介紹
 數(shù)組的結(jié)果排序是由近到遠(yuǎn)
 */
- (NSArray<ARHitTestResult *> *)hitTest:(CGPoint)point types:(ARHitTestResultType)types;

@end

// 代理
#pragma mark - ARSCNViewDelegate

/**
 * 代理的內(nèi)部實(shí)現(xiàn)了SCNSceneRendererDelegate:scenekit代理 和ARSessionObserver:ARSession監(jiān)聽(KVO機(jī)制)
 */
@protocol ARSCNViewDelegate <SCNSceneRendererDelegate, ARSessionObserver>
@optional

/**
 實(shí)現(xiàn)此功能膘侮,為給定的錨提供一個(gè)自定義節(jié)點(diǎn)屈糊。
 @ discussion這個(gè)節(jié)點(diǎn)將自動添加到場景圖中。如果未實(shí)現(xiàn)此方法琼了,則將自動創(chuàng)建一個(gè)節(jié)點(diǎn)逻锐。如果返回nil,錨將被忽略雕薪。
 @ param渲染器渲染場景昧诱。
 @ param錨點(diǎn)添加。
 @ return將被映射到錨或nil的節(jié)點(diǎn)所袁。
 */
- (nullable SCNNode *)renderer:(id <SCNSceneRenderer>)renderer nodeForAnchor:(ARAnchor *)anchor;

/**
 當(dāng)一個(gè)新節(jié)點(diǎn)映射到給定的錨時(shí)調(diào)用盏档。
 @ param渲染器渲染場景。
 @ param節(jié)點(diǎn)映射到錨的節(jié)點(diǎn)燥爷。
 @ param錨點(diǎn)添加蜈亩。
 * 當(dāng)添加節(jié)點(diǎn)是會調(diào)用,我們可以通過這個(gè)代理方法得知我們添加一個(gè)虛擬物體到AR場景下的錨點(diǎn)(AR現(xiàn)實(shí)世界中的坐標(biāo)
 */
- (void)renderer:(id <SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor;

/**
 當(dāng)節(jié)點(diǎn)將從給定的錨點(diǎn)更新數(shù)據(jù)時(shí)調(diào)用前翎。
 @ param渲染器渲染場景稚配。
 @ param節(jié)點(diǎn)將被更新的節(jié)點(diǎn)。
 @ param錨點(diǎn)更新港华。

 * 將要刷新節(jié)點(diǎn)
 */
- (void)renderer:(id <SCNSceneRenderer>)renderer willUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor;

/**
 當(dāng)節(jié)點(diǎn)已從給定的錨點(diǎn)更新數(shù)據(jù)時(shí)調(diào)用道川。
 @ param渲染器渲染場景。
 @ param節(jié)點(diǎn)被更新的節(jié)點(diǎn)立宜。
 @ param錨點(diǎn)更新冒萄。

 * 已經(jīng)刷新節(jié)點(diǎn)
 */
- (void)renderer:(id <SCNSceneRenderer>)renderer didUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor;

/**
 當(dāng)給定的錨點(diǎn)被從場景圖中移除時(shí)調(diào)用。
 @ param渲染器渲染場景赘理。
 @ param節(jié)點(diǎn)被刪除的節(jié)點(diǎn)宦言。
 @ param錨點(diǎn)被移除扇单。
 
 * 移除節(jié)點(diǎn)
 */
- (void)renderer:(id <SCNSceneRenderer>)renderer didRemoveNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor;

@end

/**
 擴(kuò)展了ARSCNView的調(diào)試選項(xiàng)
 */
struct ARSCNDebugOptions {} API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);

/** 在場景中展示世界起源  */
FOUNDATION_EXTERN const SCNDebugOptions ARSCNDebugOptionShowWorldOrigin    Swift名字(ARSCNDebugOptions.showWorldOrigin);

/** 顯示在世界上檢測到的3D特征點(diǎn)  */
FOUNDATION_EXTERN const SCNDebugOptions ARSCNDebugOptionShowFeaturePoints   Swift名字(ARSCNDebugOptions.showFeaturePoints);

13.ARSession.h

  • ARSession是一個(gè)連接底層與AR視圖之間的橋梁商模,其實(shí)ARSCNView內(nèi)部所有的代理方法都是由ARSession來提供的
  • ARSession獲取相機(jī)位置數(shù)據(jù)主要有兩種方式:
    第一種:push。 實(shí)時(shí)不斷的獲取相機(jī)位置,由ARSession主動告知用戶施流。通過實(shí)現(xiàn)ARSession的代理- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame來獲取
    第二種:pull响疚。 用戶想要時(shí),主動去獲取瞪醋。ARSession的屬性currentFrame來獲取
/**
 運(yùn)行會話的選項(xiàng)集忿晕。
 這些選項(xiàng)改變了在會話中調(diào)用run的行為, 沒有提供選項(xiàng)將導(dǎo)致恢復(fù)跟蹤的默認(rèn)行為, 從最后一個(gè)已知位置和保持所有現(xiàn)有的錨。
 */
typedef NS_OPTIONS(NSUInteger, ARSessionRunOptions) {
    /** 會話將重置跟蹤 */
    ARSessionRunOptionResetTracking           = (1 << 0),
    
    /** 會話將刪除現(xiàn)有的錨 */
    ARSessionRunOptionRemoveExistingAnchors   = (1 << 1)
} NS_SWIFT_NAME(ARSession.RunOptions);

@interface ARSession : NSObject

/**
 代理
 */
@property (nonatomic, weak) id <ARSessionDelegate> delegate;

/**
 執(zhí)行委托調(diào)用的分派隊(duì)列银受。
 @ discussion如果沒有提供或nil践盼,委托調(diào)用將在主隊(duì)列上執(zhí)行。
 * 指定代理執(zhí)行的線程(主線程不會有延遲宾巍,子線程會有延遲)咕幻,不指定的話默認(rèn)主線程
 */
@property (nonatomic, strong, nullable) dispatch_queue_t delegateQueue;

/**
 會話的當(dāng)前框架 : 相機(jī)當(dāng)前的位置(是由會話追蹤配置計(jì)算出來的.
 */
@property (nonatomic, copy, nullable, readonly) ARFrame *currentFrame;

/**
 會話目前正在使用的配置 : 會話追蹤配置.
 */
@property (nonatomic, copy, nullable, readonly) ARConfiguration *configuration;

/**
 * 運(yùn)行會話(這行代碼就是開啟AR的關(guān)鍵所在)
 使用提供的配置運(yùn)行會話。
 @ discussion調(diào)用運(yùn)行在已經(jīng)啟動的會話上, 轉(zhuǎn)換立即使用新的配置顶霞。配置使用的配置肄程。
 */
- (void)runWithConfiguration:(ARConfiguration *)configuration NS_SWIFT_UNAVAILABLE("Use run(_:options:) instead");

/**
 * 運(yùn)行會話,只是多了一個(gè)參數(shù)ARSessionRunOptions:作用就是會話斷開重連時(shí)的行為选浑。ARSessionRunOptionResetTracking:表示充值追蹤  ARSessionRunOptionRemoveExistingAnchors:移除現(xiàn)有錨點(diǎn)
 使用提供的配置和選項(xiàng)運(yùn)行會話蓝厌。
 @ discussion調(diào)用運(yùn)行在已經(jīng)啟動的會話上, 轉(zhuǎn)換立即使用新的配置。選項(xiàng)可用于在轉(zhuǎn)換配置時(shí)更改默認(rèn)行為古徒。配置使用的配置拓提。
 @ param選項(xiàng)使用的運(yùn)行選項(xiàng)。
 */
- (void)runWithConfiguration:(ARConfiguration *)configuration options:(ARSessionRunOptions)options NS_SWIFT_NAME(run(_:options:));

/**
 暫停會話描函。
 @ discussion一旦暫停崎苗,就不會收到更多的更新會話直到運(yùn)行再次調(diào)用。
 */
- (void)pause;

/**
 在會話中添加一個(gè)錨舀寓。
 @ discussion這個(gè)錨將在下一個(gè)幀更新中添加胆数。
 @ param錨點(diǎn)添加。
 */
- (void)addAnchor:(ARAnchor *)anchor NS_SWIFT_NAME(add(anchor:));

/**
 從會話中刪除一個(gè)錨互墓。
 在隨后的幀更新中將刪除錨點(diǎn)必尼。
 @ param錨定要刪除。
 */
- (void)removeAnchor:(ARAnchor *)anchor NS_SWIFT_NAME(remove(anchor:));

@end

/**
  session代理分類兩部分篡撵,一個(gè)是觀察者(KVO) 一個(gè)是委托者(代理)
 */
#pragma mark - ARSessionObserver

// session KVO觀察者
@protocol ARSessionObserver <NSObject>

@optional

/**
 這在會話失敗時(shí)調(diào)用 : session失敗
 關(guān)于失敗的討論將暫停判莉。
 @ param會話失敗了。
 @ param錯(cuò)誤被報(bào)告的錯(cuò)誤(見ARError.h)育谬。
 */
- (void)session:(ARSession *)session didFailWithError:(NSError *)error;

/**
 當(dāng)相機(jī)的跟蹤狀態(tài)發(fā)生變化時(shí)券盅,就會調(diào)用這個(gè)功能。
 @ param會話正在運(yùn)行膛檀。
 @ param相機(jī)改變追蹤狀態(tài)的相機(jī)锰镀。
 */
- (void)session:(ARSession *)session cameraDidChangeTrackingState:(ARCamera *)camera;

/**
 這在會話被中斷時(shí)調(diào)用 : session意外斷開(如果開啟ARSession之后娘侍,APP退到后臺就有可能導(dǎo)致會話斷開)
 討論會話將被中斷,不再能夠跟蹤
 它無法接收所需的傳感器數(shù)據(jù)泳炉。當(dāng)視頻捕捉被打斷時(shí)憾筏,
 例如,當(dāng)應(yīng)用程序被發(fā)送到后臺或者當(dāng)應(yīng)用程序出現(xiàn)時(shí)
 多個(gè)前臺應(yīng)用程序(參見AVCaptureSessionInterruptionReason)花鹅。
 沒有附加的幀更新將被傳送到中斷結(jié)束氧腰。
 @ param會話被中斷的會話。
 */
- (void)sessionWasInterrupted:(ARSession *)session;

/**
 這在會話中斷結(jié)束時(shí)調(diào)用 : session會話斷開恢復(fù)(短時(shí)間退到后臺再進(jìn)入APP會自動恢復(fù))
 討論會話將繼續(xù)從上一次已知狀態(tài)運(yùn)行中斷已經(jīng)結(jié)束刨肃。如果設(shè)備移動了古拴,錨就會偏離方向。為了避免這種情況真友,一些應(yīng)用程序可能需要重新設(shè)置跟蹤(參見ARSessionRunOptions)斤富。
 @ param會話被中斷的會話。
 */
- (void)sessionInterruptionEnded:(ARSession *)session;

/**
 當(dāng)會話輸出一個(gè)新的音頻樣本緩沖區(qū)時(shí)锻狗,調(diào)用這個(gè)方法满力。
 @ param會話正在運(yùn)行。
 @param audioSampleBuffer捕獲的音頻樣本緩沖區(qū)轻纪。
 */
- (void)session:(ARSession *)session didOutputAudioSampleBuffer:(CMSampleBufferRef)audioSampleBuffer;

@end

// session 代理
#pragma mark - ARSessionDelegate

@protocol ARSessionDelegate <ARSessionObserver>

@optional

/**
 * 相機(jī)當(dāng)前狀態(tài)(ARFrame:空間位置油额,圖像幀等)更新
 這是在新框架被更新時(shí)調(diào)用的。
 @ param會話正在運(yùn)行刻帚。
 @ param框架已經(jīng)更新的框架潦嘶。
 */
- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame;

/**
 當(dāng)在會話中添加新錨時(shí)調(diào)用此方法。
 @ param會話正在運(yùn)行崇众。
 @ param錨定了一系列添加的錨掂僵。
 */
- (void)session:(ARSession *)session didAddAnchors:(NSArray<ARAnchor*>*)anchors;

/**
 這是當(dāng)錨被更新時(shí)的調(diào)用
 @ param會話正在運(yùn)行。
 @ param錨定了一系列更新的錨點(diǎn)顷歌。
 */
- (void)session:(ARSession *)session didUpdateAnchors:(NSArray<ARAnchor*>*)anchors;

/**
 當(dāng)從會話中刪除錨時(shí)锰蓬,調(diào)用此方法。
 @ param會話正在運(yùn)行眯漩。
 @ param錨定了一組被移除的錨芹扭。
 */
- (void)session:(ARSession *)session didRemoveAnchors:(NSArray<ARAnchor*>*)anchors;

14.ARSKView.h

  • ARSKView也是AR視圖,他是2D的
  • ARSKView基本與ARSCNView類似
#pragma mark ARSKViewDelegate
/**
 * 協(xié)議
 */
@protocol ARSKViewDelegate <SKViewDelegate, ARSessionObserver>
@optional

/**
 * 實(shí)現(xiàn)這個(gè)提供一個(gè)自定義為給定的錨節(jié)點(diǎn)
 * @discussion這個(gè)節(jié)點(diǎn)將自動添加到場景圖赦抖。如果沒有實(shí)現(xiàn)這個(gè)方法,將自動創(chuàng)建一個(gè)節(jié)點(diǎn)舱卡。如果返回nil錨將被忽略。
 * @param - 渲染場景視圖的視圖队萤。
 * @param - 錨添加的錨轮锥。
 * @return - 節(jié)點(diǎn)將映射到錨或零。
 */
- (nullable SKNode *)view:(ARSKView *)view nodeForAnchor:(ARAnchor *)anchor;

/**
 * 當(dāng)一個(gè)新節(jié)點(diǎn)映射到給定的錨
 * @param - 渲染場景視圖的視圖要尔。
 * @param - 映射到錨節(jié)點(diǎn)的節(jié)點(diǎn)舍杜。
 * @param - 錨添加的錨份汗。
 */
- (void)view:(ARSKView *)view didAddNode:(SKNode *)node forAnchor:(ARAnchor *)anchor;

/**
 * 當(dāng)一個(gè)節(jié)點(diǎn)將更新數(shù)據(jù)從給定的錨。
 * @param - 渲染場景視圖的視圖蝴簇。
 * @param - 節(jié)點(diǎn)的節(jié)點(diǎn)將被更新。
 * @param - 錨錨的更新匆帚。
 */
- (void)view:(ARSKView *)view willUpdateNode:(SKNode *)node forAnchor:(ARAnchor *)anchor;

/**
 * 當(dāng)一個(gè)節(jié)點(diǎn)和數(shù)據(jù)從給定的錨已經(jīng)更新熬词。
 * @param - 渲染場景視圖的視圖。
 * @param - 節(jié)點(diǎn)的節(jié)點(diǎn)更新吸重。
 * @param - 錨錨的更新互拾。
 */
- (void)view:(ARSKView *)view didUpdateNode:(SKNode *)node forAnchor:(ARAnchor *)anchor;

/**
 * 時(shí)調(diào)用映射節(jié)點(diǎn)已被刪除從給定的錨的場景圖
 * @param - 渲染場景視圖的視圖。
 * @param - 點(diǎn)的節(jié)點(diǎn)刪除嚎幸。
 * @param - 錨錨的更新颜矿。
 */
- (void)view:(ARSKView *)view didRemoveNode:(SKNode *)node forAnchor:(ARAnchor *)anchor;

@end


#pragma mark ARSKView


/**
 將ARSession渲染集成到SpriteKit中的視圖。
 @ discussion視圖繪制相機(jī)背景嫉晶,項(xiàng)目和地圖錨點(diǎn)到節(jié)點(diǎn)骑疆。
 */
@interface ARSKView : SKView

/**
 指定視圖的委托。
 */
@property (nonatomic, weak, nullable) NSObject <ARSKViewDelegate> *delegate;

/**
 視圖用來更新視圖的會話替废。
 */
@property (nonatomic, strong) ARSession *session;

/**
 搜索與提供節(jié)點(diǎn)相關(guān)的錨點(diǎn)的場景層次結(jié)構(gòu)箍铭。
 @ param節(jié)點(diǎn)在視圖的場景中。
 */
- (nullable ARAnchor *)anchorForNode:(SKNode *)node;

/**
 返回已映射到特定錨的節(jié)點(diǎn)椎镣。
 @ param用現(xiàn)有的節(jié)點(diǎn)映射錨定錨诈火。
 */
- (nullable SKNode *)nodeForAnchor:(ARAnchor *)anchor;

/**
 在當(dāng)前幀中搜索與視圖中某個(gè)點(diǎn)對應(yīng)的對象。
 在視圖的坐標(biāo)空間中状答,一個(gè)2D點(diǎn)可以參考線段上的任意點(diǎn)
 在三維空間中冷守。hit- testing是在這個(gè)線段上找到世界上的物體的過程。
 @ param點(diǎn)在視圖的坐標(biāo)系統(tǒng)中惊科。
 @ param類型的搜索結(jié)果類型拍摇。
 @返回一個(gè)所有的hittest結(jié)果的數(shù)組,從最近到最遠(yuǎn)馆截。
 */
- (NSArray<ARHitTestResult *> *)hitTest:(CGPoint)point types:(ARHitTestResultType)types;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載授翻,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末孙咪,一起剝皮案震驚了整個(gè)濱河市堪唐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翎蹈,老刑警劉巖淮菠,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荤堪,居然都是意外死亡合陵,警方通過查閱死者的電腦和手機(jī)枢赔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拥知,“玉大人踏拜,你說我怎么就攤上這事〉吞蓿” “怎么了速梗?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長襟齿。 經(jīng)常有香客問我姻锁,道長,這世上最難降的妖魔是什么猜欺? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任位隶,我火速辦了婚禮,結(jié)果婚禮上开皿,老公的妹妹穿的比我還像新娘涧黄。我一直安慰自己,他們只是感情好赋荆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布弓熏。 她就那樣靜靜地躺著,像睡著了一般糠睡。 火紅的嫁衣襯著肌膚如雪挽鞠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天狈孔,我揣著相機(jī)與錄音信认,去河邊找鬼。 笑死均抽,一個(gè)胖子當(dāng)著我的面吹牛嫁赏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播油挥,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼潦蝇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了深寥?” 一聲冷哼從身側(cè)響起攘乒,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惋鹅,沒想到半個(gè)月后则酝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闰集,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年沽讹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了般卑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爽雄,死狀恐怖蝠检,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挚瘟,我是刑警寧澤叹谁,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站刽沾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏排拷。R本人自食惡果不足惜侧漓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望监氢。 院中可真熱鬧布蔗,春花似錦、人聲如沸浪腐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽议街。三九已至泽谨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間特漩,已是汗流浹背吧雹。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涂身,地道東北人雄卷。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蛤售,于是被迫代替她去往敵國和親丁鹉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • ARKit ARKit框架通過集成iOS設(shè)備攝像頭和運(yùn)動功能悴能,在您的應(yīng)用程序或游戲中產(chǎn)生增強(qiáng)現(xiàn)實(shí)體驗(yàn)揣钦。 概述 增強(qiáng)...
    暗夜夜夜行路閱讀 5,804評論 0 17
  • ARkit Introducing ARKit iOS 11引入ARKit,這是 個(gè)全新的框架漠酿,允許開發(fā)者輕松地為...
    坤哥愛卿閱讀 1,342評論 0 1
  • 一拂盯、AR簡介: 增強(qiáng)現(xiàn)實(shí)技術(shù)(Augmented Reality,簡稱 AR)记靡,是一種實(shí)時(shí)地計(jì)算攝影機(jī)影像的位置及...
    rectinajh閱讀 2,078評論 0 6
  • 老屋木格子窗的日子我是過過的谈竿。那樣的日子很靜团驱,很薄,夾在門前的楊樹和屋后野田的間隙里空凸,隨手一疊嚎花,就成了一幅畫。 春...
    樓蘭之舞閱讀 1,194評論 19 14
  • 【作者介紹】金金,33歲道逗,兩個(gè)孩子的媽媽兵罢,大寶7歲,二寶4個(gè)月滓窍,本科英語專業(yè)卖词,通過了英語專業(yè)八級考試,5年國企吏夯、3...
    袁春楠閱讀 301評論 0 0