ARKit 1.5 での変更点 (Xcode 9.3 Beta / iOS 11.5 Beta )
Beta なので公開されている情報からのまとめ。
NDA 上スクリーンショットが出せないので今回も文字だけ。
以下の情報に関しては今後変更される可能性があるため注意が必要。
主な変更
- 垂直方向平面の認識
- 画像認識
- 以前よりも細かな形状認識
- カメラのオートフォーカス
- カメラ解像度が 720p から 1080i に変更
以下 SDK の変更
「CVarArg, Equatable, Hashable」など Relationships の Conforms To 部分での変更は割愛。
API の和訳だけでは分かりづらいので、次回以降で以下のサンプルの動作を説明予定。
追加
ARSession
func setWorldOrigin(relativeTransform: matrix_float4x4)
float4x4 の行列を使用し、ARKit のワールド座標の原点を変更する。
デフォルトは端末がアプリを起動した場所。
https://developer.apple.com/documentation/arkit/arsession/2942278-setworldorigin
ARSessionObserver
func sessionShouldAttemptRelocalization(ARSession)
ワールドトラッキング中断後に状態回復を試みるかどうかを delegate から問い合わせる。
関数を実装して true を返すと、再開後 ARKit はワールドトラッキング状態を調整しようとするとのこと。
再開できなかった時のためにセッションの run メソッドで resetTracking を設定しトラッキングをやり直せるようにした方がよい。
ちなみに中断から再開する場合、端末がトラッキング失敗した場所の付近で行うと成功しやすいとのこと。
ARWorldTrackingConfiguration
vertical (ARWorldTrackingConfiguration.PlaneDetection)
ARWorldTrackingConfiguration の PlaneDetection でこちらを選択すると垂直方向への検知ができるようになる。
horizontal を共に使用して、垂直と水平の状態を検知することも可能。
detectionImages
画像認識用で検知するためのリファレンスとなる画像を ARReferenceImage を使用して設定する。
ここで設定した画像がカメラからキャプチャした画像内にあれば ARImageAnchor を置くように設定できる。
リファレンスとなる画像は複数枚設定可能。
https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration/2941063-detectionimages
isAutoFocusEnabled
カメラのオートフォーカスを使用するか設定する。
デフォルトで true になっており、オートフォーカスを行う。
AROrientationTrackingConfiguration
isAutoFocusEnabled
ワールドトラッキング同様にカメラのオートフォーカスを使用するか設定する。
ARPlaneAnchor
vertical (ARPlaneAnchor.Alignment)
ARPlaneAnchor の Alignment が vertical の場合、アンカーは重力に対して平行の回転を返す。
また、Alignment からアンカーとして置いた平面が 垂直か水平かどうか調べることができる。
(水平、垂直、互いに重力に対して平行の行列を返すのでコンテンツによっては、垂直または水平で向きを変えなければならなくなる)
https://developer.apple.com/documentation/arkit/arplaneanchor.alignment/2865598-vertical
geometry
以前の ARPlaneAnchor は検知した領域は矩形だったが、 geometry はアンカーが検知した平面の形に合わせた多角形のポリゴンの情報を ARPlaneGeometry として提供される。
SceneKit 用にラッパークラスである ARSCNPlaneGeometry が用意されている。
https://developer.apple.com/documentation/arkit/arplaneanchor/2941025-geometry
ARPlaneGeometry
アンカーが検知した平面の形に合わせた多角形のポリゴン(三角ポリゴンのメッシュ)として描画する。
SceneKit のカスタムジオメトリ生成する際に必要な値、検知した領域を多角形のポリゴンを囲う境界の頂点を取得できる。
パラメーターは以下のもの。
ほとんどの場合 ARSCNPlaneGeometry を使用すると思われるので詳細は割愛。
- vertices: [vector_float3]
- textureCoordinates: [vector_float2]
- triangleCount: Int
- triangleIndices: [Int16]
- boundaryVertices: [vector_float3]
https://developer.apple.com/documentation/arkit/arplanegeometry
ARSCNPlaneGeometry
SCNGeometry のサブクラス。
ARPlaneGeometry クラスのメッシュデータの値をラップし、形状を描画する。
OpenGL での使用はできない。
ARSCNPlaneGeometry を使用すると、ARPlaneAnchor の geometry によって提供された平面形状を update(from:) の設定するだけで形状の描画をおこなってくれる。
また、delegate の update 内でジオメトリの設定しないと形状が変わらないので注意。
https://developer.apple.com/documentation/arkit/arscnplanegeometry
ARReferenceImage
画像認識用のリファレンス用の画像を設定し、上記の ARWorldTrackingConfiguration の detectionImages に渡すと動作するようになる。
(リファレンス用の画像の大きさを設定しないとマッチさせる画像の大きさが 0 となりの認識されないので注意)
class func referenceImages(inGroupNamed: String, bundle: Bundle?)
inGroupNamed はアセットカタログで作成した「AR Resource Group」の指定、bundle はバンドルの場所を示す。bundle が nil の場合は main bundle。
アセットカタログで設定する際は以下の name と physicalSize は Xcode のインスペクタ上で設定できる。
var name: String?
設定した画像の名前。
認識した画像毎に何かしたい場合は名前で判別させる。
var physicalSize: CGSize
画像認識した際のワールド空間での大きさを返す。
init(CGImage, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)
アセットカタログを使用せず CGImage からリファレンス用の画像を設定する。
init(CVPixelBuffer, orientation: CGImagePropertyOrientation, physicalWidth: CGFloat)
アセットカタログを使用せず、動画などの CVPixelBuffer からリファレンス用の画像を設定する。
https://developer.apple.com/documentation/arkit/arreferenceimage
ARImageAnchor
現実世界で画像検索し画像認識後返される画像認識版アンカー。
transform で位置や回転を取得し、referenceImage(ARReferenceImage)の physicalSize で大きさを取得する。
var referenceImage: ARReferenceImage
ARReferenceImage として返される。
https://developer.apple.com/documentation/arkit/arimageanchor
ARHitTestResult
static var estimatedVerticalPlane: ARHitTestResult.ResultType (ARHitTestResult.ResultType)
タップなどのヒットテスト時に、垂直面だと予測される位置の結果を返す。
existingPlaneUsingGeometry (ARHitTestResult.ResultType)
existingPlaneUsingExtent とは異なり予測される大きさと形を返す。
ARCamera.TrackingState.Reason
case relocalizing
ARCamera の TrackingState で何らかの中断後トラッキング再開している状態。
https://developer.apple.com/documentation/arkit/arcamera.trackingstate.reason/2949172-relocalizing
追加要素不明
ARError
static func != (lhs: ARError, rhs: ARError) -> Bool
ステータスは追加となっているが何が追加されたのかわからない。
変更不明
- ARSession.RunOptions
- ARFaceAnchor.BlendShapeLocation
- ARSCNView / ARSCNViewDelegate
- ARSKView / ARSKViewDelegate
- ARCamera / static func != (lhs: ARCamera.TrackingState.Reason, rhs: ARCamera.TrackingState.Reason) -> Bool
変更(ドキュメント追記 SDKs Xcode 9.3+)
- ARError.errorCode
- ARError.errorUserInfo
- ARError.localizedDescription
- ARError.cameraUnauthorized
- ARError.errorDomain
- ARError.sensorFailed
- ARError.sensorUnavailable
- ARError.unsupportedConfiguration
- ARError.worldTrackingFailed
- ARFrame > ARPointCloud > points
- ARFrame > ARPointCloud > identifiers
- ARCamera > trackingState