Используйте размер обнаружения 8-й стены XR для масштабирования целевого объекта в Unity3D

Можно ли настроить размер размещаемой модели в зависимости от размера обнаруженного в реальном мире изображения? У меня есть картина, которую я дополняю моделью AR, которая заменяет картину после обнаружения изображения. Это должно идеально наложить картину. Это 45 сантиметров в ширину, и это предоставляется сценарию XRImageDetectionController. Когда я запускаю свое приложение, где целевое изображение видно в его истинных размерах (45 см х 28 см), эффект получается ожидаемым. В идеале я хотел бы иметь возможность продемонстрировать эту расширенную картину в различных условиях, где изображение в реальном мире может иметь другой размер (при неизменном соотношении сторон). Мое конкретное устройство - это Android-телефон, совместимый с ARCore.

1 ответ

Решение

В последнее время я начал использовать 8th Wall, но я еще не создал свой собственный проект (просто поиграл с демо и проверил исходный код), поэтому я не знаю 100%, будет ли это работать, но здесь идет:

Если вы посмотрите в 8-й стене XRDataTypes.cs файл, вы можете найти типы данных XRDetectionTexture, XRDetectionImage, а также XRDetectedImageTarget, Каждый из этих типов данных имеет некоторый экземпляр размерных полей.

XRDetectionTexture:

/**
 * A unity Texture2D that can be used as a source for image-target detection.
 */
[Serializable] public struct XRDetectionTexture {

[...]

  /**
   * The expected physical width of the image-target, in meters.
   */
  public float widthInMeters;

[...]
}

XRDetectionImage:

/**
 * Source image data for a image-target to detect. This can either be constructed manually, or
 * from a Unity Texture2d.
 */
public struct XRDetectionImage {
  /**
   * The width of the source binary image-target, in pixels.
   */
  public readonly int widthInPixels;

  /**
   * The height of the source binary image-target, in pixels.
   */
  public readonly int heightInPixels;

  /**
   * The expected physical width of the image-target, in meters.
   */
  public readonly float targetWidthInMeters;
  [...]
  }
}

XRDetectedImageTarget:

/**
 * An image-target that was detected by an AR Engine.
 */
public struct XRDetectedImageTarget {
  [...]

  /**
   * Width of the detected image-target, in unity units.
   */
  public readonly float width;

  /**
   * Height of the detected image-target, in unity units.
   */
  public readonly float height;
  [...]
}

Не сделав этого сам, я не могу дать вам примеры работающего кода, но документация 8-й стены, посвященная основам обнаружения изображений, кажется довольно приличной и фактически указывает на то, что экземпляр XRDetectedImageTarget передается в метод обратного вызова, указанный на обнаруженной модели (изображение скопировано из документации 8th Wall, 2019-01-18):

Таким образом, если вы знаете требуемое соотношение "модель-изображение" (то есть "ширина модели должна составлять половину ширины обнаруженного изображения"), то в обратном вызове вы сможете сделать что-то вроде:

//calculating the size ratio might be more difficult than this, assume this is pseudocode
var sizeRatio = xrDetectedImageTarget.width / xrDetectionImage.targetWidthInMeters;

var placedModel = Instantiate(prefabModel, newPosition, newRotation, parentTransform);
placedModel.transform.localScale = this.transform.localScale * sizeRatio;

Надеюсь, что это работает / помогает!

Другие вопросы по тегам