2021年11月28日

AR Foundation 4.2のAR Anchorの使い方とその意義

AR Anchorなるものを使おうとして調べていたら、AR Foundation 4.2から、4.1.7までと仕様が変更されていることに気がついたのでメモ。
AR Anchor ManagerをAR Session Originにつけた状態で、アンカーをつけたいオブジェクトにAR AnchorをAdd Compontするだけ。4.1.7までは、AR Anchor Managerに専用の命令があったのが、一般的なUnityの命令に置き換わった感じでしょうか。
スクリプトを実際に見る前に、そもそもAR Anchorとはなんぞやという話になりますが、日本語のブログや解説を見ていてもちゃんと理解している人は少ないようです。一番参考になったのはこちら。
ARFoundation Anchors覚え書きmtwandのブログ
この記事を元に考えるに、通常のARではカメラを搭載したiPhoneなどのデバイスは、加速度センサーから割り出した自機の位置(6DoF)をもとに、補助的にカメラで得られた情報(visual odometry)を追加してオブジェクトを描画するのに対して、AR Anchorをつけたオブジェクトは光学的な特徴点を優先して周囲の映像との一致を向上させるのではないかと。つまり光学系による補正をより強化した状態になるのでしょう。このため、オブジェクトのUnity内での座標はリアルタイムに微調整され、スクリプトからはいじるなということのようです。
これを裏付ける記事はARKitでもAR Foundationでもなく、GoogleによるARCoreの解説にありました。
Working with anchors
As ARCore’s environmental understanding updates throughout an AR experience, virtual objects can appear to drift away from where they were placed. This can impact your app's realism and user experience.
Anchors ensure that objects appear to stay at the same position and orientation in space, helping you maintain the illusion of virtual objects placed in the real world.

つまり位置ズレを防ぐと述べてあります。
さて、実際のスクリプトですが、AR Raycast Hitでインスタンス化する場合の例をUnityの公式マニュアルで見てみましょう。
// ... here, we'll place the plane anchoring code!

// Otherwise, just create a regular anchor at the hit pose

// Note: the anchor can be anywhere in the scene hierarchy
var instantiatedObject = Instantiate(_prefabToPlace, hit.pose.position, hit.pose.rotation);

// Make sure the new GameObject has an ARAnchor component
anchor = instantiatedObject.GetComponent();
if (anchor == null)
{
anchor = instantiatedObject.AddComponent();
}

これでAR Anchorが置かれ、その物体はAR表示上でずれが生じにくくなります。
物体をスクリプトから移動する場合は、AR Anchorをいったん外す必要があります。
Destroy(GameObjectName.GetComponent());

これも、すでにAR Anchorが外れている、もしくはAR Anchorがないオブジェクトの可能性を考慮するなら、下記のほうがいいかもしれません。
anchor = instantiatedObject.GetComponent();
if (anchor != null)
{
Destroy(GameObjectName.GetComponent());
}

この他にAttachAnchor(ARPlane plane, Pose pose)という命令もあるのですが、これは平面推定で検出した平面上にオブジェクトを置く場合に役に立つそうです。
タグ:AR UNITY
posted by MacLab. at 09:09| Comment(0) | TrackBack(0) | 技術情報