🧊

【threex-artoolkit】マーカーベースARで認識精度を調整する

2022/02/25に公開

株式会社palanのxR事業部で主にWebAR/VRの開発をしています、damiと申します。
この記事ではAR.js x Three.jsでマーカーベースARを開発する際に使用するthreex-artoolkitにて、
認識精度(オブジェクトの安定性)を調整する方法を備忘録的にまとめます。

前提: マーカー画像を選ぶ際の注意点

AR.js x Three.jsを扱う場合、QRコードをマーカーにするのは避けましょう!死にます。
(2022年2月現在)

▼こういうの

認識自体はできる(MarkerFoundのイベントは発火する)ので、認識を一瞬のトリガーとしてのみ用いるのはアリですが、上にオブジェクトを置きたい場合はとにかく安定しません…

この点AR.js x A-Frameだと安定するのでAR.js側の認識アルゴリズムが違うのか…
なにが原因なのかは不明です(この辺ご存知の方いたら教えてください…)

調整

オブジェクトの認識&レンダリング周りの調整は
ArToolkitContextArMarkerControlsのパラメーターの値をいじることで調整できます。

ArToolkitContextパラメータ

arToolkitContext = new THREEx.ArToolkitContext({
  cameraParametersUrl: THREEx.ArToolkitContext.baseURL + "../data/data/camera_para.dat",
  detectionMode: "mono",
  // debug: 認識しているか、認識精度どうかのテストをしたい時はここをtrueにする
  debug: false,
  // patternRatio: ここはARマーカー作った時のフチの幅に合わせる
  patternRatio: 0.65,
});

ArMarkerControlsパラメータ

const markerControls = new THREEx.ArMarkerControls(arToolkitContext, markerRoot, {
  type: "pattern",
  patternUrl: "hiro.patt",
  // minConfidence: 認識の際の正確度に閾値を設けられる
  // 小さい数字ほど visible = true になる可能性が上がるが、表示が安定しないリスクがある
  minConfidence: 0.001,
});

smoothedControls

smoothedControlsはマーカー認識のブレなどを補間できるパラメーターで、基本つけたほうが安定する印象。

let smoothedRoot = new THREE.Group();
scene.add(smoothedRoot);
smoothedControls = new THREEx.ArSmoothedControls(smoothedRoot, {
  lerpPosition: 0.4,
  lerpQuaternion: 0.3,
  lerpScale: 1,
});
arWorldRoot = smoothedRoot;
// マーカーの上に出すオブジェクトは全て 
// scene.add()ではなくarWorldRoot.add()するとsmoothが適用される
// 以下を毎フレーム
smoothedControls.update(markerRoot);

参考

ArToolkitContext, ArMarkerControlsのパラメーター詳細
https://ar-js-org.github.io/AR.js-Docs/marker-based/#threejs

smoothedControlsの参考

https://github.com/jeromeetienne/AR.js/blob/master/three.js/examples/mobile-performance.html

Discussion