Google Tangoを使用したアプリで実際の距離を計測するアプリがあるので、実際の距離の測定方法について確認してみました。
最初は便利なAPIがGoogle Tangoから提供されていると思っていましたが、見つからず。
Google Tango SDK for Unityに同梱されている「PointToPoint」に答えがありました。

結論から言うと、UnityEngine.Vector3.Distance(UnityEngine.Vector3 from, UnityEngine.Vector3 to)で算出される値が、そのままメートル単位の距離のようです。

このサンプルアプリはユーザがタッチした場所に最も近い位置にあるTangoPoseDataをTangoPointCloudから取得し、先のメソッドで距離を算出するものとなっています。
要点絞ってコードを追ってみると、以下のようになります。

https://github.com/googlesamples/tango-examples-unity/blob/master/UnityExamples/Assets/TangoSDK/Examples/PointToPoint/Scripts/PointToPointGUIController.cs
Updateメソッドにて、ユーザのタッチを検知すると、以下のメソッドをコルーチン上で実行します。
_WaitForDepthメソッド:
m_waitingForDepth = true;
一旦、m_waitingForDepthをtrueにして、深度認識が発生(OnTangoDepthAvailableがコールバック)するまで待機させます。

// Turn on the camera and wait for a single depth update
m_tangoApplication.SetDepthCameraRate(
    TangoEnums.TangoDepthCameraRate.MAXIMUM);

while (m_waitingForDepth)
{
    yield return null;
}
一旦深度認識の実施頻度を最大に設定して、待ち時間を短くなるようにした上で、深度認識が発生するまで待機します。

m_tangoApplication.SetDepthCameraRate(
    TangoEnums.TangoDepthCameraRate.DISABLED);
深度認識が発生したので、電池消費を抑えるためにも、深度認識頻度を下げます。

Camera cam = Camera.main;
int pointIndex = m_pointCloud.FindClosestPoint(cam, touchPosition, 10);
TangoPointCloud.FindClosestPointにてタッチした位置に最も近い場所のTangoPoseDataを探します。ただし、タッチ位置から最大で10ピクセル以内までで探します。

if (pointIndex > -1)
{
    // Index is valid
    m_startPoint = m_endPoint;
    m_endPoint = m_pointCloud.m_points[pointIndex];

    m_distance = Vector3.Distance(m_startPoint, m_endPoint);
}

Updateメソッド:
// Distance was found.
m_distanceText = "Distance is " + m_distance + " meters.";
いざ、距離を表示するとき、先ほど取得したm_distanceをそのまま出力し、単位はメートルとしています。

ちょっと信じられなかったので、ドキュメントを漁ってみましたが、以下の記述がそれっぽかったです。
Frames of Reference
The unit of measurement for coordinate frame pairs is meters.

コメントの投稿