XR_ANDROID_spatial_annotation_tracking

Name String

XR_ANDROID_spatial_annotation_tracking

拡張機能のタイプ

インスタンス拡張機能

Registered Extension Number

795

リビジョン

1

Ratification Status(批准ステータス)

未批准

拡張機能とバージョンの依存関係

XR_EXT_spatial_entity

XR_EXT_spatial_image_tracking

最終更新日

2026-01-12

IP ステータス

既知の IP 申し立てはありません。

寄与者

Levana Chen、Google
Christopher Feil、Google
Martin Sundermeyer、Google
David Joseph Tan、Google
Jared Finder、Google
Nihav Jain、Google

概要

この拡張機能は、XR_EXT_spatial_entity 拡張機能にアノテーション トラッキング機能を提供し、シーン内のさまざまなアノテーションをトラッキングします。これにより、アプリケーションはランタイム参照で定義された物理オブジェクトまたは仮想オブジェクトにオーバーレイを配置できます。

この拡張機能は、基本的なアノテーション タイプ「Quad」を提供します。これは、実行時の参照内の一般的な 2D 境界ボックスを表す、4 つの辺を持つポリゴン(凸四角形)です。追跡された四角形アノテーションは、次のコンポーネントを持つ空間エンティティとして表されます。

  • XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID

通常、アプリケーションは次のパターンで空間アノテーション トラッキング拡張機能を使用できます。

  • アプリケーションはまず XrSpatialReferenceCacheANDROID のハンドルを作成し、指定されたソースからのランタイム参照の記録を開始します。
  • 次に、アプリケーションは XrSpatialReferenceImageEXT のランタイム参照を取得し、参照キャッシュの期間中に参照内で目的のアノテーションを定義します。
  • 次に、アプリケーションは XrSpatialCapabilityConfigurationAnnotationTrackingANDROID によって提供される XrSpatialReferenceImageEXT に基づいて XrSpatialContextEXT ハンドルを作成します。
  • アプリケーションは、XrSpatialReferenceCacheANDROID ハンドルを破棄してランタイム参照の記録を停止し、メモリ使用量を削減するか、XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID イベントを待って初期化の結果を確認できます
  • アプリケーションは XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID イベントをプルして、アノテーションの初期化結果を確認します。
  • 初期化が成功すると、アプリケーションは XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT イベントをプルしてアノテーションをトラッキングできるようになります。
  • 初期化に失敗した場合、アプリはイベントで返されたエラーコードを使用して失敗の理由を特定し、既存の XrSpatialContextEXT ハンドルを破棄して新しいアノテーションを開始できます。
  • 初期化の結果に関係なく、アプリケーションはイベントを受信した後、メモリ使用量を減らすためにイメージ バッファを解放できます
  • アプリケーションは、空間エンティティのアクセス パターンに従ってアノテーションを検出してクエリします。
  • アプリケーションは、有効な XrSpatialReferenceCacheANDROID の期間中に、新しい参照内のアノテーションをトラッキングするために、追加の XrSpatialContextEXT ハンドルを作成できます。
  • アプリケーションは、XrSpatialContextEXT ハンドルを破棄して、実行時に検出可能で追跡可能なアノテーションのセットを動的に減らすことができます。

ランタイム サポート

ランタイムは、次の機能をリストすることで、xrEnumerateSpatialCapabilitiesEXT を使用してアノテーション トラッキング機能のサポートをアドバタイズしなければなりません。

  • XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID

ランタイムがアノテーション トラッキング機能をサポートしている場合:

xrEnumerateSpatialAnnotationReferenceSourcesANDROID 関数は次のように定義されます。

XrResult xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    XrSpatialCapabilityEXT                      capability,
    uint32_t                                    sourceCapacityInput,
    uint32_t*                                   sourceCountOutput,
    XrSpatialAnnotationReferenceSourceANDROID*  sources);

パラメータの説明

  • instanceXrInstance のハンドルです。
  • systemId は、参照ソースが列挙される XrSystemId です。
  • capability は、参照ソースが列挙される XrSpatialCapabilityEXT です。
  • sourceCapacityInputsources 配列の容量です。必要な容量を取得するリクエストを示す場合は 0 です。
  • sourceCountOutput は、ソースの数、または sourceCapacityInput が不十分な場合に必要な容量です。
  • sourcesXrSpatialAnnotationReferenceSourceANDROID の配列です。sourceCapacityInput が 0 の場合、NULL になることがあります。
  • 必要な sources サイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。

アプリケーションは、xrEnumerateSpatialAnnotationReferenceSourcesANDROID を使用して、特定の XrSystemId でサポートされている参照ソースのリストを列挙できます

ランタイムは、instance で拡張機能が有効になっていない参照ソースを列挙してはなりません。

有効な使用方法(暗黙的)

戻りコード

成功

  • XR_SUCCESS

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

typedef enum XrSpatialAnnotationReferenceSourceANDROID {
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID = 0,
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID = 1,
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationReferenceSourceANDROID;

XrSpatialAnnotationReferenceSourceANDROID 列挙型は、アノテーションのメタデータを提供するリファレンスのソースを表します。

列挙型の意味は次のとおりです。

列挙型の説明

XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID

参照画像は、Android カメラ API から出力された切り抜きなしの画像です。たとえば、Camera2 CameraDevice に関連付けられた ImageReader からの Image や、CameraX に関連付けられた ImageAnalysis からの ImageProxy などです。通常、これは前方に向いている RGB カメラの 1 つです。

XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_MEDIA_PROJECTION_ANDROID

参照画像は、Android MediaProjection API から出力された切り抜きなしの画像です。たとえば、MediaProjection 仮想ディスプレイに関連付けられた ImageReader の画像などです。仮想コンテンツと現実のコンテンツを含めることができます。

XrSystemSpatialAnnotationPropertiesANDROID 構造体は次のように定義されます。

typedef struct XrSystemSpatialAnnotationPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    uint32_t           referenceCacheTimespan;
    uint32_t           maxReferencePixelWidth;
    uint32_t           maxReferencePixelHeight;
    uint32_t           maxReferenceCount;
    uint32_t           maxAnnotationCount;
} XrSystemSpatialAnnotationPropertiesANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • referenceCacheTimespan は、有効な XrSpatialReferenceCacheANDROID ハンドルの期間(秒単位)を示します。
  • maxReferencePixelWidth は、参照画像の端の最大幅をピクセル単位で示します。
  • maxReferencePixelHeight は、参照画像の端の最大高さをピクセル単位で示します。
  • maxReferenceCount は、同時に割り当てる参照画像の最大数を示します。
  • maxAnnotationCount は、同時に追跡するアノテーションの最大数を示します。

ランタイムがアノテーション トラッキング機能をサポートしている場合、アプリは xrGetSystemProperties を呼び出すときに XrSystemSpatialAnnotationPropertiesANDROID 構造体を XrSystemProperties にチェーンすることで、関連するシステム プロパティを検査できます。

XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference からの XrSpatialReferenceImageEXT :: widthmaxReferencePixelWidth を超える場合、ランタイムは xrCreateSpatialContextAsyncEXT を呼び出すときに XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference からの XrSpatialReferenceImageEXT :: heightmaxReferencePixelHeight を超える場合、ランタイムは xrCreateSpatialContextAsyncEXT を呼び出すときに XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: timeXrSpatialReferenceCacheANDROID :: cache の期間外の場合、ランタイムは xrCreateSpatialContextAsyncEXT の呼び出し時に XR_ERROR_TIME_INVALID を返さなければなりません。アプリは、XrSpatialReferenceCacheANDROID の期間中に、新しい参照で XrSpatialContextEXT ハンドルを再作成できます。

割り当てられた参照画像の数が maxReferenceCount を超える場合、ランタイムは XR_ERROR_LIMIT_REACHED を返し、XrEventDataSpatialAnnotationTrackingANDROID :: initializationResult を介して初期化の失敗を示す必要があります。アプリケーションは XrSpatialContextEXT ハンドルを破棄し、保留中の初期化が完了した後に再試行できます

アクティブなアノテーションの数が maxAnnotationCount を超える場合、xrCreateSpatialContextAsyncEXT を呼び出すときに、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

有効な使用方法(暗黙的)

ランタイム参照キャッシュ

XR_DEFINE_HANDLE(XrSpatialReferenceCacheANDROID)

XrSpatialReferenceCacheANDROID ハンドルは、特定のソースから記録されたランタイム参照のキャッシュを表します。

xrCreateSpatialReferenceCacheAsyncANDROID 関数は次のように定義されます。

XrResult xrCreateSpatialReferenceCacheAsyncANDROID(
    XrSession                                   session,
    const XrSpatialReferenceCacheCreateInfoANDROID* createInfo,
    XrFutureEXT*                                future);

パラメータの説明

  • session は、参照キャッシュがアクティブになる XrSession です。
  • createInfo は、参照キャッシュ パラメータを指定するために使用される XrSpatialReferenceCacheCreateInfoANDROID へのポインタです。
  • futureXrFutureEXT の出力ハンドルのポインタです。

アプリケーションは、xrCreateSpatialReferenceCacheAsyncANDROID を呼び出すことで、XrSpatialReferenceCacheANDROID ハンドルを作成できます。ランタイムがトラッキング サービスの初期化に時間を要することがあります。アプリケーションは、xrCreateSpatialReferenceCacheCompleteANDROID を繰り返し呼び出して、この非同期オペレーションの完了を確認できます

ランタイムは、XrSpatialReferenceCacheCreateInfoANDROID :: capabilityxrEnumerateSpatialCapabilitiesEXT によってリストされていない場合、XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT を返さなければなりません。

ランタイムは、指定されたケーパビリティに対して XrSpatialReferenceCacheCreateInfoANDROID :: sourcexrEnumerateSpatialAnnotationReferenceSourcesANDROID によってリストされていない場合、XR_ERROR_FEATURE_UNSUPPORTED を返さなければなりません。

アプリケーションは、特定のケーパビリティに対して、ソースごとに 1 つのハンドルしか作成できません。それ以外の場合、ランタイムは XR_ERROR_LIMIT_REACHED を返さなければなりません。

アプリケーションは、XrSpatialReferenceCacheANDROID ハンドルの期間中にランタイム参照をキャプチャして、新しい XrSpatialContextEXT ハンドルを構成できます

有効な使用方法(暗黙的)

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CAPABILITY_UNSUPPORTED_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialReferenceCacheCreateInfoANDROID 構造体は次のように定義されます。

typedef struct XrSpatialReferenceCacheCreateInfoANDROID {
    XrStructureType                              type;
    const void*                                  next;
    XrSpatialCapabilityEXT                       capability;
    XrSpatialAnnotationReferenceSourceANDROID    source;
} XrSpatialReferenceCacheCreateInfoANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。
  • capability は、リファレンス キャッシュが作成される機能について説明する XrSpatialCapabilityEXT です。
  • source は、参照キャッシュのソースを記述する XrSpatialAnnotationReferenceSourceANDROID です。

XrSpatialReferenceCacheCreateInfoANDROID 構造体は、XrSpatialReferenceCacheANDROID ハンドルを作成するための情報を記述します。

有効な使用方法(暗黙的)

xrCreateSpatialReferenceCacheCompleteANDROID 関数は次のように定義されます。

XrResult xrCreateSpatialReferenceCacheCompleteANDROID(
    XrSession                                   session,
    XrFutureEXT                                 future,
    XrCreateSpatialReferenceCacheCompletionANDROID* completion);

パラメータの説明

アプリケーションは、xrCreateSpatialReferenceCacheAsyncANDROID によって開始された非同期オペレーションの完了を待つために、xrCreateSpatialReferenceCacheCompleteANDROID を呼び出すことができます。

future が準備完了状態でない場合、ランタイムは XR_ERROR_FUTURE_PENDING_EXT を返さなければなりません。future がすでに完了またはキャンセルされている場合、ランタイムは XR_ERROR_FUTURE_INVALID_EXT を返さなければなりません。

有効な使用方法(暗黙的)

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_FUTURE_INVALID_EXT
  • XR_ERROR_FUTURE_PENDING_EXT
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_VALIDATION_FAILURE

XrCreateSpatialReferenceCacheCompletionANDROID 構造体は次のように定義されます。

typedef struct XrCreateSpatialReferenceCacheCompletionANDROID {
    XrStructureType                   type;
    void*                             next;
    XrResult                          futureResult;
    XrSpatialReferenceCacheANDROID    referenceCache;
} XrCreateSpatialReferenceCacheCompletionANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、このような構造は定義されていません。
  • futureResult は、参照キャッシュ作成オペレーションの XrResult です。
  • オペレーションが成功した場合、referenceCacheXrSpatialReferenceCacheANDROID ハンドルです。

今後の返品コード

futureResult 値:

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FEATURE_UNSUPPORTED
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_LIMIT_REACHED

futureResult が成功コードの場合、ランタイムは有効な referenceCache ハンドルを返さなければなりません。referenceCache が有効な場合、xrCreateSpatialReferenceCacheAsyncANDROID :: session の有効期間内、またはアプリケーションが xrDestroySpatialReferenceCacheANDROID でハンドルを破棄するまでのいずれか早い方まで有効です。

referenceCache が有効な場合、XrSystemSpatialAnnotationPropertiesANDROID :: referenceCacheTimespan 内にキャッシュを記録します。

有効な使用方法(暗黙的)

xrDestroySpatialReferenceCacheANDROID 関数は次のように定義されます。

XrResult xrDestroySpatialReferenceCacheANDROID(
    XrSpatialReferenceCacheANDROID              cacheHandle);

パラメータの説明

空間コンテキストの作成が完了したら、アプリケーションは xrDestroySpatialReferenceCacheANDROID 関数を呼び出して、cacheHandle ハンドルと基盤となるリソースを解放できます

有効な使用方法(暗黙的)

スレッドセーフ

  • cacheHandle とその子ハンドルのアクセスは、外部で同期しなければなりません

戻りコード

成功

  • XR_SUCCESS

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

構成

XrSpatialCapabilityConfigurationAnnotationTrackingANDROID 構造体は次のように定義されます。

typedef struct XrSpatialCapabilityConfigurationAnnotationTrackingANDROID {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
    XrSpatialReferenceCacheANDROID      cache;
    XrTime                              time;
    XrSpatialReferenceImageEXT          reference;
} XrSpatialCapabilityConfigurationAnnotationTrackingANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • capabilityXrSpatialCapabilityEXT であり、XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID でなければなりません。
  • enabledComponentCount は、enabledComponents 配列内の要素の数を記述する uint32_t です。
  • enabledComponentsXrSpatialComponentTypeEXT の配列へのポインタです。
  • cache は、reference 構成のランタイム参照を記録するために以前に作成された XrSpatialReferenceCacheANDROID です。
  • time は、reference がキャプチャされる XrTime です。
  • reference は、アノテーションが次のポインタにチェーンされている XrSpatialReferenceImageEXT です。

アプリは、XrSpatialContextCreateInfoEXT :: capabilityConfigsXrSpatialCapabilityConfigurationAnnotationTrackingANDROID 構造体へのポインタを追加することで、XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID 空間機能を有効にできます

capabilityXR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID でない場合、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

reference にアノテーションが含まれていない場合、ランタイムは XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT を返さなければなりません。

アノテーション コンポーネントが enabledComponents にリストされているが、対応するアノテーションが reference に関連付けられていない場合、ランタイムは XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT を返さなければなりません。

cachexrCreateSpatialContextAsyncEXT に渡される同じ XrSession によって所有されていない場合、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

timecache の期間外の場合、ランタイムは XR_ERROR_TIME_INVALID を返さなければなりません。

有効な使用方法(暗黙的)

アノテーション トラッキング イベント

XrEventDataSpatialAnnotationTrackingANDROID 構造体は次のように定義されます。

typedef struct XrEventDataSpatialAnnotationTrackingANDROID {
    XrStructureType        type;
    const void*            next;
    XrSpatialContextEXT    spatialContext;
    uint32_t               annotationIndex;
    XrResult               initializationResult;
} XrEventDataSpatialAnnotationTrackingANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • spatialContext は、アノテーション トラッキングを有効にした XrSpatialContextEXT です。
  • annotationIndex は、XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference に関連付けられたアノテーション配列のインデックスにマッピングされます。
  • initializationResult は、アノテーションの初期化結果を示します。XR_SUCCESS でない場合、アプリは XrSpatialContextEXT ハンドルを破棄して再作成し、アノテーションを再初期化するか、spatialContext を使用して他のアノテーションのトラッキングを続行できます。

有効な使用方法(暗黙的)

ランタイムは、各アノテーションの XrEventDataSpatialAnnotationTrackingANDROID を入力して、初期化の完了を示す必要があります。初期化の結果に関係なく、アプリケーションはイベントを受信した後、イメージ バッファを解放してメモリ使用量を減らすことができます。

アノテーションが正常に初期化された場合、ランタイムは initializationResultXR_SUCCESS を設定しなければなりません。アプリケーションは、XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT イベントをプルしてアノテーションをトラッキングできます。

それ以外の場合、ランタイムは、失敗の理由を示す適切なエラーコードを initializationResult に入力しなければなりません。アプリケーションは、XrSpatialContextEXT ハンドルを破棄して新しいアノテーションを開始するか、spatialContext を使用して他のアノテーションのトラッキングを続行できます

Quad アノテーション

ランタイムは、次のコンポーネント タイプをリストすることで、xrEnumerateSpatialCapabilityComponentTypesEXT を使用してクアッド アノテーションのサポートをアドバタイズしなければなりません。

  • XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID

クアッド リファレンス

XrSpatialAnnotationQuadReferenceANDROID 構造体は次のように定義されます。

typedef struct XrSpatialAnnotationQuadReferenceANDROID {
    XrStructureType                          type;
    const void*                              next;
    uint32_t                                 quadCount;
    const XrSpatialAnnotationQuadANDROID*    quads;
} XrSpatialAnnotationQuadReferenceANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • quadCount は、quads 配列内の要素の数を記述する uint32_t です。
  • quadsXrSpatialAnnotationQuadANDROID の配列へのポインタです。

ランタイムがクアッド アノテーションをサポートしている場合、アプリケーションは XrSpatialAnnotationQuadReferenceANDROID 構造体を XrSpatialReferenceImageEXT :: next にチェーンしてアノテーションを構成し、XrSpatialContextEXT ハンドルを作成する際に XrSpatialCapabilityConfigurationAnnotationTrackingANDROID :: reference で参照を設定できます

quadCount が 0 の場合、ランタイムは xrCreateSpatialContextAsyncEXT から XR_ERROR_SPATIAL_CAPABILITY_CONFIGURATION_INVALID_EXT を返さなければなりません。

有効な使用方法(暗黙的)

XrSpatialAnnotationQuadANDROID 構造体は次のように定義されます。

typedef struct XrSpatialAnnotationQuadANDROID {
    XrSpatialAnnotationQuadAlignmentANDROID    alignment;
    XrVector2f                                 upperLeft;
    XrVector2f                                 upperRight;
    XrVector2f                                 lowerRight;
    XrVector2f                                 lowerLeft;
} XrSpatialAnnotationQuadANDROID;

メンバーの説明

  • alignment は、クアッドの XrSpatialAnnotationQuadAlignmentANDROID です。
  • upperLeft は、原点に関連するクワッドの左上隅の座標を表す XrVector2f です。
  • upperRight は、原点に関連するクワッドの右上隅の座標を表す XrVector2f です。
  • lowerRight は、原点に関連するクアッドの右下隅の座標を表す XrVector2f です。
  • lowerLeft は、原点に関連するクアッドの左下隅の座標を表す XrVector2f です。

2D 空間のクワッドは、時計回りの順序の凸四角形です。4 つの角の値は、クアッドが関連付けられている原点(0, 0)に関連しています。

有効な使用方法(暗黙的)

typedef enum XrSpatialAnnotationQuadAlignmentANDROID {
    XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID = 0,
    XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID = 1,
    XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSpatialAnnotationQuadAlignmentANDROID;

XrSpatialAnnotationQuadAlignmentANDROID 列挙型は、クアッド アノテーションの配置を記述します。

列挙型の意味は次のとおりです。

列挙型の説明

XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_SCREEN_ANDROID

アノテーションの四角形は画面平面と平行ですが、平面内の回転はワールド グラビティにロックされたままです。出力は、通常の直立した境界ボックスとして表示されます。

XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID

アノテーションの四角形はオブジェクトに直接固定され、参照画像で定義された配置と一致します。出力は凸四角形で、オブジェクトの遠近法に合わせて形状が調整されます。

Quad コンポーネント

XrSpatialAnnotationQuadDataANDROID 構造体は次のように定義されます。

typedef struct XrSpatialAnnotationQuadDataANDROID {
    uint32_t                          annotationIndex;
    XrSpaceLocationData               origin;
    XrSpatialAnnotationQuadANDROID    quad;
} XrSpatialAnnotationQuadDataANDROID;

メンバーの説明

有効な使用方法(暗黙的)

XrSpatialComponentAnnotationQuadListANDROID 構造体は次のように定義されます。

typedef struct XrSpatialComponentAnnotationQuadListANDROID {
    XrStructureType                        type;
    void*                                  next;
    uint32_t                               quadCount;
    XrSpatialAnnotationQuadDataANDROID*    quads;
} XrSpatialComponentAnnotationQuadListANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • quadCount は、quads 配列内の要素の数を記述する uint32_t です。
  • quadsXrSpatialAnnotationQuadDataANDROID の配列です。

アプリケーションは、XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID を追加し、XrSpatialComponentDataQueryResultEXT の次のポインタ チェーンに XrSpatialComponentAnnotationQuadListANDROID を追加することで、XrSpatialSnapshotEXT の空間エンティティの四角形アノテーション コンポーネントをクエリできます

ランタイムは、XrSpatialComponentAnnotationQuadListANDROIDXrSpatialComponentDataQueryResultEXT :: next の次のチェーンにあるが、XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROIDXrSpatialComponentDataQueryConditionEXT :: componentTypes に含まれていない場合、xrQuerySpatialComponentDataEXT から XR_ERROR_VALIDATION_FAILURE を返さなければなりません

quadCountXrSpatialComponentDataQueryResultEXT :: entityIdCountOutput より小さい場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_SIZE_INSUFFICIENT を返さなければなりません。

有効な使用方法(暗黙的)

コードの例

ランタイム サポートを確認する

次のサンプルコードは、ランタイムがアノテーション トラッキング機能をサポートしているかどうかを確認する方法を示しています。

XrInstance instance;  // previously initialized
XrSystemId systemId;  // previously initialized
XrSession session;    // previously initialized
XrSpace localSpace;   // previously initialized, e.g. from
                      // XR_REFERENCE_SPACE_TYPE_LOCAL

PFN_xrEnumerateSpatialCapabilitiesEXT xrEnumerateSpatialCapabilitiesEXT;
PFN_xrEnumerateSpatialAnnotationReferenceSourcesANDROID xrEnumerateSpatialAnnotationReferenceSourcesANDROID;
PFN_xrEnumerateSpatialReferenceImageFormatsEXT xrEnumerateSpatialReferenceImageFormatsEXT;
PFN_xrEnumerateSpatialCapabilityComponentTypesEXT xrEnumerateSpatialCapabilityComponentTypesEXT;

// Check spatial annotation tracking capability
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0,
                                         &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount,
                                         &capabilityCount,
                                         capabilities.data()));
if (std::find(capabilities.begin(), capabilities.end(),
              XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID) ==
    capabilities.end()) {
  // System does not support spatial annotation tracking.
  return;
}

// Inspect system properties for annotation tracking variables
XrSystemSpatialAnnotationPropertiesANDROID annotationSystemProperties{
    XR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID};
XrSystemProperties systemProperties{.type = XR_TYPE_SYSTEM_PROPERTIES,
                                    .next = &annotationSystemProperties,
                                    .systemId = systemId};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (annotationSystemProperties.maxAnnotationCount == 0) {
  // System does not support any active annotations.
  return;
}

// Enumerate supported reference sources
uint32_t sourceCountOutput = 0;
XrSpatialAnnotationReferenceSourceANDROID desiredSource =
    XR_SPATIAL_ANNOTATION_REFERENCE_SOURCE_CAMERA_ANDROID;
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    0, &sourceCountOutput, nullptr));
std::vector<XrSpatialAnnotationReferenceSourceANDROID> sources(sourceCountOutput);
CHK_XR(xrEnumerateSpatialAnnotationReferenceSourcesANDROID(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    sourceCountOutput, &sourceCountOutput, sources.data()));
if (std::find(sources.begin(), sources.end(), desiredSource) == sources.end()) {
  // The desired source is not supported.
  return;
}

// Enumerate supported reference image formats, provided by XR_EXT_spatial_image_tracking.
uint32_t formatCountOutput = 0;
XrSpatialReferenceImageFormatEXT desiredFormat =
    XR_SPATIAL_REFERENCE_IMAGE_FORMAT_YUV_420_888_EXT; // Or XR_SPATIAL_REFERENCE_IMAGE_FORMAT_RGBA_8888_EXT for screenshot.
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID, 0,
    &formatCountOutput, nullptr));
std::vector<XrSpatialReferenceImageFormatEXT> formats(formatCountOutput);
CHK_XR(xrEnumerateSpatialReferenceImageFormatsEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    formats.size(), &formatCountOutput, formats.data()));
if (std::find(formats.begin(), formats.end(), desiredFormat) == formats.end()) {
  // The desired format is not supported
  return;
}

// Enumerate supported components for annotation tracking capability.
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes{
    XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    &capabilityComponentTypes));
std::vector<XrSpatialComponentTypeEXT>
    annotationTypes(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = annotationTypes.size();
capabilityComponentTypes.componentTypes = annotationTypes.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(
    instance, systemId, XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
    &capabilityComponentTypes));

// Check supported annotation components.
XrSpatialComponentTypeEXT desiredComponent =
    XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID;
const auto supportedComponent = [&annotationTypes](
                                    XrSpatialComponentTypeEXT component) {
  return std::find(annotationTypes.begin(), annotationTypes.end(), component) !=
         annotationTypes.end();
};
if (!supportedComponent(desiredComponent)) {
  // The desired annotation is not supported.
  return;
}

クワッド アノテーションを構成する

次のコード例は、四角形アノテーションを構成する方法を示しています。

XrInstance instance;  // previously initialized
XrSystemId systemId;  // previously initialized
XrSession session;    // previously initialized
XrSpace localSpace;   // previously initialized, e.g. from
                      // XR_REFERENCE_SPACE_TYPE_LOCAL

PFN_xrCreateSpatialReferenceCacheAsyncANDROID xrCreateSpatialReferenceCacheAsyncANDROID;
PFN_xrCreateSpatialReferenceCacheCompleteANDROID xrCreateSpatialReferenceCacheCompleteANDROID;
PFN_xrDestroySpatialReferenceCacheANDROID xrDestroySpatialReferenceCacheANDROID;
PFN_xrCreateSpatialContextAsyncEXT xrCreateSpatialContextAsyncEXT;
PFN_xrCreateSpatialContextCompleteEXT xrCreateSpatialContextCompleteEXT;
void (*waitUntilReady)(XrFutureEXT);

XrSpatialReferenceImageFormatEXT desiredFormat;
XrSpatialAnnotationReferenceSourceANDROID desiredSource;
XrSpatialComponentTypeEXT desiredComponent;

// Create and start reference cache to prepare for capturing reference images.
XrSpatialReferenceCacheANDROID referenceCache;
XrSpatialReferenceCacheCreateInfoANDROID cacheCreateInfo{
  .type = XR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID,
  .next = nullptr,
  .capability = XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID,
  .source = desiredSource,
};
XrFutureEXT cacheFuture = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialReferenceCacheAsyncANDROID(session, &cacheCreateInfo, &cacheFuture));

waitUntilReady(cacheFuture);

XrCreateSpatialReferenceCacheCompletionANDROID cacheCompletion{
    XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID};
CHK_XR(xrCreateSpatialReferenceCacheCompleteANDROID(session, cacheFuture,
                                                     &cacheCompletion));
if (cacheCompletion.futureResult != XR_SUCCESS) {
  // Error, reference cache creation failed
  return;
}

referenceCache = cacheCompletion.referenceCache;

// Create the reference image with quad annotations

//  YUV 4:2:0 Planar:
// ----------------------
// |     Y      |Cb |Cr |
// ----------------------
XrSpatialReferenceImagePlaneEXT cameraImagePlanes[3];
// for each plane (0=Y, 1=U(cb), 2=V(Cr)) return by Image#getPlanes().
for (int i = 0; i < 3; ++i) {
  cameraImagePlanes[i].buffer; // read from Plane#getBuffer().
  cameraImagePlanes[i].bufferSize; // set each buffer size. Y = width * height (bytes); U = Y / 4 (bytes); V = Y / 4 (bytes).
  cameraImagePlanes[i].rowStride; // read from Plane#getRowStride().
  cameraImagePlanes[i].pixelStride; // read from Plane#getPixelStride().
}
XrSpatialReferenceImageEXT referenceImage{
      XR_TYPE_SPATIAL_REFERENCE_IMAGE_EXT};
referenceImage.width = 640;
referenceImage.height = 480;
referenceImage.format = desiredFormat;
referenceImage.planeCount = 3;
referenceImage.planes = cameraImagePlanes;

XrSpatialAnnotationQuadANDROID
    quad; // quad coordinates within the reference image.
quad.alignment = XR_SPATIAL_ANNOTATION_QUAD_ALIGNMENT_OBJECT_ANDROID;
// Set unnormalized pixel coordinates of 4 corners.
quad.upperLeft = {0.0, 0.0};
quad.upperRight = {0.0, 100.0};
quad.lowerRight = {100.0, 100.0};
quad.lowerLeft = {0.0, 100.0};

XrSpatialAnnotationQuadReferenceANDROID quadReference{
    XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID};
quadReference.quads = &quad;
quadReference.quadCount = 1;
referenceImage.next = &quadReference;

// Create the spatial context with annotation configuration.
XrSpatialContextEXT spatialContext{};
{
  const std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
      desiredComponent,
  };

  // Configure annotation tracking
  XrSpatialCapabilityConfigurationAnnotationTrackingANDROID annotationConfig{
      XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID};
  annotationConfig.capability =
      XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID;
  annotationConfig.enabledComponentCount = enabledComponents.size();
  annotationConfig.enabledComponents = enabledComponents.data();
  annotationConfig.cache = referenceCache;
  annotationConfig.time; // The time when this reference image is captured.
  annotationConfig.reference = referenceImage;

  std::vector<XrSpatialCapabilityConfigurationBaseHeaderEXT *>
      capabilityConfigs;
  capabilityConfigs.push_back(
      reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT *>(
          &annotationConfig));

  XrSpatialContextCreateInfoEXT spatialContextCreateInfo{
      XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
  spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
  spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();

  XrFutureEXT createContextFuture = XR_NULL_FUTURE_EXT;
  CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo,
                                        &createContextFuture));

  waitUntilReady(createContextFuture);

  XrCreateSpatialContextCompletionEXT completion{
      XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture,
                                           &completion));
  if (completion.futureResult != XR_SUCCESS) {
    // Error, spatial context creation failed
    return;
  }

  spatialContext = completion.spatialContext;
  CHK_XR(xrDestroySpatialReferenceCacheANDROID(referenceCache));
}

アクティブなアノテーションを見つける

次のコード例は、アノテーションを検出してクエリする方法を示しています。

XrInstance instance;  // previously initialized
XrSession session;    // previously initialized
XrSpace localSpace;   // previously initialized, e.g. from
                      // XR_REFERENCE_SPACE_TYPE_LOCAL
XrSpatialContextEXT spatialContext; // previously created

PFN_xrCreateSpatialDiscoverySnapshotAsyncEXT xrCreateSpatialDiscoverySnapshotAsyncEXT;
PFN_xrCreateSpatialDiscoverySnapshotCompleteEXT xrCreateSpatialDiscoverySnapshotCompleteEXT;
PFN_xrQuerySpatialComponentDataEXT xrQuerySpatialComponentDataEXT;
PFN_xrDestroySpatialSnapshotEXT xrDestroySpatialSnapshotEXT;
PFN_xrPollEvent xrPollEvent;
PFN_xrDestroySpatialContextEXT xrDestroySpatialContextEXT;
void (*waitUntilReady)(XrFutureEXT);

XrSpatialComponentTypeEXT desiredComponent; // e.g. XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID

auto discoverAnnotations = [&](XrSpatialContextEXT spatialContext, XrTime time,
                               XrSpace baseSpace) {
  std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{desiredComponent};
  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{
      XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  XrFutureEXT discoveryFuture = XR_NULL_FUTURE_EXT;
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(
      spatialContext, &snapshotCreateInfo, &discoveryFuture));

  waitUntilReady(discoveryFuture);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{
      XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = baseSpace;
  completionInfo.time = time;
  completionInfo.future = discoveryFuture;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{
      XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
      spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {
    // Query for desired annotation data, e.g. quad.
    XrSpatialComponentTypeEXT componentsToQuery[] = {
        XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID};
    XrSpatialComponentDataQueryConditionEXT queryCond{
        XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = 1;
    queryCond.componentTypes = componentsToQuery;
    XrSpatialComponentDataQueryResultEXT queryResult{
        XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond,
                                          &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(
        queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(
        queryResult.entityStateCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrSpatialAnnotationQuadDataANDROID> quads(
        queryResult.entityIdCountOutput);
    XrSpatialComponentAnnotationQuadListANDROID quadList{
        XR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID};
    quadList.quadCount = quads.size();
    quadList.quads = quads.data();
    queryResult.next = &quadList;

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond,
                                          &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (entityStates[i] == XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
        const XrSpatialAnnotationQuadDataANDROID &currentQuad = quads[i];
        // Rendering quad in the view.
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // For every frame in frame loop

  XrSpace space;           // Application's play space.
  XrFrameState frameState; // Previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
    switch (event.type) {
    case XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID: {
      const XrEventDataSpatialAnnotationTrackingANDROID &eventdata =
          *reinterpret_cast<XrEventDataSpatialAnnotationTrackingANDROID *>(
              &event);
      if (eventdata.initializationResult != XR_SUCCESS) {
        // handle initialization failure.
        // e.g. CHK_XR(xrDestroySpatialContextEXT(spatialContext));
      }
      break;
    }
    case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
      const XrEventDataSpatialDiscoveryRecommendedEXT &eventdata =
          *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT *>(
              &event);
      // Discover spatial entities for the context that we received the
      // "discovery recommended" event for.
      //discoverSpatialEntities(eventdata.spatialContext, time, space);
      break;
    }
    }
  }

  // Finish frame loop
}

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

新しいオブジェクト タイプ

新しいコマンド

新しい構造体

新しい列挙型

新しい列挙型定数

  • XR_ANDROID_SPATIAL_ANNOTATION_TRACKING_EXTENSION_NAME
  • XR_ANDROID_spatial_annotation_tracking_SPEC_VERSION
  • XrObjectType の拡張 :

    • XR_OBJECT_TYPE_SPATIAL_REFERENCE_CACHE_ANDROID
  • XrSpatialCapabilityEXT を拡張する :

    • XR_SPATIAL_CAPABILITY_ANNOTATION_TRACKING_ANDROID
  • XrSpatialComponentTypeEXT を拡張 :

    • XR_SPATIAL_COMPONENT_TYPE_ANNOTATION_QUAD_ANDROID
  • XrStructureType を拡張する :

    • XR_TYPE_CREATE_SPATIAL_REFERENCE_CACHE_COMPLETION_ANDROID
    • XR_TYPE_EVENT_DATA_SPATIAL_ANNOTATION_TRACKING_ANDROID
    • XR_TYPE_SPATIAL_ANNOTATION_QUAD_REFERENCE_ANDROID
    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_ANNOTATION_TRACKING_ANDROID
    • XR_TYPE_SPATIAL_COMPONENT_ANNOTATION_QUAD_LIST_ANDROID
    • XR_TYPE_SPATIAL_REFERENCE_CACHE_CREATE_INFO_ANDROID
    • XR_TYPE_SYSTEM_SPATIAL_ANNOTATION_PROPERTIES_ANDROID

問題

バージョン履歴

  • リビジョン 1、2025-09-17(Levana Chen)

    • 拡張機能の初回説明。