サイズと距離

Scaled Distance Unit(SDU)

ARアプリケーションでは、拡張オブジェクトのサイズをピクセルやそれに類似した計量単位で定義することはできません。地図アプリのような2次元アプリケーションとは異なり、オブジェクトのサイズはデバイスからオブジェクトまでの距離によって決まります。

ある特定の店舗上に配置された仮想的な2次元ロゴを想像してください。地図ベースのアプリケーションでは、ロゴの幅と高さをピクセル単位で指定することによってサイズを簡単に定義できます。ARアプリケーションでは、そのロゴの大きさは建物の大きさに合わせるのが一般的で、建物までの距離に合わせて大きさが変わるのが自然です。さらに、ロケーションベース型ARでは、拡張オブジェクトは遠く離れていても視認できる必要があります。これを実現するため、Wikitude SDKでは距離ベースのスケーリングが採用されています。

ピクセルなどの計量単位は静的に定義されており、ARアプリケーションではピクセルなどの単位を使用して拡張オブジェクトを意図したとおりに拡大/縮小することはできません。したがって、Scaled Distance Unit(SDU)がWikitude SDKに採用されました。SDUの定義は、拡張オブジェクトの静的に定義されたサイズではなくデバイスから対象のPOIデータまでの距離に関連しています。

ロケーションベース型AR(AR.GeoObject)で、拡張オブジェクトの高さを1SDUに設定した場合、対象のPOIデータがデバイスから10m離れた位置にあるとき、拡張オブジェクトは高さ1mの大きさで表示されます。拡張オブジェクトの幅を5SDUと設定した場合、対象のPOIデータがデバイスから10m離れた位置にあるとき、拡張オブジェクトは幅5mの大きさで表示されます。一方、画像認識型AR(AR.Trackable2DObject)では、SDUはターゲットのサイズを基に決まります。拡張オブジェクトのアンカーポイントがターゲットの中心に設定され、そのターゲットの高さが1SDUになります(下の図を参照)。

たとえば、0.25SDUに設定した円形の拡張オブジェクトをターゲットに拡張した場合、下の図のように、半径がターゲットの高さの1/4に設定された円が拡張されます。

Distance Based Scaling(DBS)

ARアプリケーションのもう1つの重要な概念は、"Distance Based Scaling"です。もう一度、ある特定の店舗上に配置された仮想的な2次元ロゴを想像してください。デバイスから10m離れた位置で店舗を見た場合、拡張オブジェクトの幅と高さが適切なSDUに設定されていれば、ロゴは建物に適切に拡張されます。次に、店舗から離れていく場合を考えます。DBSの概念がなければ、ロゴは急速に縮小し、小さすぎて確認できなくなります。これは特にSDUが小さい値に設定されているときに顕著に表れます。店舗に近づく場合も同様のことが起こります。ロゴはまたたくまに巨大になり、カメラビューいっぱいに表示されます。

このような状況を回避するために、Wikitude SDKではDistance Based Scaling(DBS)という概念が採用されました。これにより、拡張オブジェクトのサイズが設定したSDUを基準とした一定の限度内のサイズで表示されます。

Wikitude SDKにはscene.minScalingDistancescene.maxScalingDistanceの2つの値が定義されています。

scene.minScalingDistanceは、拡張オブジェクトがそれ以上拡大されない距離を定義するもので、デフォルトでは10mに設定されています。対象のPOIデータまでの距離が10mより小さい場合、カメラビュー上の拡張オブジェクトは一定のサイズに維持されます。これにより、拡張オブジェクトがカメラビューいっぱいに表示されることを避けることができます。

scene.maxScalingDistanceは、拡張オブジェクトがそれ以上縮小されない距離を定義するもので、デフォルトでは20kmに設定されています。対象のPOIデータまでの距離が20kmを超えた場合、カメラビュー上の拡張オブジェクトのサイズは20km時点の表示サイズと同じにサイズが維持されます。これにより、拡張オブジェクトが小さすぎて確認できなくなることを避けることができます。

拡張オブジェクトのscene.maxScalingDistanceのサイズはscene.minScalingDistance時点のサイズの10%に設定されるので、対象のPOIデータがデバイスから10m離れた位置にあるとき表示される拡張オブジェクトのサイズの10%よりも小さく表示されることはありません。

scene.minScalingDistanceからscene.maxScalingDistanceの間では、x^(0.2)のスケーリング関数に基づいて拡張オブジェクトがスケーリングされます。このスケーリング関数には、ユーザーが対象のPOIデータから離れた場合、拡張オブジェクトを急速に縮小する効果があります。ユーザーがさらに対象のPOIデータから離れた場合、サイズの縮小が徐々に穏やかになり、ユーザーにスムーズな印象を与えます。