Apple Engine

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

iOS 12 SDK Bata 4 の ARKit 2 変更内容

Beta 版から記事を起こしているため今後変更される可能性あり。

ARKit 1.0 や 1.5 は Beta 中は、ほぼほぼ変更はなかったが
今回はテストしながら必要な機能を少しずつ増やしている模様。

Beta 4 は以下のような更新。

変更数
追加 (Added) 1
変更 (Modified) 2

 

追加

ARAnchorCopying プロトコル

ARAnchor やそのサブクラスのインスタンスはワールド座標で位置、方向が設定され、任意で名前などの追加情報や平面認識、物体認識、画像認識の関連付けを行うことできる。

ARKit は、カメラ映像やシーンのアニメーション再生など ARFrame が生成される度にセッションに関連付けられているアンカーを更新されるが、
アンカーオブジェクトは不変であるため、ARFrame から次の ARFrame に変更を加えるには、アンカーをコピーする必要がある。

独自の ARAnchor サブクラスを作成する場合は ARAnchorCopying のイニシャライズで対象のアンカーをコピーし設定する。

生成したサブクラスは ARAnchor の情報しか持たないので、カスタムで何らかの情報付随させフレーム間で維持したい場合は、生成したサブクラスに情報を設定する必要があるので注意。

ARAnchorCopying で設定できるのは init のみ。

 

init(anchor: ARAnchor)

別のアンカーからカスタム情報をコピーし、新しいアンカーへ初期化する。
Required なので init の記述は必須。

 

anchor

コピー元のアンカーを引数として設定する。

 

振る舞い

ARKit で新しい ARFrame オブジェクトを生成するたびに、この init を呼び出し、前のフレームに関連付けられている各アンカーをコピーする。
また、ARAnchor をサブクラス化しプロパティを追加する場合、init の実装は追加するプロパティの値をコピーし、スーパークラスの init にチェーンする必要がある。

ドキュメントからそのまま持ってきたが、
以下のコードでは BoardAnchor を判別してスケールを自身に設定、そしてスーパークラスに渡している。

required init(anchor: ARAnchor) {
    let other = anchor as! BoardAnchor
    self.size = other.size
    super.init(anchor: other)
}

 

Apple 先生曰く、他のアンカーオブジェクトへの参照を格納する場合は、パフォーマンスとアプリケーションのデータモデルを慎重に検討すべしとのこと。
処理の状況によってはコピーした方がパフォーマンスが良くなるかも。

 

変更

ARSCNView > ARSCNDebugOptions

struct で設定されていたが、SCNDebugOptions の typealias に変更された。

 

ARAnchor

ARAnchorCopying プロトコルが追加され変更された。

 

まとめ

ARAnchorCopying でコピーすることで、ARKit の delegate でアンカー探して一部だけ処理を変えるということしなくて良くなる感はある。

でも、やりすぎ注意といった感じ。

 

過去の変更内容

appleengine.hatenablog.com

appleengine.hatenablog.com