ヒットテスト

画面ロケーションを使い、現実世界の表面やオブジェクト上にポイントを見つける。

ヒットテストを有効にする

基本的にヒットテストの対象となるもの:

  • 特徴点

  • 推定プレーン

  • 既存プレーン

利用可能なタイプの一覧は ARHitTestResultType の値をご参照ください。

既存プレーンに対してヒットテストを行うには、プレーンを検知できるように ARSession を構成しておく必要があります。

void RunARSession(IARSession arSession)
{
  var config = ARWorldTrackingConfigurationFactory.Create();

  // Set to value other than PlaneDetection.None to enable
  // hit tests against detected planes
  config.PlaneDetection = PlaneDetection.Horizontal;

  arSession.Run(config);
}

ヒットテスト

IARFrame.HitTest メソッドを使用すると、画面上のあるピクセルが現実世界の要素と交差するかどうかを効率的に確認できます。

using Niantic.ARDK.AR.HitTest;

void SpawnAtHitPoint(IARSession arSession, Camera activeCamera, GameObject prefab, float verticalOffset)
{
    // Check if the user's touched the screen
    var touch = PlatformAgnosticInput.GetTouch(0);
    if (touch.phase != TouchPhase.Began)
        return;

    // If the ARSession isn't currently running, its CurrentFrame property will be null
    var currentFrame = arSession.CurrentFrame;
    if (currentFrame == null)
        return;

    // Hit test from the touch position
    var results =
        arSession.CurrentFrame.HitTest
        (
            activeCamera.pixelWidth,
            activeCamera.pixelHeight,
            touch.position,
            ARHitTestResultType.All
        );

    if (results.Count == 0)
        return;

    var closestHit = results[0];
    var position = closestHit.WorldTransform.ToPosition();

    // The position y-value offset needed to spawn your prefab at the
    // correct height (not intersecting with the plane) will depend on
    // where the center of your prefab is.
    position.y += verticalOffset;

    GameObject.Instantiate(prefab, position, Quaternion.identity);
}

注意:

  • 返される ARHitTestResults の配列は近いものから遠いものの順になります。

  • ARHitTestResultType.ExistingPlaneUsingExtent を除くすべての ARHitTestResultType の値は、バーチャルスタジオのモックでもリモートモードでもサポートされていません。