LoginSignup
2
2

More than 1 year has passed since last update.

MetaQuest2 + A-Frame / BabylonJsを使ったhandtracking

Last updated at Posted at 2022-06-27

はじめに

MetaQuest2を使っていて、非常に驚くのがhandtrackingの操作感で、モノを手にとったり、投げたり、
ペンを持ったりと、非常にリアルにできています。
Metaの動画の中にも、"I mean the human hand is an engineering marvel"という風に述べられていて、
( https://youtu.be/Uvufun6xer8?t=2770 )
ARやVRにおいて、手というものの表現に非常に力がいられているのだなと感じました。
MyoSuiteとよばれる正確に人間の骨格を補足し、アバターに反映するようなテクノロジーなども話題になっています。
https://tech.fb.com/artificial-intelligence/2022/05/myosuite/
https://japan.cnet.com/article/35187871/
とはいえ、まず、HandTrackingがどのようなものなのかを、手軽に体験するにはどういった方法があるか調べていました。

Webでhandtrackingを実装する

WebでHandtrackingコンテンツを作成するためには、いくつかのSDKを利用することで、簡単に体験することができます。
今回は、A-FrameとBabyonJSの2種類を使いました。
A-Frameの方は、過去にもARコンテンツを実装するために利用していたので、期待していたのですが、
handtrackingまわりのバージョンの追従に対して、物理演算系のSDKのバージョンが追従しきれていないなど、
いくつかのハマりポイントがありました。
handtrackingなどのVRを主に考える場合には、BabylonJSの方がよいのかも?と思いながら、いろいろ試しています。

1.A-Frame
2.Babylonjs
3.Handtrack.js
4.WebVR Boilerplate
5.Unity + WebVR

#1.A-Frameの場合

https://aframe.io/docs/1.1.0/components/hand-tracking-controls.html
https://aframe.io/docs/1.2.0/components/hand-tracking-controls.html

##handtrackingの有効化

<html>
  <head>
    <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-entity id="leftHand" hand-tracking-controls="hand: left;"></a-entity>
      <a-entity id="rightHand" hand-tracking-controls="hand: right;"></a-entity>
      <a-sky color="#4CC3D9"></a-sky>
    </a-scene>
  </body>
</html>


// 手の表示をドットにするには、modelStyleを適用
 <a-entity id="leftHand" hand-tracking-controls="hand: left; modelStyle: dots;">

HandTrackingEventを利用する

var rightHand = document.getElementById('rightHand');

rightHand.addEventListener('pinchmoved', function (event) {
  var sphere = document.getElementById('sphere');
  sphere.setAttribute('position', event.detail.position);
});

ジェスチャーを検知する

var bones = rightHand.components['hand-tracking-controls'].bones;

gltf or obj ?

A-Frameでは、glTFを推奨とのこと
We recommend glTF for distributing assets in production over the web.

https://aframe.io/docs/1.3.0/components/gltf-model.html
https://aframe.io/docs/1.3.0/primitives/a-obj-model.html

スクリーンショット 2022-06-23 10.27.02.png

デバッグ

バグなど

physics

A-Frameの1.2.0 1.3.0で、Physicsを使う場合にうまく動作しない...。
これは既知のバグであるとのこと。
https://aframe.wiki/en/physics
https://aframe.io/docs/1.3.0/introduction/html-and-primitives.html#example-1
1.2.0ではThree.Geometryのpolyfillを利用すればok

手がぐにゃぐにゃ

  <script src="https://cdn.jsdelivr.net/gh/mrdoob/three.js@r134/examples/js/deprecated/Geometry.js"></script>

2.BabylonJSの場合

##XR体験を有効にする

const createScene = async function(engine) {
    const scene = new BABYLON.Scene(engine);

    const alpha =  3*Math.PI/2;
    const beta = Math.PI/50;
    const radius = 220;
    const target = new BABYLON.Vector3(0, 0, 0);

    const camera = new BABYLON.ArcRotateCamera("Camera", alpha, beta, radius, target, scene);
    camera.attachControl(canvas, true);

    const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene);
    light.intensity = 0.6;

    const xrHelper = await scene.createDefaultXRExperienceAsync();

    return scene;
}

##ハンドトラッキングを有効化する

  const xrHelper = await scene.createDefaultXRExperienceAsync();
  const featuresManager = xrHelper.baseExperience.featuresManager;

  featuresManager.enableFeature(BABYLON.WebXRFeatureName.HAND_TRACKING, "latest", {
      xrInput: xrHelper.input,
      jointMeshes: {
          disableDefaultHandMesh: true,
          enablePhysics: true
      }
  });

その他

Oculus Browserのflag設定

Oculus Browswerでハンドトラッキングを利用するために、試験ツールの機能をonにする必要があります。

1.アドレスバーに chrome://flags と入力
2.検索でhandと入力する
3.WebXR experiences with hand and joints trackingを有効にする

Image from iOS (86).jpg

demo

参考

https://github.com/KhronosGroup/glTF-Sample-Models
https://aframe.io/examples/showcase/handtracking/

WebXR - Hand Tracking Examples
https://webxr-handtracking.vercel.app/

[Babylon.js + Handtracking]

Class WebXRHandTracking
https://doc.babylonjs.com/typedoc/classes/BABYLON.WebXRHandTracking
https://forum.babylonjs.com/t/hand-tracking-support-for-webxr/12724
https://zenn.dev/iwaken71/scraps/8ec50f8a577174
https://zenn.dev/iwaken71/articles/babylonjs-webxr-handtracking

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2