HelloARについて

150 views
Skip to first unread message

安東義重

unread,
Nov 6, 2018, 2:38:41 AM11/6/18
to VR/AR_ja
これからよろしくお願いします。大学でARCoreに触れてみようということで下記のURLの13秒あたりのようなものを作りたいと思っています。知識は「ARCoreとUnityではじめるARアプリ開発」を一通りやった程度です。


    TrackableHit hit;
            TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
                TrackableHitFlags.FeaturePointWithSurfaceNormal;

            if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
            {
            
                if ((hit.Trackable is DetectedPlane) &&
                    Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
                        hit.Pose.rotation * Vector3.up) < 0)
                {
                    Debug.Log("Hit at back of the current DetectedPlane");
                }
                else
                {
                    
                    GameObject prefab;
                    if (hit.Trackable is FeaturePoint)
                    {
                        prefab = AndyPointPrefab;
                    }
                    else
                    {
                        prefab = AndyPlanePrefab;
                    }

                    
                    var andyObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);

                    
                    andyObject.transform.Rotate(0, k_ModelRotation, 0, Space.Self);

                   
                    var anchor = hit.Trackable.CreateAnchor(hit.Pose);

                  
                    andyObject.transform.parent = anchor.transform;
                }
            }

だいたい何をやっているのかは分かるのですが、詳しい内容がよく分かりません。とくに
   
            TrackableHit hit;
            TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
                TrackableHitFlags.FeaturePointWithSurfaceNormal;
            if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))

の部分がよく分からなくてとても困っています。詳しく説明していただけると助かります。

Kenichi Takahashi

unread,
Nov 6, 2018, 7:50:21 AM11/6/18
to VR/AR_ja
ARCore SDK for Unityに含まれているHello ARのサンプルのコードですね。

           TrackableHit hit;
           
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
               
TrackableHitFlags.FeaturePointWithSurfaceNormal;
           if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))

このコードでやっていることは
 if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
の部分では、画面でタッチされた位置の座標(x, y)からレイ(光線)を飛ばした先にぶつかるものがあるかどうかという判定をしています。
4つめの引数のhitにはぶつかった先の座標(x, y, z)等の情報が入って返ってきます。
その際、ぶつかるものとして検出する対象を3つめの引数である raycastFilter でフィルタリングしており、そのフィルタの設定をひとつ上の行の

TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.FeaturePointWithSurfaceNormal;
で行っています。設定内容は、ARCoreが検出した平面のポリゴン、若しくは、向きを推定可能な特徴点となっています。
この他にどのような値を設定できるかはこちらのリファレンスにあります。

このHelloARサンプルについての公式の解説がARCoreのサイトにありますので、合わせて参考にしてみてください。



安東義重

unread,
Nov 6, 2018, 8:30:54 AM11/6/18
to VR/AR_ja
hit.Poseとは何なのでしょうか?

var anchor = hit.Trackable.CreateAnchor(hit.Pose);
上のコードは何を表していてアンカーは何のために作っているのでしょうか?

リフェレンスは一通り読んだのですが、いまいちよく分かりませんでした。理解が遅くてすみません。

安東義重

unread,
Nov 6, 2018, 11:08:34 AM11/6/18
to VR/AR_ja
度々申し訳ございませんが、hit.trackableの説明もお願いできますでしょうか?

Kenichi Takahashi

unread,
Nov 7, 2018, 7:47:06 AM11/7/18
to VR/AR_ja

先のメールで
 
hitにはぶつかった先の座標(x, y, z)等の情報が入って返ってきます

と書きましたが、hit のプロパティである Pose にその座標が入っています。
Poseの構造体の中をさらに見てみると、positionrotation というプロパティがあります。
この position から座標の x, y, z の値と rotation で回転の値を取得することにより、3D空間上でどのような位置でどのような向き(床などの水平面なのか、壁などの垂直面なのか)で3Dオブジェクトを配置すれば良いのかを決めることができます。

アンカーはその際の座標と回転を固定するために打つ目印のようなものと捉えてもらえれば良いかと思います。
アンカーについてはこちらに公式の解説もあります。

hit.Trackable は Trackable オブジェクトで、このオブジェクトの TrackingState プロパティからはトラッキングの状態(周囲の環境から自分のいる位置を把握できているかどうか)を取得することができますし、トラッキングを司るオブジェクトですので、ここから CreateAnchor することができます。

Reply all
Reply to author
Forward
Message has been deleted
0 new messages