Узнайте, как использовать Instant Placement API в своих приложениях.
Предпосылки
Прежде чем продолжить, убедитесь, что вы понимаете основные концепции AR и как настроить сеанс ARCore .
В этом руководстве предполагается, что вы уже установили и настроили Unity. Если нет, ознакомьтесь с инструкциями по установке и настройке Unity Quickstart для Android .
Настройте новый сеанс с мгновенным размещением
Настройте свое приложение, создав новую конфигурацию сеанса и настроив режим мгновенного размещения.
- В Unity создайте новую конфигурацию сеанса для приложения ARCore ( Assets > Create > GoogleARCore > SessionConfig ).
В конфигурации сеанса выберите Instant Placement Mode .
Значение по умолчанию для Instant Placement Mode — Disabled . Instant Placement в настоящее время поддерживает только режим Local Y Up .
Выберите устройство ARCore в иерархии проекта.
Дважды щелкните поле Session Config и выберите
SessionConfig
созданный ранее.
Разместите объект
В новом сеансе ARCore выполните проверку попадания с помощью Frame.RaycastInstantPlacement . Затем создайте новый Anchor , используя позу InstantPlacementPoint из Trackable
результата попадания.
var hitList = new List<TrackableHit>();
TrackableHit hitRaycast;
bool hitResult = Frame.RaycastInstantPlacement(
position.x, position.y, approximateDistance, out hitRaycast);
if (hitResult) {
// Place a pin object at the hit.
var pinObject = Instantiate(PinPrefab, hitRaycast.Pose.position, hitRaycast.Pose.rotation);
// Cast the trackable to an InstantPlacementPoint if you want to
// retrieve the real time pose and tracking method. Otherwise, you
// can use it like any other Trackable.
InstantPlacementPoint instantPlacementPoint = hitRaycast.Trackable as InstantPlacementPoint;
// Create an Anchor using the InstantPlacementPoint.
Anchor anchor = instantPlacementPoint.CreateAnchor(hitRaycast.Pose);
// Automatically sync the virtual object’s pose with the Anchor’s
// pose in each frame.
pinObject.transform.parent = anchor.transform;
}
Мгновенное размещение поддерживает отслеживание пространства экрана , автоматически переключаясь на полное отслеживание, как только точка мгновенного размещения привязана к реальному миру. Получить текущую позу с помощью InstantPlacementPoint.Pose
. Получите текущий метод отслеживания с помощью InstantPlacementPoint.TrackingMethod
.
Хотя ARCore может выполнять тесты мгновенного размещения на поверхности с любой ориентацией, результаты попадания всегда будут возвращать позу с +Y вверх, против направления силы тяжести. На горизонтальных поверхностях тесты на попадание возвращают точные координаты гораздо быстрее.
Отслеживание метода отслеживания точки мгновенного размещения
Если ARCore имеет точную 3D-позу, InstantPlacementPointTrackingMethod
будет FullTracking
. В противном случае он начнется с ScreenspaceWithApproximateDistance
и перейдет к FullTracking
, как только ARCore получит точную 3D-позу. Метод отслеживания не вернется к ScreenspaceWithApproximateDistance
после того, как его метод отслеживания будет FullTracking
.
Плавный переход метода отслеживания
Поза автоматически корректируется, когда метод отслеживания InstantPlacementPoint
изменяется с приблизительного расстояния на полное отслеживание. Когда это происходит, объект прыгает.
Когда метод отслеживания меняется с ScreenspaceWithApproximateDistance
в одном кадре на FullTracking
в следующем кадре, поза будет переходить из исходного местоположения на основе предоставленного приблизительного расстояния в новое местоположение на точном расстоянии.
Это мгновенное изменение позы изменит видимый масштаб любых объектов, привязанных к InstantPlacementPoint
. То есть объект внезапно будет казаться больше или меньше, чем он был в предыдущем кадре.
В следующем коде показано, как избежать визуального скачка путем интерполяции позы с течением времени, от последнего кадра, сообщающего ScreenspaceWithApproximateDistance
, до новой позы из кадра, сообщающего FullTracking
.
Чтобы избежать внезапного видимого изменения позы, интерполируйте текущую позу виртуального объекта и InstantPlacementPoint.Pose
.
// Interpolate the pose for a specific duration. Start from the first frame that
// the tracking method changes. End after the transitionTime has
// passed transitionDuration.
if (previousTrackingMethod ==
InstantPlacementPointTrackingMethod.ScreenspaceWithApproximateDistance &&
instantPlacementPoint.TrackingMethod ==
InstantPlacementPointTrackingMethod.FullTracking) {
startTransition = true;
previousTrackingMethod = InstantPlacementPointTrackingMethod.FullTracking;
}
if (startTransition) {
transitionTime += Time.deltaTime;
float ratio = Mathf.Min(transitionTime, transitionDuration) / transitionDuration;
// Use a custom function to interpolate two poses based on the ratio. Here,
// LerpPose(Pose, Pose, float) is a generic interpolation function containing
// a current value, a target value, and an interpolation ratio.
var newPose = LerpPose(
new Pose(pinObject.transform.position, pinObject.transform.rotation),
instantPlacementPoint.Pose, ratio);
pinObject.transform.position = newPose.position;
pinObject.transform.rotation = newPose.rotation;
if (transitionTime >= transitionDuration) {
startTransition = false;
// Set the parent transform to be the Anchor created on the
// InstantPlacementPoint, so that it will automatically update the pose
// in future frames.
Anchor anchor = instantPlacementPoint.CreateAnchor(Pose.identity);
pinObject.transform.parent = anchor.transform;
}
}