Open17

Babylon.jsのWebXR Hit Test FeatureでtestOnPointerDownOnlyフラグが効いていないかもしれないので調査

にー兄さんにー兄さん

Hit Testをtransientモードで使っているときに、なぜかtestOnPointerDownOnlyフラグが機能していない気がする
このフラグはIWebXRHitTestOptionLegacyインターフェースから継承されているもので、
HitTestLegacyの場合は考慮されている形跡があるものの、
HitTestでは何も記述されていないっぽい気がする

にー兄さんにー兄さん

WebXRHitTestとWebXRHitTestLegacyの実装を見比べてみる。
これらはどちらも、WebXRAbstractFeature抽象クラスを継承し、IWebXRHitTestFeatureインターフェースを実装している

IWebXRHitTestFeatureインターフェースはジェネリクスでhitTestの結果を返すResultの型を指定できる

にー兄さんにー兄さん

今回の焦点になっているのはonHitTestResultObservableというイベントなので、
それを内部でどのようにinvokeしているかを探ってみる

にー兄さんにー兄さん

WebXRHitTestLegacyでは、

permanentモードの場合はそもそもlegacyの場合はpermanentとtransientの区別ではなさそう

_onXRFrame()内でWebXRHitTestLegacy.XRHitTestWithRayという
非同期なstatic関数が呼び出される
その結果を受け取って、_onHitTestResults()関数が呼び出され、
その中でonHitTestResultObservable.notifyによって発火する

testOnPointerDownOnlyがtrueの場合、
attach()の時点でXRSession.addEventListner()
でイベント登録される

にー兄さんにー兄さん

かつ、onXRFrameではPointer down onlyフラグが立っているときは処理をしないようになっていた

にー兄さんにー兄さん

ユースケースに関する文書があった
もしかしたら自分が目標にしていたのはselect_startとかだったのかもしれない

にー兄さんにー兄さん

これまでの調査で、

  • HitTestOptionsはlegacyを継承している
  • しかしkegacyで使われていたtestOnPointerDownOnlyフラグは考慮されていないというか別のシステムに置き換わっている
  • しかしその命名のせいで誤解が生じている
  • オプションを廃止するかselect_starのときにのみ発火する実装にするかの提案がしたい

ということで、ここからは挙動の提案をすべく
そのための実装を進めていきたい

にー兄さんにー兄さん

具体的には、testOnPointerDownOnlyフラグが立っているときは
スクリーンをタッチした瞬間のみ発火するように実装する

にー兄さんにー兄さん

Babylon.js/packages/dev/coreに移動してyarn buildしたうえでyarn link
すると@dev/coreなる名前でSymLinkが作成された

これを作業ディレクトリでyarn link "@dev/core"することでインポート出来た。なるほど