ARKit – Важны ли значения, введенные для эталонных размеров изображения?

#swift #augmented-reality #scenekit #arkit

#swift #дополненная реальность #scenekit #arkit

Вопрос:

В ARKit я использую высоту и ширину эталонных изображений (которые я ввел в XCode в группе ресурсов AR) для наложения плоскостей одинакового размера на соответствующие изображения. Независимо от того, ввожу ли я точные размеры эталонного изображения, ARKit точно накладывает плоскость на реальный мир (т. Е. Плоскость правильно покрывает сопоставленное изображение в ARSCNView).

Если я правильно понимаю, estimatedScaleFactor сообщает мне разницу между истинным размером эталонного изображения и значениями, которые я ввел в группу ресурсов.

Мой вопрос в том, способен ли ARKit определять истинный размер объекта, показанного на эталонном изображении, когда / почему мне нужно беспокоиться о вводе точных значений высоты и ширины.

(Мои эталонные изображения являются общедоступными, и их точное измерение иногда затруднено.)

Должен ли ARKit работать усерднее или существуют сценарии, в которых я перестал бы получать хорошие результаты без точных измерений эталонного изображения?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: В качестве конкретного примера, если бы я сопоставлял постеры фильмов, я бы сфотографировал постер, загрузил его в группу ресурсов AR и произвольно установил ширину примерно в один метр (позволяя Xcode устанавливать другое измерение на основе пропорций изображения).).

Затем, когда ARKit соответствует изображению, я бы наложил на него плоскость в renderer(_:didAdd:for:)

 let plane = SCNPlane(width: referenceImage.physicalSize.width,
    height: referenceImage.physicalSize.height)
plane.firstMaterial?.diffuse.contents = UIColor.planeColor
        
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2

node.addChildNode(planeNode)
 

Похоже, это работает так, как хотелось бы — плоскость убедительно перекрывает сопоставленное изображение — несмотря на то, что размеры, которые я ввел для эталонного изображения, неточны. (И да, estimatedScaleFactor дает хорошее приближение к тому, насколько мои произвольные размеры отклонены.)

Итак, я пытаюсь понять, будет ли это нарушаться в некоторых сценариях (и когда, и что мне нужно узнать, чтобы понять, почему!). Если размеры моего эталонного изображения не точны, это негативно повлияет на размещение плоскостей или других объектов на узле, предоставленном ARKit?

Другими словами, если ARKit правильно понимает мир и эталонные изображения без точных измерений изображения ссылки, означает ли это, что я могу уйти, никогда не вводя точные измерения для изображений ссылки?

Ответ №1:

Как следует из официальной документации:

Значение по умолчанию estimatedScaleFactor (коэффициент между начальным размером и предполагаемым физическим размером) равно 1.0, что означает, что версия этого изображения, которое ARKit распознает в физической среде, точно соответствует его эталонному физическому размеру изображения. В противном случае ARKit автоматически корректирует преобразование привязки изображения, когда оцененный масштабный коэффициент имеет значение, отличное от 1,0. Эта корректировка, в свою очередь, корректирует понимание ARKit того, где находится привязка изображения в физической среде.

 var estimatedScaleFactor: CGFloat { get }
 

Для более точного масштабирования 3D-модели вам необходимо измерить ваше реальное изображение, и когда приложение AR будет запущено, ARKit измерит его наблюдаемое эталонное изображение. ARImageAnchor сохраняет значение estimatedScaleFactor свойства, таким образом, ARKit регистрирует разницу в масштабном коэффициенте, а затем применяет новый масштаб к 3D-модели, и ваша модель становится больше или меньше, то estimatedScaleFactor есть для.

Однако существует автоматическая методология:

Чтобы точно определить положение и ориентацию изображения в среде AR, ARKit должен знать физический размер изображения. Вы предоставляете эту информацию при создании эталонного AR-изображения в каталоге ресурсов вашего проекта Xcode или при программном создании ARReferenceImage.

Если вы хотите распознать версии эталонного изображения разного размера, вы устанавливаете automaticImageScaleEstimationEnabled значение true, и в этом случае ARKit игнорирует physicalSize .

 var automaticImageScaleEstimationEnabled: Bool { get set }
 

Комментарии:

1. Наверное, мне интересно, если / когда мой опыт будет нарушен без точных эталонных размеров изображения. Позвольте мне добавить немного к моему вопросу…

2. Ваш опыт не будет нарушен, он может быть скорее неточным, если вы не укажете physicalSize.

3. Энди, огромное спасибо за всю работу, которую ты вложил в ответы. Я многому научился из вашего вклада.