Android NDK で周囲の建物や地形を使用する(C)

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

Geospatial API を設定する

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

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

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

// Create a session config.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);

// Enable the Geospatial API.
ArConfig_setGeospatialMode(ar_session, ar_config, AR_GEOSPATIAL_MODE_ENABLED);
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);

// Enable Streetscape Geometry.
ArConfig_setStreetscapeGeometryMode(ar_session, ar_config, AR_STREETSCAPE_GEOMETRY_MODE_ENABLED);
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);

// Release config resources.
ArConfig_destroy(ar_config);

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

ArSession_getAllTrackables()AR_TRACKABLE_STREETSCAPE_GEOMETRY を使用して、結果をフィルタします。

ArTrackableList* trackable_list = NULL;
ArTrackableList_create(ar_session, &trackable_list);
ArSession_getAllTrackables(ar_session, AR_TRACKABLE_STREETSCAPE_GEOMETRY, trackable_list);

ArStreetscapeGeometry について理解する

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

LOD 1 のビルド

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

LOD 2 のビルド

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

ArMesh について理解する

ArMesh は「ストリートビュー ジオメトリ」の表面の再構築を表すポリゴン メッシュです。 各 ArMesh には、頂点バッファとインデックス バッファが含まれます。

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

AR コンテンツを Streetscape Geometry にアタッチするには、次の 2 つの方法があります。

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

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

ArHitResultList *hit_result_list = NULL;
ArHitResult *hit_result = NULL;
ArHitResultList_create(ar_session, &hit_result_list);
ArHitResult_create(ar_session, &hit_result);

ArFrame_hitTestRay(ar_session, ar_frame, origin, direction, hit_result_list);
ArHitResultList_getItem(ar_session, hit_result_list, 0, hit_result);

ArAnchor *out_anchor = NULL;
ArStatus status = ArHitResult_acquireNewAnchor(ar_session, hit_result, &out_anchor);
CHECK(status == AR_SUCCESS);

Geospatial Depth を有効にする

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