Unity で周囲の建物や地形を使用する

Streetscape Geometry API は、シーン内の地形、建物、その他の構造物のジオメトリを提供します。ジオメトリは、オクルージョン、レンダリング、ヒットテスト API を介した AR コンテンツの配置に使用できます。ストリートビュー ジオメトリ データは、Google ストリートビュー画像から取得したものです。

サンプルを試す

地理空間のサンプルアプリでは、ストリートビューのジオメトリを取得してレンダリングする方法を説明しています。

Geospatial API を設定する

Streetscape Geometry を使用するには、プロジェクトに Geospatial API を設定する必要があります。 Geospatial API を有効にするの手順に沿って、Geospatial API を設定します。

ストリートビュー ジオメトリを有効にする

Geospatial API は、GeospatialModeGeospatialMode.Enabled に設定され、StreetscapeGeometryModeStreetscapeGeometryMode.Enabled に設定されている場合に、Streetscape Geometry データを取得します。

ARCore セッションでストリートビュー ジオメトリを取得する

ARStreetscapeGeometryManager コンポーネントを GameObject に追加します。日時 街並みのジオメトリが追加、更新、削除されると、ARStreetscapeGeometryManager.StreetscapeGeometriesChanged イベントがトリガーされます。

public Material streetscapeGeometryMaterial;

List<ARStreetscapeGeometry> _addedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _updatedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _removedStreetscapeGeometries = new List<ARStreetscapeGeometry>();

public void OnEnable()
{
    StreetscapeGeometryManager.StreetscapeGeometriesChanged +=
        GetStreetscapeGeometry;
}

public void Update() {
  foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)
  {
    GameObject renderObject = new GameObject(
       "StreetscapeGeometryMesh", typeof(MeshFilter), typeof(MeshRenderer));

    if (renderObject)
    {
        renderObject.transform.position = streetscapegeometry.pose.position;
        renderObject.transform.rotation = streetscapegeometry.pose.rotation;
        renderObject.GetComponent<MeshFilter>().mesh = streetscapegeometry.mesh;
        renderObject.GetComponent<MeshRenderer>().material = streetscapeGeometryMaterial;
    }
  }
}

public void OnDisable()
{
    StreetscapeGeometryManager.StreetscapeGeometriesChanged -=
        GetStreetscapeGeometry;
}

private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)
{
    _addedStreetscapeGeometries = eventArgs.Added;
    _updatedStreetscapeGeometries = eventArgs.Updated;
    _removedStreetscapeGeometries = eventArgs.Removed;
}

ARStreetscapeGeometry について理解する

ARStreetscapeGeometry には、建物に関する情報が含まれています。

LOD 1 のビルド

BuildingLOD1 は、平らな上部まで上向きに押し出された建物のフットプリントで構成されます。建物の高さは正確でない可能性があります。

LOD 2 のビルド

BuildingLOD2 のジオメトリの忠実度が高まります。メッシュの壁や屋根は、建物の形状により近くなります。煙突や屋根の通気口などの小さい対象物は、メッシュの外側に突く可能性があります。

Mesh について理解する

Mesh は「ストリートビュー ジオメトリ」の表面の再構築を表すポリゴン メッシュです。 MeshMeshRenderer をご覧ください。デフォルトでは、標準は計算されません。 計算するには、Mesh.RecalculateNormals() をご覧ください。

AR コンテンツを ARStreetscapeGeometry にアタッチする

ARAnchorManager.AddAnchor() を使用して、ARStreetscapeGeometry.mesh の頂点付近にある特定のポーズにアンカーを作成します。このアンカーは、親 ARStreetscapeGeometry からトラッキング状態を継承します。

ARStreetscapeGeometry に対してヒットテストを行う

ARRaycastManagerExtensions.RaycastStreetscapeGeometry を使用すると、ストリートビュー ジオメトリのヒットテストを行うことができます。交差点が見つかった場合、XRRaycastHit にはヒットした場所に関するポーズ情報と、ヒットした ARStreetscapeGeometry への参照が含まれます。このストリートビュー ジオメトリを ARAnchorManager.AddAnchor() に渡して、このジオメトリに関連付けるアンカーを作成できます。

Vector2 screenTapPosition = Input.GetTouch(0).position;
List<XRRaycastHit> hitResults = new List<XRRaycastHit>();
if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){
  ARStreetscapeGeometry streetscapegeometry =
      StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);
  if (streetscapegeometry != null)
  {
      ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);
  }
}

Geospatial Depth を有効にする

Geospatial Depth: ストリートビューのジオメトリを組み合わせたもの ローカル センサー入力を使用して、奥行きデータを強化します。Geospatial Depth が有効な場合 出力される深度と未加工の奥行き画像は、ローカルで観測された奥行きに加えて、ラスタライズされたストリートビュー ジオメトリを含むように修正されます。 これにより、奥行きを使用したポーズの精度が向上する可能性があります。