ภาพรวมของการเปิดใช้ภาพเคลื่อนไหวในแอปของคุณ

การกําหนดค่าบิวด์

การกําหนดค่าบิวด์เพื่อเปิดใช้ภาพเคลื่อนไหวในแอปจะต้องมีการแก้ไขไฟล์ build.gradle และนําเข้าภาพเคลื่อนไหวในโปรเจ็กต์

  1. อัปเดต app's build.gradle เพื่อรองรับโมเดลภาพเคลื่อนไหวที่นําเข้าซึ่งแสดงผลได้ โดยเพิ่มทรัพยากร Dependency ของภาพเคลื่อนไหวในโหมด Sceneform ดังนี้

     dependencies {
         …
         // Support for animated model renderables.
         implementation "com.google.ar.sceneform:animation:1.15.0"
         }
    
  2. นําเข้าและดูตัวอย่างไฟล์ภาพเคลื่อนไหว *.fbx ไฟล์ เพื่อรับไฟล์ *.sfb ที่มีโมเดลที่นําเข้า

การใช้ภาพเคลื่อนไหวขณะรันไทม์

ใช้การดําเนินการรันไทม์เพื่อทําสิ่งต่อไปนี้

การสร้างภาพเคลื่อนไหวที่แสดงผลได้

ระหว่างรันไทม์ ให้ใช้ ModelRenderable.Builder เพื่อโหลด *.sfb และแนบโหนดนั้นไปยังโหนดในโหมด เช่นเดียวกับที่ทํากับ 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);

เข้าถึงข้อมูลภาพเคลื่อนไหว

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

การเข้าถึงภาพเคลื่อนไหวโดยอิงตามข้อมูลเมตาที่แตกต่างกัน

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

ดึงข้อมูลอินสแตนซ์ของภาพเคลื่อนไหวโดยใช้เมธอด ModelRenderable.getAnimationData() ดังนี้

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

ควบคุมการเล่น

สร้าง ModelAnimator เพื่อควบคุมการเล่น

ModelAnimator andyAnimator = new ModelAnimator(danceData, andyRenderable);

ใช้ start() เพื่อเล่นภาพเคลื่อนไหว ซึ่งจะหยุดโดยอัตโนมัติในช่วงท้าย

andyAnimator.start();

ใช้ setRepeatCount() เพื่อวนซ้ําภาพเคลื่อนไหว

andyAnimator.setRepeatCount(<number of repeats>)

(ไม่บังคับ) เพิ่มการดําเนินการภาพเคลื่อนไหวของพร็อพเพอร์ตี้

ModelAnimator ช่วยขยายคลาส Android Animator ทําให้มีการโต้ตอบที่สมบูรณ์ยิ่งขึ้น เช่น การวนซ้ํา การตอบสนองต่อเหตุการณ์ และตัวแทรกที่ไม่ใช่เชิงเส้น

การใช้ SkeletonNode เพื่อระบุและแนบแบบจําลองเข้ากับกระดูก

เมื่อคุณทํางานกับภาพแสดงผลที่มีกระดูก ให้ใช้คลาส SkeletonNode เพื่อเข้าถึงกระดูกส่วนบุคคลในโครงกระดูกโดยการแนบโหนดกับกระดูก ซึ่งจะช่วยให้คุณสามารถ "แนบ" วัตถุเข้ากับกระดูกหรือควบคุมตําแหน่งของวัตถุเหล่านั้น

ขณะเล่นภาพเคลื่อนไหว ระบบจะอัปเดตตําแหน่ง การปรับขนาด และการวางแนวของโหนดที่แนบโดย SkeletonNode แต่ละเฟรม การตั้งค่าตําแหน่ง สัดส่วน หรือการหมุนของโหนดที่ต่อเชื่อมจะลบล้างกระดูกจนกว่าภาพเคลื่อนไหวจะอัปเดตกระดูกในครั้งถัดไป

ในตัวอย่างภาพเคลื่อนไหว ขั้นตอนนี้ทําได้โดยการแนบ Node ที่มีโมเดลหมวกกับกระดูกสําหรับ "หัว" ของ Andy เมื่อ Andy เคลื่อนไหว หมวกจะอยู่บนศีรษะของคุณ

เข้าถึงข้อมูลเกี่ยวกับกระดูก

หากต้องการเข้าถึงข้อมูลเกี่ยวกับกระดูกใน ModelRenderable ให้ใช้วิธีการ getBoneCount(), getBoneName() หรือ 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();

การทํางานกับ SkeletonNode

คลาส SkeletonNode จะแสดงโครงกระดูกของโมเดลเพื่อแนบโหนดเข้ากับกระดูกชิ้นใดชิ้นหนึ่ง

หากต้องการใช้ SkeletonNode ให้สร้างการเริ่มต้นใหม่ และตั้งค่าการแสดงผลได้แบบแสดงผลที่มีโมเดลซึ่งมีโครงกระดูก

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

หากต้องการแนบการแสดงผลที่แสดงผลกับกระดูกหนึ่งๆ ให้สร้างโหนดใหม่และแนบกับกระดูกก่อน เพิ่มโหนดที่มีไฟล์ Manifest เป็นโหนดย่อยของโหนดแรก หากต้องการแน่ใจว่าได้ปรับขนาดและการหมุนของกระดูกในการตั้งค่าการแปลงแบบสัมพัทธ์ของโหนด ให้ตรวจสอบว่าได้รีเซ็ตขนาดและตําแหน่งของโหนดที่ 2

 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();