Apple Engine

Apple, iPhone, iOS, その周辺のことについて

ARKit 3 の更新内容(Xcode 11 Beta 1)

ARKit 3 の API の更新内容を調べてみた。
API の翻訳であるため新機能の詳しい説明はない。

新機能の概要に関しては別記事を参照。

 

ARView について

今回は書く量が多いので、ARView に関しては RealityKit の API を調べる際に書くかもしれないので割愛。

ARView の内容的には、イニシャライズやビュー操作、シーン、エンティティ、音や物理シミュレーションやライトなどの環境設定、カメラ、ARSession、座標変換、レイキャストやヒットテスト、タッチ/マウス/キーなどレスポンダー関連、スナップショット、デバッグオプションが設定できる。

 

注意点

  • Beta であるため今後、変更、追加、削除が行われる可能性がある。
  • 今回のジョイントは、3DCG DCC ツールでいうボーンやスケルトンは同じもの。
    ドキュメント上、スケルトンはジョイントが集まったものとして記載されている。
  • 基本的には support や enable がつくものを命令を実行する前に使用できるか調べる必要がある。(しないと動かないものがある)

英語が得意なわけではないので、翻訳内容が間違っていたらすみません。

 

以下、API の更新内容。

 

Essentials

ARSession

ARSession からコラボレーション用の識別 ID を取得する。

var identifier: UUID { get }

 

ARSession.RunOptions

変更不明。

init(rawValue: UInt)

 

ARSessionObserver

セッションでコラボレーションデータを作成したときに呼び出されるメソッド。

optional func session(_ session: ARSession, 
didOutputCollaborationData data: ARSession.CollaborationData)

以下、コラボレーション用のエラー判別用。

 

ARError
static var collaborationDataUnavailable: ARError.Code { get }
ARError.Code
case collaborationDataUnavailable = 304

 

ARSession でのレイキャスト関連
raycast(_:)

レイと実世界の表面との交差を1回のみ調べる。
スクリーン上からレイを飛ばし、カメラから近い順にレイキャストに関する情報の配列を返し、無い場合は空の配列を返す。

func raycast(_ query: ARRaycastQuery) -> [ARRaycastResult]

 

trackedRaycast(_:updateHandler:)

レイキャストクエリを繰り返し現実環境内で更新されたサーフェスを通知する。

セッションが繰り返し呼び出すレイキャストクエリをラップしている。

停止する準備ができたら stopTracking() を呼び出す。

func trackedRaycast(_ query: ARRaycastQuery, updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?

 

ARSession でのマルチユーザー関連
update(with:)

他のユーザーが収集された現実環境に関する情報で更新を行う。
Multiuser AR に参加している他のユーザーからコラボレーションデータを受信した時、セッションを更新するにはこの関数を呼び出す。

func update(with collaborationData: ARSession.CollaborationData)

 

ARSession.CollaborationData

ユーザーによって収集された現実環境に関する情報を保持するオブジェクト。

class CollaborationData : NSObject

 

init(data: Data)

シリアルライズされたコラボレーションデータからコラボレーションデータオブジェクトを作成する。

別のユーザーからネットワーク経由でシリアル化されたコラボレーションデータを受け取ると、ARSession が作成され、
それを使用して CollaborationData オブジェクトを作成し、update(with:) を呼び出してセッションを更新する。

init(data: Data)

 

var data: Data { get }

このセッションのワールドデータやアンカーなどに関するシリアル化された情報をもつ。

var data: Data { get }

 

ARSessionProviding

セッションのデータソース。

ARCoachingOverlayView はセッションへのアクセスを必要とし、そのために sessionProvider を公開する。

protocol ARSessionProviding

 

session

必須項目。

var session: ARSession { get }

 

ARConfiguration

supportsFrameSemantics(_:)

特定の機能がサポートされているかどうかを確認する。

class func supportsFrameSemantics(_ frameSemantics: ARConfiguration.FrameSemantics) -> Bool

 

frameSemantics

アクティブなフレームセマンティクス。
フレームセマンティクスは ARKit がフレームから抽出する2次元情報を表す。

  • 2Dボディ検出 (bodyDetection)
  • ピープルオクルージョン(personSegmentation)
  • 深度情報を含んだピープルオクルージョン (personSegmentationWithDepth)

 

独自レンダラーでピープルオクルージョンを実装する場合は segmentationBuffer と EstimatedDepthData を使用する。

 

ARConfiguration.FrameSemantics

アプリで有効にできるオプションのフレーム機能。

struct FrameSemantics

 

フレームセマンティクス機能を作成する

init(rawValue: UInt)

 

上記 frameSemantics 参照。

static var bodyDetection: ARConfiguration.FrameSemantics
static var personSegmentation: ARConfiguration.FrameSemantics
static var personSegmentationWithDepth: ARConfiguration.FrameSemantics

 

ARConfiguration.VideoFormat

キャプチャデバイスの位置を調べる。
詳しくは AVCaptureDevice.Position を参照。

var captureDevicePosition: AVCaptureDevice.Position { get }

 

ARAnchor

sessionIdentifier

アンカーがもつセッションのユニーク ID。
アンカーがセッションに追加された時 ARKit によって設定される。

var sessionIdentifier: UUID? { get }

 

カメラ(ARFrame と カメラ設定)

ARFrame

スクリーンポイントに対するレイキャストクエリを取得する。

func raycastQuery(from point: CGPoint, 
        allowing target: ARRaycastQuery.Target, 
        alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery

 

detectedBody

ARKit がカメラ画像内で認識する人物の画面位置情報。

var detectedBody: ARBody2D? { get }

 

segmentationBuffer

仮想コンテンツを隠すために使用するカメラフィードからのオブジェクトの形状を識別するピクセル情報を含むバッファ。

カメラフィードを処理することによってバッファの内容を生成し、
カスタムレンダラで ARMatteGenerator から提供されているアルファマットとデプスマットを使用してこのプロパティを適用する。

var segmentationBuffer: CVPixelBuffer? { get }

 

estimatedDepthData

仮想コンテンツを隠すために使用するカメラフィードから推定した深度値を表すバッファ。

segmentationBuffer と同様にカスタムレンダラで ARMatteGenerator から提供されているアルファマットとデプスマットを使用してこのプロパティを適用する。

var estimatedDepthData: CVPixelBuffer? { get }

 

ARFrame.SegmentationClass

仮想コンテンツを隠すために使用するピクセルの分類を定義する。

enum SegmentationClass : UInt8

 

カメラフィードでは人物のみが識別されるため、 利用可能なピクセル分類は以下の二つ

  • ARFrame.SegmentationClass.person
  • ARFrame.SegmentationClass.none

 

cameraGrainIntensity

カメラグレインテクスチャで存在するグレイン(画像ノイズ)の量を指定する値。
0 〜 1 の範囲内で正規化され 0 はグレインを指定しない。

この値を cameraGrainTexture の depth コンポーネントに適用する時、Metal テクスチャに格納されている視覚的なイメージノイズデータのバリエーションの中から、強度レベルに一致するものを選択する。

var cameraGrainIntensity: Float { get }

 

cameraGrainTexture

ARKit で撮影しているビデオストリームの視覚特性に合わせた Metal テクスチャを生成する。
室内など暗い空間の場合、カメラ画像となる背景画像にノイズが走るため、仮想コンテンツにもそれに合わせたノイズをのせるためのテクスチャ。

var cameraGrainTexture: MTLTexture? { get }

 

ARCamera

exposureDuration

仮想コンテンツレンダリング時にモーションブラーを使用するための値。
カスタムレンダラーを使用し表示する場合は、この値を使用して仮想コンテンツへモーションブラーの適応量を指定する。

var exposureDuration: TimeInterval { get }

 

exposureOffset

カスタムレンダラーを使用するシーンで、シーンを明るくするため値。

var exposureOffset: Float { get }

 

Quick Look

ARQuickLookPreviewItem

AR クイックルック の見た目をカスタマイズするために使用するオブジェクト。
バックグラウンド時、共有シートで共有するコンテンツの指定、特定のモデルに対して拡大縮小を無効にするなどを制御する。

class ARQuickLookPreviewItem : NSObject

 

init(fileAt: URL)

ファイルの URL を使用し、新しい AR Quick Look プレビューを初期化する。

init(fileAt url: URL)

 

allowsContentScaling

ピンチジェスチャーで仮想コンテンツを拡大縮小可能か決めるブール値。

var allowsContentScaling: Bool { get set }

 

canonicalWebPageURL

ユーザーが共有シートを起動した時に共有する Web URL。
デフォルト値は nil。

共有シートを起動したときに Quick Look が USDZ ファイルを共有することを示す。

var canonicalWebPageURL: URL? { get set }

 

ディスプレイ(View)

ARView

ARView は割愛。 RealityKit を説明する際に紹介する。

 

ARSCNView

raycastQuery(from:allowing:alignment:)

ビュー上の点から発生するレイキャストクエリを作成する。
この関数を呼び出すと ARKit は引数のスクリーンスペースポイントから正の z 方向レイを飛ばし、現実環境に存在するかどうかを判断し3次元位置を返す。

func raycastQuery(from point: CGPoint, 
        allowing target: ARRaycastQuery.Target, 
        alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery?

 

rendersMotionBlur

モーションブラーをレンダリングするかどうかを決める。
ARSCNView の場合、SCNCamera のパラメーターを上書きする。

var rendersMotionBlur: Bool { get set }

 

rendersCameraGrain

SceneKit で仮想コンテンツに画像ノイズを適用するかどうかを決定する。
ARSCNView の場合、SCNCamera のパラメーターを上書きする。

var rendersCameraGrain: Bool { get set }

 

ARCoachingOverlayView

アプリを起動時に ARKit が平面を見つけるなど状態を知らせるコーチングオーバーレイを表示する UI を提供する。

別記事で記載。

 

ワールドトラッキング

ARWorldTrackingConfiguration

ARWorldTrackingConfiguration.PlaneDetection

初期化が追加

init(rawValue:)

 

automaticImageScaleEstimationEnabled

イメージトラッキングの際、トラッキングする画像の大きさを推定し設定するフラグ。

var automaticImageScaleEstimationEnabled: Bool { get set }

 

userFaceTrackingEnabled

ワールドトラッキングでフェイストラッキングを使用するか決めるフラグ。

var userFaceTrackingEnabled: Bool { get set }

 

supportsUserFaceTracking

ワールドトラッキングでフェイストラッキングをサポートするか決めるフラグ。

class var supportsUserFaceTracking: Bool { get }

 

wantsHDREnvironmentTextures

HDR の環境テクスチャを作成するするか決めるフラグ。

var wantsHDREnvironmentTextures: Bool { get set }

 

isCollaborationEnabled

Multiuser AR を有効/無効を決め、 ワールドデータを定期的に出力するか ARKit へ指示するフラグ。

var isCollaborationEnabled: Bool { get set }

 

ARPlaneAnchor

ARPlaneAnchor.Classification

このブログでは書き忘れたが iOS 11 からあるもの。
検出されたプレーンアンカーから、
現実世界の平面から分類プロパティから取得されたサーフェスのタイプと
その状態の両方を識別するもの。

今回、ドア、窓が追加された。

case door
case window

 

レイキャスト

ARRaycastQuery

現実世界のサーフェスで3次元空間の位置を調べるために使用する数学的なレイ。 3D ベクトルと開始位置を指定してレイキャストクエリを作成する。

ユーザーから Z 方向の外側に向かってキャストする(2D スクリーン位置とデフォルトベクトルを使用する)レイキャストクエリを作成する場合は、makeRaycastQuery(from:allowing:alignment:) か ARView、ARSCNView のメソッドを使用する。

 

init(origin:direction:allowing:alignment:)

新しいレイキャストクエリを作る。

init(origin: simd_float3, 
direction: simd_float3, 
allowing target: ARRaycastQuery.Target, 
alignment: ARRaycastQuery.TargetAlignment)

 

target

レイを発生させた時にターゲット(終点)となる平面タイプ。
平面、無限平面、推定平面のみ。

var target: ARRaycastQuery.Target { get }

 

ARRaycastQuery.Target

レイキャストを交差させることができる平面の種類。

enum Target : Int

 

指定できる enum の値は平面、平面ジオメトリ(推定平面)、無限平面

  • estimatedPlane
  • existingPlaneGeometry
  • existingPlaneInfinite

 

targetAlignment

重力方向に対してのターゲットの配置向き。
設定できるものは平面同様に、水平、垂直、その両方。

var targetAlignment: ARRaycastQuery.TargetAlignment { get }

 

ARRaycastQuery.TargetAlignment

重力方向に対してのターゲットの配置向きの設定の enum。
水平垂直、水平、垂直の設定。

  • any
  • horizontal
  • vertical

 

direction

3D 空間でレイの軌跡を表すベクトル。

var direction: simd_float3 { get }

 

origin

レイの開始位置を定義する 3D 座標。

var origin: simd_float3 { get }

 

ARTrackedRaycast

ARKit が連続して繰り返すレイキャストクエリ。 時間の経過とともに洗練された結果を返す。

 

update(_:)

連続して繰り返す必要がある場合、新しいクエリを提供する。
レイキャストクエリが失敗した場合、
ARKit は空の結果を更新ハンドラに渡し、クエリのレイの追跡を停止する。

func update(_ query: ARRaycastQuery)

 

stopTracking()

レイキャストクエリの繰り返しを停止する。

func stopTracking()

 

追跡したレイキャストは stopTracking() を呼び出して明示的に停止するまで継続的に更新されるが、
以下の場合レイキャストは自動的に停止する。

  • ARKit が sessionWasInterrupted(_:) を飛び出した時
  • セッション設定が変更された時
  • ARTrackedRaycast の割り当てが解除された時
  • update(_:) を使用して指定したクエリが失敗した時

 

ARRaycastResult

画面上の点を調べることによって見つけた現実世界の表面に関する情報。

class ARRaycastResult : NSObject

 

カスタムレンダラーを使用している場合は、スクリーンポイントを使用して実際の位置を以下の関数で見つけることができる。

  • ARFrame の raycastQuery(from:allowing:alignment:) 関数
  • ARSession の raycast(_:) 関数

 

追跡したレイキャスティングは、ARSession の trackedRaycast(_: updateHandler:) を呼び出す。

カスタムレンダラーを使わずに RealityKit、SceneKit を使用する場合は用意されている関数を使用する。 ARSCNView は raycastQuery(from:allowing:alignment:) 関数を使用して、スクリーンポイントから実際のサーフェスを検索できる。

取得できるパラメーターは既存のものと上記で紹介しているので省略。

var worldTransform: simd_float4x4
var anchor: ARAnchor?
var target: ARRaycastQuery.Target
enum ARRaycastQuery.Target
var targetAlignment: ARRaycastQuery.TargetAlignment
enum ARRaycastQuery.TargetAlignment

 

ARHitTestResult.ResultType

変更不明。

init(rawValue: UInt)

 

フェイストラッキング

ARFaceAnchor.BlendShapeLocation

変更不明。

init(rawValue: String)

 

ARFaceTrackingConfiguration

supportsWorldTracking

iOS デバイスがフェイストラッキングによるワールドトラッキングをサポートを示すフラグ。

ワールドトラッキングを有効にする前にこれを呼び出し、isWorldTrackingEnabled を使用しフェイストラッキング設定を始める。

class var supportsWorldTracking: Bool { get }

 

isWorldTrackingEnabled

フェイストラッキングによるワールドトラッキングを可能にするブール値。

iOS デバイスがフェイストラッキングによるワールドトラッキングをサポートしているかどうかを確認してから、この isWorldTrackingEnabled を呼び出す。

var isWorldTrackingEnabled: Bool { get set }

 

maximumNumberOfTrackedFaces

同時にフェイストラキングする顔の最大数。

デフォルト値は1。
特定のフレームでフェイストラッキングの数を制限するには、フェイストラッキングの最大数を設定する。

このプロパティを設定する前に supportedNumberOfTrackedFaces の値を確認する。

var maximumNumberOfTrackedFaces: Int { get set }

 

supportedNumberOfTrackedFaces

ARKit が同時にフェイストラッキングできる最大数。
現状では 3。

maximumNumberOfTrackedFaces を使用する場合は、この値を超えてはならない。

class var supportedNumberOfTrackedFaces: Int { get }

 

People(ボディトラッキング)

ARBodyTrackingConfiguration

3D 空間で人の動きのトラッキングのために使用するコンフィグレーション。

class ARBodyTrackingConfiguration : ARConfiguration

 

ARKit がバックカメラフィード内の人物を認識すると、 session(_: didAdd:) を呼び出し、 パッペティング(仮想キャラの操作)に使用する ARBodyAnchor を渡す。

ARConfiguration.FrameSemantics タイプ の bodyDetection はデフォルトで有効。 フレームの detectedBody を介して、検出されたボディの画面位置にアクセスできる。

また、平面検出と画像検出が有効になっているため、ボディアンカーを選択した表面または画像に配置することができる。

 

init()

新しいボディトラッキング設定を作成する。

init()

 

initialWorldMap

ARWorldMap を実行中の ARSession の状態をカプセル化する。
ARWorldMap と同じなので割愛。

多分、Multi peer 用。

var initialWorldMap: ARWorldMap? { get set }

 

automaticSkeletonScaleEstimationEnabled

トラッキングする人の身長を ARKit が推定するかどうかを決定するフラグ。

このプロパティを true に設定すると、   ARKit は人の体のアンカーの EstimatedScaleFactor の値を計算するように指示する。

ARKit は実世界の人物の位置を正確に推定するためにはその人物の身長を知っている必要があるが、このプロパティを有効にするとボディアンカーを割り当てる前に認識される人物の体格を自動で推定する。

var automaticSkeletonScaleEstimationEnabled: Bool { get set }

 

isAutoFocusEnabled

他のコンフィグレーションと同様に、カメラ画像をオートフォーカスを有効する。
iOS 11.3 からデフォルトで有効になっている。

var isAutoFocusEnabled: Bool { get set }

 

automaticImageScaleEstimationEnabled

上記のワールドトラッキングのものと同じ。

var automaticImageScaleEstimationEnabled: Bool { get set }

 

detectionImages

検出する画像の参照画像を設定する。
既存のワールドトラッキングのものと同じ。

var detectionImages: Set<ARReferenceImage> { get set }

 

maximumNumberOfTrackedImages

トラッキングする画像の最大数。
既存のワールドトラッキングのものと同じ。

var maximumNumberOfTrackedImages: Int { get set }

 

wantsHDREnvironmentTextures

HDR の環境テクスチャを作成するするか決めるフラグ。
ワールドトラッキングのものと同じ。

var wantsHDREnvironmentTextures: Bool { get set }

 

environmentTexturing

ARKit で環境テクスチャを生成するために使用する。
既存のワールドトラッキングのものと同じ。

var environmentTexturing: ARWorldTrackingConfiguration.EnvironmentTexturing { get set }

 

ARBodyAnchor

ARKit がカメラフィード内で検知した人物のピボットジョイントの 3D 空間での動きを追跡するオブジェクト。

class ARBodyAnchor : ARAnchor

 

ARBodyTrackingConfiguration を使用してセッションを実行することでモーションキャプチャを有効にし、
バックカメラフィード内の人物を認識すると ARBodyAnchor を使用してデリゲートのsession(_:didAdd :) を呼び出す。

ボディアンカーの変形位置はスケルトンの股関節を起点にマッピングされる。

また、フレームのアンカーリスト内で追跡している人体(ボディアンカー)にアクセスすることも可能。

 

skeleton

3D 空間でトラッキングされたボディのモーション情報を受け取る。

var skeleton: ARSkeleton3D { get }

 

estimatedScaleFactor

本体のデフォルトの高さと、実行時に ARKit が推定する高さを関連付ける。

automaticSkeletonScaleEstimationEnabled を true に設定した場合、 このプロパティを 0.0 〜 1.0 の値に設定する。

デフォルト値は 1.0。

var estimatedScaleFactor: CGFloat { get }

 

ARSkeleton3D

各ジョイントの 3D ローカル、およびモデル変換情報を追加することによってARSkeleton プロトコルを補完する。

class ARSkeleton3D : ARSkeleton

 

プロパティやメソッドはドキュメントの説明がないため割愛。

多分、ジョイントのローカルかモデルからの座標のプロパティとジョイント名から座標を取るメソッド。

var jointLocalTransforms: [simd_float4x4] { get }
var jointModelTransforms: [simd_float4x4] { get }
func localTransform(for: ARSkeleton.JointName) -> simd_float4x4?
func modelTransform(for: ARSkeleton.JointName) -> simd_float4x4?

 

ARSkeleton

ボディトラッキング対象のスケルトン用インターフェース。
ARKit はボディトラッキングの状態をジョイントの集まりとして動きを渡す。

class ARSkeleton : NSObject

 

definition

現在のボディの状態を定義するジョイントの構成。

var definition: ARSkeletonDefinition { get }

 

isJointTracked(_:)

ARKit が特定のインデックスのジョイントをトラッキングするかどうか伝える。

スケルトン定義内の 93 個すべてのジョイントをトラッキングしないため、
この機能を使用して特定のインデックスを使用してトラッキングするジョイントを決定する。

func isJointTracked(_ jointIndex: Int) -> Bool

 

ARSkeleton.JointName

トラッキングするジョイントの名前を定義するオブジェクト。

ARKit は名前付きジョイントのモーションを追跡し、その位置を使用して他の 85 の名前のないジョイントの位置を補間する。

struct JointName

 

新しいジョイント名を作成する。

init(rawValue: String)

 

設定されているものは、root を起点に頭、肩、足が設定されており、 左右肩を起点にそれぞれの手が設定されている。

static let root: ARSkeleton.JointName
static let head: ARSkeleton.JointName
static let leftFoot: ARSkeleton.JointName
static let leftHand: ARSkeleton.JointName
static let leftShoulder: ARSkeleton.JointName
static let rightFoot: ARSkeleton.JointName
static let rightHand: ARSkeleton.JointName
static let rightShoulder: ARSkeleton.JointName

 

ARSkeletonDefinition

名前付きジョイントの階層やそれらの相対位置の定義。

class ARSkeletonDefinition : NSObject

スケルトンは指定された階層で定義されているラベル付きジョイントのセットで構成され、このジョイントは他のジョイントの親となる。 スケルトンの定義の階層を識別するには parentIndices を使用する。

スケルトンをサーフェスに配置する場合、 ボディアンカーの原点は股関節にワールド位置が設定されるため、 ボディをサーフェス上に配置する場合、足は腰に対する現在のオフセットで計算する。

これは追跡されている人物が現在立っているか、しゃがんでいるかに関係なく機能する。

左足の関節インデックスを jointModelTransforms に渡すことで、体の原点からの足のオフセットを取得できる。

 

neutralBodySkeleton3D

ニュートラルポーズの 3D スケルトンで、高さは 1.8 メートルで T の形をしている。

このスケルトンは、他のすべてのスケルトンポーズを参照するために提供される。

var neutralBodySkeleton3D: ARSkeleton3D? { get }

 

defaultBody3D

3D で定義されたボディのデフォルトスケルトンの定義。

スケルトンのデフォルトの高さは 1.8 メートル。

class var defaultBody3D: ARSkeletonDefinition { get }

 

defaultBody2D

2D で定義されたボディのデフォルトのスケルトン定義。

多分 ARSkeletonDefinition は 3D と同じものが買えると予想されるため、自前で 2D へ当て込む。

class var defaultBody2D: ARSkeletonDefinition { get }

 

jointNames

固有のジョイント名のコレクション。

ジョイントインデックスをジョイント識別子に変換するには この配列を参照する。

var jointNames: [String] { get }

 

parentIndices

ドキュメントの記載なし。
多分親ジョイントのインデックス数。

@nonobjc var parentIndices: [Int] { get }

 

index(for:)

ドキュメントの記載なし。
多分、ジョイント名からスケルトンのインデックスを取得する。

@nonobjc func index(for jointName: ARSkeleton.JointName) -> Int

 

ARBody2D

バックカメラフィードで認識する人物のスクリーンスペースを表す。

class ARBody2D : NSObject

 

ARBody2D は ARBodyAnchor のパラメータと同じで、
ARBodyAnchor はスクリーンスペースの座標も持つ。

var skeleton: ARSkeleton2D { get }
class ARSkeleton2D
class ARSkeleton

 

イメージトラッキング

ARReferenceImage

resourceGroupName

このイメージのARリソースグループ名。

アセットカタログ内の AR リソースグループからこのイメージをロードした場合、このプロパティの値からリソースグループの名前を取得できる。

設定しいなければプロパティの値は nil を返す。

var resourceGroupName: String? { get }

 

validate(completionHandler:)

参照画像が有効かどうかを検証する。

画像トラッキングに適さない画像は無効であると見なす。
セッションの detectionImages 配列に渡す前に、ARKit が確実にトラッキングできるようプログラムで設定した参照画像に対してこの関数を呼び出すことができる。

Xcode のアセットカタログで参照画像を作成する場合は、自動的に検証を実行するためこのメソッドを使用する必要はない。

func validate(completionHandler: @escaping (Error?) -> Void)

 

ARImageAnchor

estimatedScaleFactor

上記 automaticImageScaleEstimationEnabled を指定した際に、トラッキングする画像の大きさの初期サイズと推論した現実的な物理サイズの間の要素を値として調べる時に使う。

デフォルト値は 1.0 で ARKit が現実世界で認識する画像が、参照画像で設定した physicalSize のパラメータと完全に一致することを意味する。

ARKit は自動的に画像アンカーの変換を補正を行い、この調整はイメージアンカーが現実世界のどこにあるのか ARKit が理解し修正する。

よって、参照画像で設定した physicalSize のパラメータと異なる物理的な画像サイズの場合、アンカーは拡大縮小され、これはその拡大縮小の値を表す。

var estimatedScaleFactor: CGFloat { get }

 

オブジェクトトラッキング

ARReferenceObject

resourceGroupName

イメージトラッキングと同様。

アセットカタログ内の AR リソースグループからこのオブジェクトをロードした場合、このプロパティの値からリソースグループの名前を取得できる。

設定していなければプロパティの値は nil を返す。

var resourceGroupName: String? { get }

 

ポジショナルトラッキング (主に VR 用)

ARPositionalTrackingConfiguration

空間内のデバイス位置を追跡する場合に使用するコンフィグレーション。

可能な限り低い解像度とフレームレートでカメラを動作させることで、
iOS デバイスの 6 DoF トラッキングを有効にし、カメラでの解析必要としないコンテンツ使用する。

要するに VR 用。

class ARPositionalTrackingConfiguration : ARConfiguration

 

init()

新しいポジショントラッキング用のコンフィグレーションを作成する。

init()

 

initialWorldMap

ワールドトラッキング同様にワールドマップを使用する。

 

planeDetection

ドキュメントに記載なし。
ARWorldTrackingConfiguration と同様なので、現実空間の平面認識を行うか否か。

var planeDetection: ARWorldTrackingConfiguration.PlaneDetection { get set }

 

マルチユーザー

ARSession.CollaborationData

ユーザーによって収集された現実環境に関する情報を保持するオブジェクト。

他のユーザーとのマルチユーザー AR エクスペリエンスを作成するには、ワールドトラッキンセッションでコラボレーションを有効し、
定期的に他のユーザーと共有する ARSession.CollaborationData を出力して各ユーザーと状態を同期させる。

class CollaborationData : NSObject

 

init(data:)

シリアライズされたコラボレーションデータから、コラボレーションデータオブジェクトを作成する。

別のユーザーからネットワーク経由でシリアライズされたコラボレーションデータを受信したら、それを使用して ARSession.CollaborationData オブジェクトを作成、update(with:) を呼び出してセッションを更新する。

init(data: Data)

 

data

シリアライズされたコラボレーションデータ。

セッションのワールドデータやアンカーに関する情報がシリアライズされたデータとなる。

var data: Data { get }

 

ARParticipantAnchor

マルチユーザー AR エクスペリエンスで別のユーザーを表すアンカー。

isCollaborationEnabled を true に設定すると、ARKit は現実環境で検出されたすべてのユーザーに対して session(_:didAdd:) からの ARParticipantAnchor をから各ユーザーのワールド座標を把握することができる。

class ARParticipantAnchor : ARAnchor

 

カスタムディスプレイ

ARMatteGenerator

ARKit がカメラフィード内で認識する現実世界から配置した仮想コンテンツで人と隠すために使用するマットテクスチャを作成するオブジェクト。
カスタムレンダラー用で ARView や ARSCNView で frameSemantics を設定し使用する。

カスタムレンダラーによる人物の遮蔽をサポートするためのマットジェネレータは、フレームの segmentationBuffer および EstimatedDepthData 内のアルファや深度情報を処理してマットおよび深度テクスチャが提供される。
これらのテクスチャを使用することで、アプリの仮想コンテンツの上に人を重ねることができる。

class ARMatteGenerator : NSObject

 

init(device:matteResolution:)

AR マットジェネレータを作成するイニシャライザ。

マットテクスチャをリアルタイムで作成するには、このオブジェクトを一度作成してフレームごとに再利用する。

init(device: MTLDevice, 
matteResolution: ARMatteGenerator.Resolution)

 

generateMatte(from:commandBuffer:)

キャプチャした画像のフル解像度または半分の解像度でアルファマットを生成し、初期化時に選択した解像度のアルファマットテクスチャを返す。

func generateMatte(from frame: ARFrame, 
     commandBuffer: MTLCommandBuffer) -> MTLTexture

 

generateDilatedDepth(from:commandBuffer:)

セグメンテーションステンシルの解像度で拡張された深度を生成し、
float32 型の単一チャンネルからなる拡張された深度テクスチャを返す。

カメライメージと仮想オブジェクトを合成する場合には、
この関数から提供される線形の深度情報を使用する。

func generateDilatedDepth(from frame: ARFrame, 
            commandBuffer: MTLCommandBuffer) -> MTLTexture

 

ARMatteGenerator.Resolution

マットテクスチャの解像度。

フレームごとのマットテクスチャを生成するため、カメラ画像の解像度をフルサイズか半分かを指定する。

enum Resolution : Int

 

パラメーター

  • full
  • half

 

以上、ARKit 3 の更新内容。