Hướng dẫn dành cho nhà phát triển về Vị trí tức thì cho Unity

Tìm hiểu cách sử dụng API Vị trí tức thì trong ứng dụng của riêng bạn.

Điều kiện tiên quyết

Đảm bảo bạn nắm được các khái niệm cơ bản về thực tế tăng cường và cách định cấu hình phiên ARCore trước khi tiếp tục.

Hướng dẫn này giả định rằng bạn đã cài đặt và định cấu hình Unity. Nếu không, hãy xem phần Bắt đầu nhanh cho Android của Unity để biết các bước cài đặt và thiết lập.

Định cấu hình một phiên mới với Vị trí tức thì

Định cấu hình ứng dụng của bạn bằng cách tạo cấu hình phiên mới và thiết lập chế độ Vị trí tức thì.

  1. Trong Unity, hãy tạo một cấu hình phiên mới cho ứng dụng ARCore (Assets > Create > GoogleARCore > SessionConfig).
  2. Trong cấu hình phiên, hãy chọn Chế độ vị trí tức thì.

    Giá trị mặc định cho Chế độ vị trí tức thìTắt. Vị trí tức thì hiện chỉ hỗ trợ chế độ Local Y Up.

  3. Chọn ARCore Device (Thiết bị ARCore) trong hệ thống phân cấp dự án.

  4. Nhấp đúp vào trường Cấu hình phiên hoạt động rồi chọn SessionConfig đã tạo trước đó.

Đặt một đối tượng

Trong một phiên ARCore mới, hãy thực hiện một thử nghiệm nhấn bằng cách sử dụng Frame.RaycastInstantPlacement. Sau đó, hãy tạo một Neo mới bằng cách sử dụng hàm InstantLocationPoint từ Trackable của kết quả lượt truy cập.

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

Vị trí tức thì hỗ trợ theo dõi không gian màn hình, tự động chuyển sang theo dõi đầy đủ sau khi điểm Vị trí tức thì được neo vào thế giới thực. Truy xuất tư thế hiện tại bằng InstantPlacementPoint.Pose. Nhận phương thức theo dõi hiện tại bằng InstantPlacementPoint.TrackingMethod.

Mặc dù ARCore có thể thực hiện các thử nghiệm nhấn vào Vị trí tức thì dựa trên hướng của bất kỳ hướng nào, nhưng kết quả truy cập sẽ luôn trả về một tư thế có +Y lên, chống lại hướng của trọng lực. Trên các nền tảng ngang, các kiểm thử lượt truy cập sẽ trả về vị trí chính xác nhanh hơn nhiều.

Giám sát phương pháp theo dõi điểm Vị trí tức thì

Nếu ARCore có tư thế 3D chính xác, thì InstantPlacementPointTrackingMethod sẽ là FullTracking. Nếu không, quá trình này sẽ bắt đầu bằng ScreenspaceWithApproximateDistance và chuyển đổi sang FullTracking khi ARCore có tư thế 3D chính xác. Phương thức theo dõi sẽ không chuyển về ScreenspaceWithApproximateDistance sau khi phương thức theo dõi là FullTracking.

Chuyển đổi phương thức theo dõi mượt mà

Kiểu này sẽ tự động sửa khi phương thức theo dõi của InstantPlacementPoint thay đổi từ khoảng cách gần đúng thành theo dõi đầy đủ. Khi điều này xảy ra, đối tượng sẽ nhảy.

Khi phương thức theo dõi thay đổi từ ScreenspaceWithApproximateDistance trong một khung, thành FullTracking trong khung tiếp theo, tư thế này sẽ chuyển từ vị trí ban đầu dựa trên khoảng cách ước chừng được cung cấp tới vị trí mới ở khoảng cách chính xác.

Việc thay đổi tức thì tư thế này sẽ thay đổi tỷ lệ rõ ràng của mọi đối tượng được liên kết với InstantPlacementPoint. Tức là một đối tượng sẽ đột ngột xuất hiện lớn hơn hoặc nhỏ hơn so với trong khung trước.

Đoạn mã sau đây cho biết cách tránh chuyển hình ảnh bằng cách nội suy tư thế theo thời gian, từ khung cuối cùng báo cáo ScreenspaceWithApproximateDistance cho đến tư thế mới từ báo cáo khung FullTracking.

Để tránh việc đột ngột thay đổi tư thế hiển thị, hãy nội suy khoảng không quảng cáo hiện tại của đối tượng ảo và 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;
  }
}