การกําหนดค่าบิวด์
การกําหนดค่าบิวด์เพื่อเปิดใช้ภาพเคลื่อนไหวในแอปจะต้องมีการแก้ไขไฟล์ build.gradle
และนําเข้าภาพเคลื่อนไหวในโปรเจ็กต์
อัปเดต app's
build.gradle
เพื่อรองรับโมเดลภาพเคลื่อนไหวที่นําเข้าซึ่งแสดงผลได้ โดยเพิ่มทรัพยากร Dependency ของภาพเคลื่อนไหวในโหมด Sceneform ดังนี้dependencies { … // Support for animated model renderables. implementation "com.google.ar.sceneform:animation:1.15.0" }
นําเข้าและดูตัวอย่างไฟล์ภาพเคลื่อนไหว
*.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();