XR_ANDROID_depth_texture OpenXR 拡張機能

名前の文字列

XR_ANDROID_depth_texture

拡張機能の種類

インスタンスの拡張

登録されている電話番号

703

リビジョン

1

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

OpenXR 1.0

最終更新日

2024-09-11

IP ステータス

既知の IP に関する申し立てはありません。

投稿者

Sushant Kulkarni、Google

Cairn Overturf、Google

Spencer Quin、Google

Levana Chen、Google

概要

この拡張機能により、アプリケーションはヘッドセットの周囲の現実環境の深度マップをリクエストし、作成時にサポートされている深度解像度をクエリできます。

この拡張機能は、オクルージョン、ヒットテスト、その他の正確なシーン ジオメトリを使用する特定のタスク(偽造顔検出など)に、元の深度とスムーズな深度を公開することを目的としています。

システムの機能を確認する

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

typedef struct XrSystemDepthTrackingPropertiesANDROID {
    XrStructureType    type;
    const void*        next;
    XrBool32           supportsDepthTracking;
} XrSystemDepthTrackingPropertiesANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • nextNULL または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。
  • supportsDepthTracking は、現在のシステムがデプス トラッキングをサポートしているかどうかを示す XrBool32 です。

アプリは、xrGetSystemProperties を呼び出すときに XrSystemPropertiesXrSystemDepthTrackingPropertiesANDROID 構造で拡張することで、システムがデプス トラッキングに対応しているかどうかを検査できます。

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

クエリの深さの解決策

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

XrResult xrEnumerateDepthResolutionsANDROID(
    XrSession                                   session,
    uint32_t                                    resolutionCapacityInput,
    uint32_t*                                   resolutionCountOutput,
    XrDepthCameraResolutionANDROID*             resolutions);

パラメータの説明

  • session は、サポートされている深度解像度を列挙する XrSession です。
  • resolutionCapacityInputresolutions の容量です。必要な容量を取得するには 0 にします。
  • resolutionCountOutput は、書き込まれた uint64_t resolutions の数へのポインタ、または resolutionCapacityInput が不十分な場合に必要な容量へのポインタです。
  • resolutionsXrDepthCameraResolutionANDROID の配列へのポインタですが、resolutionCapacityInput が 0 の場合、NULL にすることができます。
  • 必要な resolutions サイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。

xrEnumerateDepthResolutionsANDROID は、現在のセッションでサポートされている深度解像度を列挙します。深度解像度は、ランタイムの優先度の高い順に並べ替える必要があります。アプリケーションは、パフォーマンスと品質を最適化するために、サポートされている最高の設定を使用する必要があります

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

  • xrEnumerateDepthResolutionsANDROID を呼び出す前に、XR_ANDROID_depth_texture 拡張機能を有効にする必要があります。
  • session は有効な XrSession ハンドルである必要があります。
  • resolutionCountOutputuint32_t 値へのポインタである必要があります。
  • resolutionCapacityInput が 0 でない場合、resolutionsresolutionCapacityInput XrDepthCameraResolutionANDROID 値の配列へのポインタである必要があります。

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT

XrDepthCameraResolutionANDROID 列挙型は、XrDepthSwapchainANDROID の作成時にサポートされる深度解像度を表します。

typedef enum XrDepthCameraResolutionANDROID {
    XR_DEPTH_CAMERA_RESOLUTION_80x80_ANDROID = 0,
    XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID = 1,
    XR_DEPTH_CAMERA_RESOLUTION_320x320_ANDROID = 2
    } XrDepthCameraResolutionANDROID;

列挙値の説明

  • XR_DEPTH_CAMERA_RESOLUTION_80x80_ANDROID - 深度画像と信頼性画像の解像度は 80×80 です。
  • XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID - 深度画像と信頼度画像の解像度は 160x160 です。
  • XR_DEPTH_CAMERA_RESOLUTION_320x320_ANDROID - 深度画像と信頼性の画像の解像度は 320x320 です。

深度スワップチェーンを作成する

XR_DEFINE_HANDLE(XrDepthSwapchainANDROID)

XrDepthSwapchainANDROID は深度スワップチェーン ハンドルです。

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

XrResult xrCreateDepthSwapchainANDROID(
    XrSession                                   session,
    const XrDepthSwapchainCreateInfoANDROID*    createInfo,
    XrDepthSwapchainANDROID*                    swapchain);

パラメータの説明

  • session は、深度スワップチェーンを作成する XrSession です。

  • createInfo は、スワップチェーンの作成に使用されるパラメータを含む XrDepthSwapchainCreateInfoANDROID 構造体へのポインタです。

  • swapchain は、作成された XrDepthSwapchainANDROID が返されるハンドルへのポインタです。

アプリケーションは、xrCreateDepthSwapchainANDROID 関数を使用して、深度と信頼度の両方の画像を管理する深度スワップチェーンを作成できます。

返された深度スワップチェーン ハンドルは、後で API 呼び出しで使用される可能性がありますXrDepthSwapchainANDROID ハンドルは、最終的には xrDestroyDepthSwapchainANDROID 関数を使用して解放する必要があります。

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

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_OUT_OF_MEMORY
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_LIMIT_REACHED

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

typedef struct XrDepthSwapchainCreateInfoANDROID {
    XrStructureType                       type;
    const void*                           next;
    XrDepthCameraResolutionANDROID        resolution;
    XrDepthSwapchainCreateFlagsANDROID    createFlags;
} XrDepthSwapchainCreateInfoANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • nextNULL または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。
  • resolution は、深度と信頼のテクスチャを作成する XrDepthCameraResolutionANDROID です。
  • createFlags は 1 つ以上の XrDepthSwapchainCreateFlagsANDROID です。

XrDepthSwapchainCreateInfoANDROID 構造体は、xrCreateDepthSwapchainANDROID に渡されたときに XrDepthSwapchainANDROID の作成オプションを提供します。

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

XrDepthSwapchainCreateFlagsANDROID には、XrDepthSwapchainANDROID の作成オプションを指定します。

typedef XrFlags64 XrDepthSwapchainCreateFlagsANDROID;

XrDepthSwapchainCreateFlagsANDROID の有効なビットは、XrDepthSwapchainCreateFlagBitsANDROID で定義されます。これは次のように指定されます。

// Flag bits for XrDepthSwapchainCreateFlagsANDROID
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID = 0x00000001;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID = 0x00000002;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID = 0x00000004;
static const XrDepthSwapchainCreateFlagsANDROID XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID = 0x00000008;

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

XrResult xrDestroyDepthSwapchainANDROID(
    XrDepthSwapchainANDROID                     swapchain);

パラメータの説明

  • swapchain は、xrCreateDepthSwapchainANDROID によって以前に作成された XrDepthSwapchainANDROID ハンドルです。

xrDestroyDepthSwapchainANDROID 関数は、デプス スワップチェーンを破棄します。

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

スレッドセーフ

  • swapchain と子ハンドルへのアクセスは、外部で同期する必要があります

戻りコード

成功

  • XR_SUCCESS

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID

深度テクスチャにアクセスする

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

XrResult xrEnumerateDepthSwapchainImagesANDROID(
    XrDepthSwapchainANDROID                     depthSwapchain,
    uint32_t                                    depthImageCapacityInput,
    uint32_t*                                   depthImageCountOutput,
    XrDepthSwapchainImageANDROID*               depthImages);

パラメータの説明

  • depthSwapchain は、画像を取得する XrDepthSwapchainANDROID です。
  • depthImageCapacityInputdepthImages 配列の容量です。必要な容量を取得するリクエストを示すには 0 にします。
  • depthImageCountOutput は、書き込まれた depthImages の数へのポインタ、または depthImageCapacityInput が不十分な場合に必要な容量へのポインタです。
  • depthImages は、XrDepthSwapchainImageANDROID 構造の配列へのポインタです。depthImageCapacityInput が 0 の場合、NULL にできます。
  • 必要な depthImages サイズの取得の詳細については、バッファサイズ パラメータのセクションをご覧ください。

xrEnumerateDepthSwapchainImagesANDROID は、XrDepthSwapchainImageANDROID 構造の配列を入力します。リソースは一定で、XrDepthSwapchainANDROID の存続期間中有効です。この関数は xrEnumerateSwapchainImages と同様に動作します。

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

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SIZE_INSUFFICIENT

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

typedef struct XrDepthSwapchainImageANDROID {
    XrStructureType    type;
    void*              next;
    const float*       rawDepthImage;
    const uint8_t*     rawDepthConfidenceImage;
    const float*       smoothDepthImage;
    const uint8_t*     smoothDepthConfidenceImage;
} XrDepthSwapchainImageANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • nextNULL または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。
  • rawDepthImageNULL または、左側と右側の両方のビューの未加工の深度画像へのポインタです。値の単位はメートルです。特別な値: 0.0 は、元の深度で無効または空の深度ピクセルを示します。Inf は、事実上無限に遠くにある既知の深度を示します。
  • rawDepthConfidenceImageNULL または、左側と右側の両方のビューの未加工の深度信頼性画像へのポインタです。
  • smoothDepthImageNULL で、左側と右側の両方のビューの深度画像をスムーズにするポインタです。値の単位はメートルです。特別な値: 0.0 は、スムーズな深度で無効または空の深度ピクセルを示します。Inf は、事実上無限に遠くにある既知の深度を示します。
  • smoothDepthConfidenceImageNULL または、左側と右側の両方のビューの深度信頼性画像をスムーズにするポインタです。

XrDepthSwapchainImageANDROID は、読み取り可能な XrDepthSwapchainANDROID の奥行き画像を表します。この画像は、xrCreateDepthSwapchainANDROID の呼び出し時に XrDepthSwapchainCreateInfoANDROID::resolutionXrDepthSwapchainCreateInfoANDROID::createFlags で説明されているように割り振られます。深度画像ごとに:

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

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

XrResult xrAcquireDepthSwapchainImagesANDROID(
    XrDepthSwapchainANDROID                     depthSwapchain,
    const XrDepthAcquireInfoANDROID*            acquireInfo,
    XrDepthAcquireResultANDROID*                acquireResult);

パラメータの説明

アプリケーションは、xrAcquireDepthSwapchainImagesANDROID 関数を使用して、XrDepthAcquireResultANDROID::acquiredIndex などの利用可能な最新の swapchain イメージ インデックスを取得し、xrEnumerateDepthSwapchainImagesANDROID によって列挙される XrDepthSwapchainImageANDROID 配列に格納できます。返される XrDepthAcquireResultANDROID には、深度データを解釈するために必要な視野やポーズなどの他の情報も含まれています。xrAcquireDepthSwapchainImagesANDROID の次回の呼び出しまで、画像配列内の取得済みスロットから読み取ることは安全です。

セッション内の対応する xrBeginFrame 呼び出しと xrEndFrame 呼び出しのペアの間に、xrAcquireDepthSwapchainImagesANDROID の呼び出しは 1 回だけする必要があります

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

戻りコード

成功

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

失敗

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID
  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_LIMIT_REACHED
  • XR_ERROR_TIME_INVALID

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

typedef struct XrDepthAcquireInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             displayTime;
} XrDepthAcquireInfoANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • nextNULL または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。
  • space は、XrDepthAcquireResultANDROID::views で返されたポーズの参照フレームを定義する XrSpace です。
  • displayTime は、XrDepthAcquireResultANDROID::views で返されたポーズのポーズを計算するために使用された時間を指定する XrTime です。アプリは、現在のフレームの予測表示時間を渡す必要があります。

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

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

typedef struct XrDepthAcquireResultANDROID {
    XrStructureType       type;
    const void*           next;
    uint32_t              acquiredIndex;
    XrTime                exposureTimestamp;
    XrDepthViewANDROID    views[2];
} XrDepthAcquireResultANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • nextNULL または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。
  • acquiredIndex は、xrEnumerateDepthSwapchainImagesANDROID によって列挙される XrDepthSwapchainImageANDROID 配列への取得済みテクスチャのインデックスです。
  • exposureTimestamp は、深度マップがキャプチャされた時刻を指定する XrTime です。
  • views は、左右の眼に 1 つずつ、2 つの XrDepthViewANDROID の配列です。インデックス 0 は左眼、インデックス 1 は右眼です。

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

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

typedef struct XrDepthViewANDROID {
    XrStructureType    type;
    const void*        next;
    XrFovf             fov;
    XrPosef            pose;
} XrDepthViewANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • nextNULL または構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。
  • fov は、このビューの生成に使用される画角を指定する XrFovf です。ビューが水平方向または垂直方向に反転されることはありません。
  • pose は、深度マップがレンダリングされたポーズを指定する XrPosef です。参照フレームは XrDepthAcquireInfoANDROID で指定されます。

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

デプス トラッキングのサンプルコード

次のサンプルコードは、深度画像を取得する方法を示しています。

XrInstance instance;  // previously initialized
XrSystemId systemId;  // previously initialized
XrSession session; // previously initialized
XrSpace stageSpace; // space created for XR_REFERENCE_SPACE_TYPE_STAGE.

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateDepthSwapchainANDROID xrCreateDepthSwapchainANDROID; // previously initialized
PFN_xrDestroyDepthSwapchainANDROID xrDestroyDepthSwapchainANDROID; // previously initialized
PFN_xrEnumerateDepthSwapchainImagesANDROID xrEnumerateDepthSwapchainImagesANDROID; // previously initialized
PFN_xrEnumerateDepthResolutionsANDROID xrEnumerateDepthResolutionsANDROID; // previously initialized
PFN_xrAcquireDepthSwapchainImagesANDROID xrAcquireDepthSwapchainImagesANDROID; // previously initialized

// Inspect system capability
XrSystemProperties properties{XR_TYPE_SYSTEM_PROPERTIES};
XrSystemDepthTrackingPropertiesANDROID depthTrackingProperties{XR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID};
properties.next = &depthTrackingProperties;
CHK_XR(xrGetSystemProperties(instance, systemId, &properties));
if (!depthTrackingProperties.supportsDepthTracking) {
  // depth tracking is not supported.
  return;
}

// Query the supported depth resolution.
XrDepthCameraResolutionANDROID supportedDepthResolution;
uint32_t supportedResolutionCount = 0;
CHK_XR(xrEnumerateDepthResolutionsANDROID(
    session, 1, &supportedResolutionCount, &supportedDepthResolution));

// Define metadata to access the raw and smooth depth along with confidences.
XrDepthSwapchainCreateInfoANDROID swapchainCreateInfo = {
  .type = XR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROID,
  .next = nullptr,
  .createFlags =
    XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_DEPTH_IMAGE_BIT_ANDROID |
    XR_DEPTH_SWAPCHAIN_CREATE_SMOOTH_CONFIDENCE_IMAGE_BIT_ANDROID |
    XR_DEPTH_SWAPCHAIN_CREATE_RAW_DEPTH_IMAGE_BIT_ANDROID |
    XR_DEPTH_SWAPCHAIN_CREATE_RAW_CONFIDENCE_IMAGE_BIT_ANDROID,

  // Use the resolution supported by the runtime.
  .resolution = supportedDepthResolution,
};

XrDepthSwapchainANDROID depthSwapchain;
CHK_XR(xrCreateDepthSwapchainANDROID(
    session, &swapchainCreateInfo, &depthSwapchain));

// Enumerate depth images.
uint32_t imageCountOutput = 0;
CHK_XR(xrEnumerateDepthSwapchainImagesANDROID(
    depthSwapchain, 0, &imageCountOutput, nullptr));
std::vector<XrDepthSwapchainImageANDROID> depthImages(imageCountOutput);
for (int i = 0; i < imageCountOutput; i++) {
  depthImages[i].type = XR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID;
}
CHK_XR(xrEnumerateDepthSwapchainImagesANDROID(
  depthSwapchain, imageCountOutput, &imageCountOutput, depthImages.data()));

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

    XrFrameState frameState;  // previously returned from xrWaitFrame
    const XrTime time = frameState.predictedDisplayTime;

    XrDepthAcquireInfoANDROID acquireInfo = {
        .type = XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID,
        .space = stageSpace,
        .time = time};
    XrDepthAcquireResultANDROID acquireResult = {
        .type = XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID,
    };
    CHK_XR(xrAcquireDepthImagesANDROID(
        depthSwapchain, &acquireInfo, &acquireResult));

    // Each value in a depth image corresponds to a point in the real world.
    // The sample code in this section shows how to find the stageSpace position
    // of the point corresponding to a particular value in the depth image.

    // For this sample code, assume we are using a right handed coordinate system
    // with +X to the right, +Y up and -Z forward.

    XrDepthSwapchainImageANDROID *image =
        &depthImages[acquireResult.acquireIndex];

    // Assume supported resolution is XR_DEPTH_CAMERA_RESOLUTION_160x160_ANDROID.
    const int imageResolution = 160;
    int imageY = // value in [0, imageResolution)
    int imageX = // value in [0, imageResolution)

    // Get depth value from left eye.
    // A right depth value would be obtained with the following expression:
    // depthR = image->rawDepthImage[imageResolution*imageResolution+i*imageResolution+j]
    float depthL = image->rawDepthImage[imageY*imageResolution + imageX];
    XrDepthViewANDROID viewL = acquireResult.views[0];

    float tanL = tanf(viewL.fov.angleLeft);
    float tanR = tanf(viewL.fov.angleRight);
    float tanU = tanf(viewL.fov.angleUp);
    float tanD = tanf(viewL.fov.angleDown);

    float s = (imageX + 0.5f) / (float)imageResolution;
    float t = (imageY + 0.5f) / (float)imageResolution;

    // Calculate the depth camera space position of the point
    // corresponding to this depth value.
    XrVector3f posInCameraSpace;
    posInCameraSpace.z = -depthL;
    posInCameraSpace.x = (tanL + (tanR - tanL)*s)*depthL;
    posInCameraSpace.y = (tanB + (tanU - tanB)*t)*depthL;

    XrPosef depthCameraPoseL = viewL.pose;
    // Transform posInCameraSpace by depthCameraPoseL

    // ...
    // Finish frame loop
    // ...
}

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

新しい列挙型定数

XrObjectType 列挙型が拡張され、次のように変更されました。

  • XR_OBJECT_TYPE_DEPTH_SWAPCHAIN_ANDROID

XrResult 列挙型が拡張され、次が追加されました。

  • XR_ERROR_DEPTH_NOT_AVAILABLE_ANDROID

XrStructureType 列挙型が拡張され、次のように変更されました。

  • XR_TYPE_DEPTH_SWAPCHAIN_CREATE_INFO_ANDROID
  • XR_TYPE_DEPTH_VIEW_ANDROID
  • XR_TYPE_DEPTH_ACQUIRE_INFO_ANDROID
  • XR_TYPE_DEPTH_ACQUIRE_RESULT_ANDROID
  • XR_TYPE_SYSTEM_DEPTH_TRACKING_PROPERTIES_ANDROID
  • XR_TYPE_DEPTH_SWAPCHAIN_IMAGE_ANDROID

新しい列挙型

新しい構造

新しい関数

問題

変更履歴

  • リビジョン 1、2024 年 9 月 9 日(Levana Chen)
    • 最初の拡張機能の説明