Tổng quan về cách bật ảnh động trong ứng dụng

Định cấu hình bản dựng

Việc định cấu hình bản dựng để bật ảnh động trong ứng dụng bao gồm việc sửa đổi tệp build.gradle và nhập ảnh động vào dự án của bạn.

  1. Cập nhật build.gradle ứng dụng của bạn để hỗ trợ tính năng hiển thị mô hình ảnh động đã nhập bằng cách thêm phần phụ thuộc ảnh động Sceneform:

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. Nhập và xem trước *.fbx tệp ảnh động để lấy tệp *.sfb chứa mô hình đã nhập.

Sử dụng ảnh động trong thời gian chạy

Bạn có thể sử dụng thao tác thời gian chạy để:

Tạo một ảnh động kết xuất

Trong thời gian chạy, hãy sử dụng ModelRenderable.Builder để tải *.sfb và đính kèm vào một nút trong cảnh, như bạn thực hiện với mọi ModelRenderable:

  // Create the ModelRenderable.
  ModelRenderable.builder()
      .setSource(this, R.raw.andy)
      .build()
      .thenAccept(renderable -> andyRenderable = renderable)
      .exceptionally(
          throwable -> {
          Log.e(TAG, "Unable to load Renderable.", throwable);
          return null;
      });

  // Attach the ModelRenderable to the node in the scene.
  Node andyNode = new Node();
  andyNode.setParent(arFragment.getArSceneView().getScene());
  andyNode.setRenderable(andyRenderable);

Truy cập vào dữ liệu ảnh động

// Get the animation data called "andy_dance" from the `andyRenderable`.
AnimationData danceData = andyRenderable.getAnimationData("andy_dance");

Truy cập vào ảnh động dựa trên các siêu dữ liệu khác nhau

     // Get the animation name.
     danceData.getName();

Để truy xuất một phiên bản của dữ liệu ảnh động, hãy sử dụng các phương thức ModelRenderable.getAnimationData():

     // Access animations by index.
     numAnimations = andyRenderable.getAnimationDataCount();
     danceData = andyRenderable.getAnimationData(0);

Kiểm soát tính năng phát lại

Tạo ModelAnimator để điều khiển chế độ phát.

ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);

Sử dụng start() để phát lại ảnh động. Quá trình này sẽ tự động dừng ở cuối video.

andyAnimator.start();

Để lặp lại ảnh động, hãy sử dụng setRepeatCount()

andyAnimator.setRepeatCount(<number of repeats>)

(Không bắt buộc) Thêm toán tử ảnh động của tài sản

ModelAnimator mở rộng lớp Animator của Android, cho phép tương tác nhiều định dạng hơn, chẳng hạn như vòng lặp (loop), phản hồi sự kiện và bộ nội suy phi tuyến tính.

Sử dụng SkeletonNode để xác định và đính kèm mô hình vào các xương

Khi bạn đang làm việc với một trình kết xuất có chứa xương, hãy sử dụng lớp SkeletonNode để có quyền truy cập vào từng xương trong bộ xương bằng cách đính kèm các nút vào bộ xương. Điều này cho phép bạn "đính kèm" đối tượng vào xương hoặc kiểm soát vị trí của chúng.

Khi ảnh động đang phát, vị trí, tỷ lệ và hướng của nút đính kèm sẽ được SkeletonNode cập nhật từng khung. Việc đặt vị trí, tỷ lệ hoặc chế độ xoay của nút đính kèm sẽ ghi đè xương cho đến lần ảnh động được cập nhật vào lần tiếp theo.

Trong mẫu Animation, việc này được thực hiện bằng cách đính kèm Node chứa mô hình một chiếc mũ cho bộ xương đầu của Andy. Khi Andy làm ảnh động, chiếc mũ sẽ đội trên đầu.

Truy cập vào thông tin về xương

Để truy cập vào thông tin về xương trong một ModelRenderable, hãy sử dụng các phương thức getBoneCount(), getBoneName() hoặc getBoneParent():

// Get the number of bones in the model’s skeleton.
andyRenderable.getBoneCount();

// Get the names of the bones in the model’s skeleton.
andyRenderable.getBoneName();

// Get the hierarchy of the bones in the model’s skeleton.
andyRenderable.getBoneParent();

Làm việc với SkeletonNode giây

Lớp SkeletonNode hiển thị bộ xương của một mô hình để đính kèm các nút vào các bộ xương cụ thể.

Để sử dụng SkeletonNode, hãy tạo một thực thể mới của thực thể đó và đặt kết xuất đồ hoạ thành có thể kết xuất chứa một mô hình có bộ xương.

 andyWithSkeleton = new SkeletonNode();
 andyWithSkeleton.setRenderable(andyRenderable);
 andyWithSkeleton.setParent(scene);

Để đính kèm một kết xuất vào một xương cụ thể, trước tiên, hãy tạo một nút mới và đính kèm nút đó vào xương. Thêm nút chứa nội dung hiển thị làm phần tử con của nút đầu tiên. Để đảm bảo rằng tỷ lệ và độ xoay của xương không được dùng để đặt lượt chuyển đổi tương đối của các nút, hãy nhớ đặt lại tỷ lệ và vị trí của nút thứ hai.

 hatNode = new Node();
 Node boneNode = new Node();
 boneNode.setParent(andy);
 andy.setBoneAttachment(HAT_BONE_NAME, boneNode);
 hatNode.setRenderable(hatRenderable);
 hatNode.setParent(boneNode);
 hatNode.setWorldScale(Vector3.one());
 hatNode.setWorldRotation(Quaternion.identity());
 Vector3 pos = hatNode.getWorldPosition();