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;