Streetscape Geometry API は、シーン内の地形、建物、その他の構造物のジオメトリを提供します。ジオメトリは、オクルージョン、レンダリング、ヒットテスト API を介した AR コンテンツの配置に使用できます。ストリートビュー ジオメトリ データは、Google ストリートビュー画像から取得したものです。
サンプルを試す
地理空間のサンプルアプリでは、ストリートビューのジオメトリを取得してレンダリングする方法を説明しています。
Geospatial API を設定する
Streetscape Geometry を使用するには、プロジェクトに Geospatial API を設定する必要があります。 Geospatial API を有効にするの手順に沿って、Geospatial API を設定します。
ストリートビュー ジオメトリを有効にする
Geospatial API は、GeospatialMode
が GeospatialMode.Enabled
に設定され、StreetscapeGeometryMode
が StreetscapeGeometryMode.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
には、建物に関する情報が含まれています。
-
ARStreetscapeGeometry.streetscapeGeometryType
StreetscapeGeometry を地形または建物として識別します。 -
ARStreetscapeGeometry.mesh
この地形や建物に対応するポリゴンMesh
を取得します。 -
ARStreetscapeGeometry.quality
メッシュデータの品質を提供します。詳細レベルは CityGML 2.0 規格で説明されています。
LOD 1 のビルド
BuildingLOD1
は、平らな上部まで上向きに押し出された建物のフットプリントで構成されます。建物の高さは正確でない可能性があります。
LOD 2 のビルド
BuildingLOD2
のジオメトリの忠実度が高まります。メッシュの壁や屋根は、建物の形状により近くなります。煙突や屋根の通気口などの小さい対象物は、メッシュの外側に突く可能性があります。
Mesh
について理解する
Mesh
は「ストリートビュー ジオメトリ」の表面の再構築を表すポリゴン メッシュです。
Mesh
と MeshRenderer
をご覧ください。デフォルトでは、標準は計算されません。
計算するには、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 が有効な場合 出力される深度と未加工の奥行き画像は、ローカルで観測された奥行きに加えて、ラスタライズされたストリートビュー ジオメトリを含むように修正されます。 これにより、奥行きを使用したポーズの精度が向上する可能性があります。