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

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

1 Ответ

0 голосов
/ 18 января 2019

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

Если вы посмотрите файл 8th Wall 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;
  [...]
}

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

enter image description here

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

//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;

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

...