Name String
XR_ANDROID_hand_mesh
拡張機能の種類
インスタンスの拡張
登録されている電話番号
704
リビジョン
1
拡張機能とバージョンの依存関係
最終更新日
2024-09-10
IP ステータス
既知の IP に関する申し立てはありません。
寄与者
Nihav Jain、Google
Cairn Overturf、Google
Spencer Quin、Google
Levana Chen、Google
概要
この拡張機能を使用すると、動的なハンドメッシュとして表示されるハンド トラッキングが可能になります。
この拡張機能は、ユーザーの手のパーソナライズされた表現のメッシュに頂点バッファとインデックス バッファを提供することを目的としています。オクルージョンと可視化に使用できます。
この拡張機能は、他の手トラッキング目的には使用しないでください。
- インタラクションには
XR_EXT_hand_interactionを使用できます。 - スケルトン ジョイントの場合は、
XR_EXT_hand_trackingを使用できます。
ハンド トラッキング データは機密性の高い個人情報であり、個人のプライバシーと完全性と密接に関連しています。ハンド トラッキング データを保存または転送するアプリでは、必ずユーザーにアクティブで明確な同意を求めることを強くおすすめします。
システムの機能を確認する
アプリは、xrGetSystemProperties を呼び出すときに XrSystemHandMeshTrackingPropertiesANDROID 構造を XrSystemProperties に連結することで、システムがハンド トラッキング メッシュに対応しているかどうかを検査できます。
typedef struct XrSystemHandMeshTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsHandMeshTracking;
XrBool32 supportsTextureUV;
XrBool32 supportsVertexNormal;
} XrSystemHandMeshTrackingPropertiesANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextはNULLまたは構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。supportsHandMeshTrackingはXrBool32で、選択したXrSystemIdがハンドメッシュ トラッキングをサポートしているかどうかを示します。supportsTextureUVはXrBool32で、選択したXrSystemIdがメッシュ頂点のテクスチャ UV をサポートしているかどうかを示します。supportsVertexNormalはXrBool32で、選択したXrSystemIdがメッシュ頂点の頂点法線をサポートしているかどうかを示します。
supportsHandMeshTracking が XR_FALSE の場合、システムがハンドメッシュ トラッキングをサポートしていないことを意味するため、アプリはハンドメッシュ機能を使用しない必要があります。この場合、xrCreateHandMeshTrackerANDROID は XR_ERROR_FEATURE_UNSUPPORTED を返します。
supportsHandMeshTracking が XR_TRUE を返す場合、システムはハンドメッシュ トラッキングをサポートしています。アプリは、XrHandMeshANDROID::indexCount と XrHandMeshANDROID::vertexCount を使用してハンドメッシュ バッファにアクセスし、フレームごとに xrGetHandMeshANDROID を呼び出すときにレンダリング ループで再利用する必要があります。
supportsTextureUV が XR_FALSE を返す場合、システムはメッシュ頂点のテクスチャ UV をサポートしていないため、アプリは xrGetHandMeshANDROID を呼び出すときに XrHandMeshANDROID::textureUVs NULL を受け取ります。
supportsVertexNormal が XR_FALSE を返す場合、システムはメッシュ頂点の頂点法線をサポートしていないため、アプリは xrGetHandMeshANDROID を呼び出すときに XrHandMeshANDROID::normals NULL を受け取ります。
有効な使用方法(暗黙的)
- XrSystemHandMeshTrackingPropertiesANDROID を使用する前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 typeはXR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDにする必要があります。nextはNULLであるか、構造体チェーンの次の構造体への有効なポインタである必要があります。
ハンドメッシュ トラッカー ハンドルを作成する
XR_DEFINE_HANDLE(XrHandMeshTrackerANDROID)
XrHandMeshTrackerANDROID ハンドルは、ハンドメッシュ トラッキングと関連リソースの管理を行うハンドメッシュ トラッカーを表します。
このハンドルを使用すると、この拡張機能の他の関数を使用してハンドメッシュ バッファにアクセスできます。
アプリケーションは、xrCreateHandMeshTrackerANDROID 関数を使用して XrHandMeshTrackerANDROID ハンドルを作成できます。
XrResult xrCreateHandMeshTrackerANDROID(
XrSession session,
const XrHandMeshTrackerCreateInfoANDROID* createInfo,
XrHandMeshTrackerANDROID* handMeshTracker);
パラメータの説明
sessionは、ハンドメッシュ トラッカーが有効になる XrSession です。createInfoは、ハンドメッシュ トラッカーの指定に使用される XrHandMeshTrackerCreateInfoANDROID です。handMeshTrackerは、返された XrHandMeshTrackerANDROID ハンドルです。
システムがハンドメッシュ トラッキングをサポートしていない場合、xrCreateHandMeshTrackerANDROID は XR_ERROR_FEATURE_UNSUPPORTED を返します。
XrHandMeshTrackerANDROID ハンドルは、ハンドメッシュ トラッキング用のすべてのリソースを所有します。ハンドメッシュ トラッキング エクスペリエンスの終了後、アプリは xrDestroyHandMeshTrackerANDROID 関数を使用してハンドルを破棄する必要があります。
有効な使用方法(暗黙的)
- xrCreateHandMeshTrackerANDROID を呼び出す前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 sessionは有効な XrSession ハンドルである必要があります。createInfoは、有効な XrHandMeshTrackerCreateInfoANDROID 構造体へのポインタである必要があります。handMeshTrackerは XrHandMeshTrackerANDROID ハンドルへのポインタである必要があります。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FEATURE_UNSUPPORTEDXR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_HANDLE_INVALIDXR_ERROR_LIMIT_REACHED
XrHandMeshTrackerCreateInfoANDROID 構造体には、XrHandMeshTrackerANDROID ハンドルを作成する情報が記述されています。
typedef struct XrHandMeshTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
} XrHandMeshTrackerCreateInfoANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextはNULLまたは構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。
有効な使用方法(暗黙的)
- XrHandMeshTrackerCreateInfoANDROID を使用する前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 typeはXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDにする必要があります。nextはNULLであるか、構造体チェーンの次の構造体への有効なポインタである必要があります。
xrDestroyHandMeshTrackerANDROID 関数は、ハンドメッシュ トラッキング エクスペリエンスの終了時に handMeshTracker と基盤となるリソースを解放します。
XrResult xrDestroyHandMeshTrackerANDROID(
XrHandMeshTrackerANDROID handMeshTracker);
パラメータの説明
handMeshTrackerは、xrCreateHandMeshTrackerANDROID で以前に作成した XrHandMeshTrackerANDROID です。
有効な使用方法(暗黙的)
- xrDestroyHandMeshTrackerANDROID を呼び出す前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 handMeshTrackerは有効な XrHandMeshTrackerANDROID ハンドルである必要があります。
スレッドセーフ
handMeshTrackerと子ハンドルへのアクセスは、外部で同期する必要があります。
戻りコード
XR_SUCCESS
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALID
手のメッシュを見つける
アプリケーションは、xrGetHandMeshANDROID 関数を使用して、指定したタイムスタンプでハンドメッシュを取得できます。手メッシュの頂点の位置と法線は、xrGetHandMeshANDROID を呼び出すときに XrHandMeshGetInfoANDROID::baseSpace で指定された空間で表されます。
XrResult xrGetHandMeshANDROID(
XrHandMeshTrackerANDROID handMeshTracker,
const XrHandMeshGetInfoANDROID* getInfo,
XrHandTrackingMeshesANDROID* handMeshes);
パラメータの説明
handMeshTrackerは、xrCreateHandMeshTrackerANDROID で以前に作成した XrHandMeshTrackerANDROID ハンドルです。getInfoは、ハンドメッシュ データをクエリするための情報が含まれる XrHandMeshGetInfoANDROID 構造体です。handMeshesは、手メッシュデータが入力される XrHandTrackingMeshesANDROID 構造へのポインタです。
アプリケーションは、xrGetHandMeshANDROID 関数を使用して、ランタイムによって生成されたハンドメッシュ バッファにアクセスできます。
アプリは、xrGetHandMeshANDROID を初めて呼び出す前に、セッション中に少なくとも 1 回 xrBeginFrame を呼び出す必要があります。
アプリは、XrHandMeshANDROID::indexCount と XrHandMeshANDROID::vertexCount を使用してハンドメッシュ バッファにアクセスし、フレームごとに xrGetHandMeshANDROID を呼び出すときにレンダリング ループで再利用する必要があります。
有効な使用方法(暗黙的)
- xrGetHandMeshANDROID を呼び出す前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 handMeshTrackerは有効な XrHandMeshTrackerANDROID ハンドルである必要があります。getInfoは、有効な XrHandMeshGetInfoANDROID 構造体へのポインタである必要があります。handMeshesは XrHandTrackingMeshesANDROID 構造体へのポインタである必要があります。
戻りコード
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_RUNTIME_FAILUREXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_HANDLE_INVALIDXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_TIME_INVALID
XrHandMeshGetInfoANDROID は、ハンドメッシュ データを取得するために必要な情報を記述します。
typedef struct XrHandMeshGetInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
} XrHandMeshGetInfoANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextはNULLまたは構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。baseSpaceは、頂点の変換をtimeに配置する参照空間を定義する XrSpace です。timeは、アプリケーションがハンドメッシュをクエリする時刻を記述するXrTimeです。
有効な使用方法(暗黙的)
- XrHandMeshGetInfoANDROID を使用する前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 typeはXR_TYPE_HAND_MESH_GET_INFO_ANDROIDにする必要があります。nextはNULLであるか、構造体チェーンの次の構造体への有効なポインタである必要があります。baseSpaceは有効な XrSpace ハンドルである必要があります。
XrHandTrackingMeshesANDROID 構造体には、両手のメッシュデータが含まれています。
typedef struct XrHandTrackingMeshesANDROID {
XrStructureType type;
void* next;
XrHandMeshANDROID leftHandMesh;
XrHandMeshANDROID rightHandMesh;
} XrHandTrackingMeshesANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextはNULLまたは構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。leftHandMeshは左手の XrHandMeshANDROID です。rightHandMeshは、右手の XrHandMeshANDROID です。
有効な使用方法(暗黙的)
- XrHandTrackingMeshesANDROID を使用する前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 typeはXR_TYPE_HAND_TRACKING_MESHES_ANDROIDにする必要があります。nextはNULLであるか、構造体チェーンの次の構造体への有効なポインタである必要があります。leftHandMeshは有効な XrHandMeshANDROID 構造である必要があります。rightHandMeshは有効な XrHandMeshANDROID 構造である必要があります。
XrHandMeshANDROID 構造体には、1 つの手に対して xrGetHandMeshANDROID 関数からハンドメッシュ トラッキング データを受信するためのデータとバッファが含まれています。
typedef struct XrHandMeshANDROID {
XrBool32 isActive;
XrTime dynamicLastUpdateTime;
uint32_t indexCount;
uint32_t vertexCount;
const uint32_t* indices;
const XrVector2f* textureUVs;
const XrVector3f* positions;
const XrVector3f* normals;
XrPosef baseSpaceFromVertexSpace;
} XrHandMeshANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextはNULLまたは構造体チェーンの次の構造体へのポインタです。コア OpenXR またはこの拡張機能では、そのような構造は定義されていません。isActiveは、現在のハンドメッシュ トラッカーがアクティブで、メッシュデータが有効かどうかを示すXrBool32です。dynamicLastUpdateTimeは、動的バッファが最後に更新された時刻を指定するXrTimeです。indexCountは、ハンドメッシュのindicesの数として機能するuint32_tです。vertexCountは、ハンドメッシュのpositionsの数として機能するuint32_tです。システムでサポートされている場合、textureUVsまたはnormalsにも使用できます。indicesは、反時計回りのワインダー順序で三角形のメッシュ インデックスを表すuint32_tの配列です。参照される値の数はindexCountです。textureUVsは、頂点テクスチャ座標を表すNULLまたはXrVector2fの配列です。参照される値の数はvertexCountです。positionsは、baseSpaceFromVertexSpaceの頂点位置を表すXrVector3fの配列です。参照される値の数はvertexCountです。normalsは、baseSpaceFromVertexSpaceの頂点法線を表すNULLまたはXrVector3fの配列です。参照される値の数はvertexCountです。baseSpaceFromVertexSpaceは、xrGetHandMeshANDROID を呼び出すときに XrHandMeshGetInfoANDROID::baseSpace にある頂点 XrSpace です。アプリケーションは、レンダリング中にメッシュ頂点と法線の座標空間を変換するためにこれを使用することができます。
手のメッシュは三角形リストで表され、各三角形の頂点は、手から外側から見た場合、反時計回りの順序になっています。
返された isActive 値が XR_FALSE の場合、手はアクティブにトラッキングされていません。たとえば、手がセンサーの範囲外にある場合、入力フォーカスがアプリから奪われた場合、またはアプリにハンド トラッキング データにアクセスする権限がない場合があります。
返された isActive 値が XR_TRUE の場合、indices と positions で表されるハンド トラッキング メッシュ(システムでサポートされている場合の textureUVs と normals を含む)は、xrGetHandMeshANDROID 関数に渡された XrHandMeshGetInfoANDROID::time の最新データに更新されます。
XrHandMeshANDROID で返されるハンドメッシュ バッファが指すメモリは、ランタイムが所有し、アプリケーションと共有されます。XrHandMeshTrackerANDROID ハンドルが有効な間は、xrBeginFrame の次の呼び出しまで、どのスレッドからでもメモリに安全にアクセスできます。
indicesとtextureUVsが指す値は動的ではありません- ポインタと、
positionsとnormalsが指す値は動的であり、xrBeginFrame の呼び出し間で両方とも変更される可能性があります。アプリはdynamicLastUpdateTimeを使用して、最後のフレームから値が変更されたかどうかを確認し、変更がない場合、不要なデータ処理を回避できます。
有効な使用方法(暗黙的)
- XrHandMeshANDROID を使用する前に、
XR_ANDROID_hand_mesh拡張機能を有効にする必要があります。 indicesは有効なuint32_t値へのポインタである必要があります。textureUVsは、有効な XrVector2f 構造体へのポインタである必要があります。positionsは、有効な XrVector3f 構造体へのポインタである必要があります。normalsは、有効な XrVector3f 構造体へのポインタである必要があります。
ハンドメッシュ トラッキングのサンプルコード
次のサンプルコードは、レンダリング用にハンドメッシュ バッファにアクセスする方法を示しています。
XrInstance instance; // Created at app startup
XrSystemId systemId; // Received from xrGetSystem() at app startup
XrSession session; // Created at app startup.
XrSpace appPlaySpace; // Created at app startup.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateHandMeshTrackerANDROID xrCreateHandMeshTrackerANDROID; // previously initialized
PFN_xrDestroyHandMeshTrackerANDROID xrDestroyHandMeshTrackerANDROID; // previously initialized
PFN_xrGetHandMeshANDROID xrGetHandMeshANDROID; // previously initialized
// Inspect system capability
XrSystemHandMeshTrackingPropertiesANDROID handMeshTrackingProps = {
.type = XR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &handMeshTrackingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!handMeshTrackingProps.supportsHandMeshTracking) {
// hand mesh tracking is not supported.
return;
}
XrHandMeshTrackerCreateInfoANDROID trackerCreateInfo = {
.type = XR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROID
};
XrHandMeshTrackerANDROID handMeshTracker = XR_NULL_HANDLE;
CHK_XR(xrCreateHandMeshTrackerANDROID(
session, &trackerCreateInfo, &handMeshTracker));
// app update loop
while (true) {
// ...
// For every frame in frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
const XrTime time = frameState.predictedDisplayTime;
// ...
XrHandMeshGetInfoANDROID getInfo = {
.type = XR_TYPE_HAND_MESH_GET_INFO_ANDROID,
.baseSpace = appPlaySpace,
.time = time,
};
XrHandTrackingMeshesANDROID handMeshes = {
.type = XR_TYPE_HAND_TRACKING_MESHES_ANDROID
};
CHK_XR(xrGetHandMeshANDROID(handMeshTracker, &getInfo, &handMeshes));
if (handMeshes.leftHandMesh.isActive) {
// access vertex/index buffers for rendering.
}
// ...
// Finish frame loop
// ...
}
CHECK_XR(xrDestroyHandMeshTracker(handMeshTracker));
新しいオブジェクト タイプ
新しい列挙型定数
XrObjectType 列挙型が拡張され、次のように変更されました。
XR_OBJECT_TYPE_HAND_MESH_TRACKER_ANDROID
XrStructureType 列挙型が拡張され、次のように変更されました。
XR_TYPE_SYSTEM_HAND_MESH_TRACKING_PROPERTIES_ANDROIDXR_TYPE_HAND_MESH_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_HAND_MESH_GET_INFO_ANDROIDXR_TYPE_HAND_TRACKING_MESHES_ANDROID
新しい列挙型
新しい構造
- XrSystemHandMeshTrackingPropertiesANDROID
- XrHandMeshTrackerCreateInfoANDROID
- XrHandMeshGetInfoANDROID
- XrHandMeshANDROID
- XrHandTrackingMeshesANDROID
新機能
問題
変更履歴
- リビジョン 1、2024 年 9 月 10 日(Levana Chen)
- 最初の拡張機能の説明
OpenXR™ と OpenXR のロゴは、Khronos Group Inc. が所有する商標であり、中国、欧州連合、日本、英国で商標として登録されています。