Используйте размер обнаружения 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;
Надеюсь, что это работает / помогает!