ハンドトラッキングサンプル
WebXR Hand Tracking APIを使った基本的なジェスチャー認識の実装例です。
概要
この実験では、Meta Quest 3/ProのハンドトラッキングAPIを使用して、以下のジェスチャーを検出します:
- ピンチジェスチャー (親指と人差し指)
- グラブジェスチャー (手を握る)
- ポイントジェスチャー (人差し指を伸ばす)
技術仕様
使用API
XRSession.requestReferenceSpace('local')XRFrame.getJointPose()XRHandインターフェース
ブラウザ対応
- Chrome 112+ (Android)
- Quest Browser 112+
必要なフィーチャー
navigator.xr.requestSession("immersive-vr", {
requiredFeatures: ["hand-tracking"],
});実装のポイント
1. ハンドトラッキングの初期化
セッション作成時に hand-tracking フィーチャーをリクエストします。
const session = await navigator.xr.requestSession("immersive-vr", {
requiredFeatures: ["hand-tracking"],
});2. ジョイント位置の取得
各フレームで、手のジョイント位置を取得します。
const inputSource = session.inputSources[0];
if (inputSource.hand) {
const indexTip = inputSource.hand.get("index-finger-tip");
const thumbTip = inputSource.hand.get("thumb-tip");
if (indexTip && thumbTip) {
const indexPose = frame.getJointPose(indexTip, referenceSpace);
const thumbPose = frame.getJointPose(thumbTip, referenceSpace);
// ピンチ判定
}
}3. ジェスチャー判定
ジョイント間の距離でジェスチャーを判定します。
function detectPinch(indexPose, thumbPose) {
const distance = indexPose.transform.position.distanceTo(
thumbPose.transform.position,
);
return distance < 0.03; // 3cm以内でピンチと判定
}学んだこと
- ジョイント追跡の精度: Quest 3は非常に高精度なトラッキングを提供
- パフォーマンス: 25個のジョイント × 両手 = 50個のポーズ計算が毎フレーム必要
- ジェスチャー検出の閾値: 環境や手の大きさによって調整が必要
参考リンク
デモ
実際のデモは demo.bangeo.net で体験できます。