เมื่อทำงานกับโมเดล 3 มิติ Jetpack XR SDK จะรองรับมาตรฐานเปิด glTF
2.0 เมื่อ Android XR แสดงผลแอปที่สร้างด้วย Jetpack XR SDK โมเดล 3 มิติจะแสดงผลด้วยเทคนิคการแสดงผลตามหลักการทางกายภาพ(PBR) ที่ระบุไว้ในมาตรฐาน glTF 2.0 (พร้อมกับส่วนขยายที่รองรับ) เครื่องมือสร้างเนื้อหาดิจิทัล (DCC) ส่วนใหญ่ เช่น Autodesk Maya, Maxon ZBrush, Blender และ Spline สามารถส่งออกโมเดล 3 มิติเป็นรูปแบบ glTF (ไฟล์ .gltf หรือ .glb) ได้
หากผู้ใช้หรือแอปของคุณระบุSpatialEnvironment สกายบ็อกซ์ โมเดล 3 มิติจะสว่างขึ้นด้วยข้อมูลแสงที่สกายบ็อกซ์ของสภาพแวดล้อมระบุ วัสดุสะท้อนแสงและไฮไลต์แบบกระจกจะสะท้อน
Skybox ของสภาพแวดล้อมด้วย หากเปิดใช้การส่งผ่านแล้ว แสง
เงา และไฮไลต์แบบกระจกจะอิงตามห้องที่สว่างเรียบง่ายซึ่งมี
แสงส่องทิศทางเดียว
ดูภาพรวมโดยย่อของวัสดุที่รองรับได้ที่คุณสมบัติ PBR ของ glTF ในเว็บไซต์ Khronos
แอปที่สร้างด้วย Jetpack XR SDK จะโหลดโมเดล 3 มิติได้ 2 วิธีหลักๆ ดังนี้
- โหลดลงใน
ActivitySpaceตามที่อธิบายไว้ในวางโมเดล 3 มิติลงในActivitySpace - ใช้ Scene Viewer ในตัวผ่าน Intent
วางโมเดล 3 มิติลงใน ActivitySpace
เมื่อมีไฟล์ glTF แล้ว ขั้นตอนถัดไปคือการเพิ่มไฟล์ลงในไดเรกทอรีชิ้นงาน
ใน Android Studio เราขอแนะนำให้สร้างไดเรกทอรี models เพื่อจัดระเบียบ
ประเภทเนื้อหาให้ดียิ่งขึ้น

หากต้องการโหลดโมเดล glTF ให้เรียกใช้ GltfModel.create()
val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))
ตอนนี้ระบบจะโหลดโมเดลลงในหน่วยความจำ แต่ยังไม่ได้แสดงผล หากคุณมีโมเดล 3 มิติจำนวนมากที่ต้องโหลดหรือโมเดลมีขนาดใหญ่ คุณควร โหลดโมเดลแบบไม่พร้อมกันล่วงหน้า วิธีนี้จะช่วยให้ผู้ใช้ไม่ต้องรอ โหลดโมเดลลงในหน่วยความจำ
เราต้องเพิ่ม glTF ลงใน ActivitySpace เรียกใช้
GltfModelEntity.create เพื่อสร้างเอนทิตีและวางลงใน
ActivitySpace แนวทางปฏิบัติแนะนำคือคุณควรตรวจสอบว่าแอปอยู่ในสถานะ
ที่อนุญาตให้ใช้ความสามารถเชิงพื้นที่
if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) { val gltfEntity = GltfModelEntity.create(session, gltfModel) }
ตอนนี้คุณควรเห็นโมเดล 3 มิติที่โหลดแล้วเมื่อเรียกใช้แอป

วางโมเดล 3 มิติลงใน Compose SceneCoreEntity
แม้ว่าคุณจะยังคงต้องโหลด glTF ลงในหน่วยความจำโดยใช้
GltfModel.create() แต่คุณก็สามารถวางโมเดล 3 มิติลงใน
SceneCoreEntity ได้หากสร้าง UI ด้วย Jetpack Compose สำหรับ XR
ดูที่ใช้ SceneCoreEntity เพื่อวางออบเจ็กต์ 3 มิติในเลย์เอาต์
สร้างภาพเคลื่อนไหวโมเดล 3 มิติ
โมเดล 3 มิติสามารถมีภาพเคลื่อนไหวฝังอยู่ได้ ซึ่งเป็นส่วนหนึ่งของข้อกำหนด glTF
Jetpack XR SDK รองรับภาพเคลื่อนไหวแบบโครงกระดูก (Rigged), แบบแข็ง และแบบเป้าหมายการเปลี่ยนรูป (Blend Shapes) นอกจากนี้ยังรองรับภาพเคลื่อนไหวของวัสดุที่สร้างด้วยKHR_animation_pointerส่วนขยาย glTF ด้วย
หากต้องการเล่นภาพเคลื่อนไหว ให้เรียกใช้ startAnimation() แล้วระบุชื่อของ
ภาพเคลื่อนไหว คุณระบุได้ว่าจะให้ภาพเคลื่อนไหววนซ้ำอย่างไม่สิ้นสุดหรือไม่
gltfEntity.startAnimation(loop = true, animationName = "Walk")
การเรียกใช้ startAnimation เป็นครั้งที่ 2 จะทำให้ภาพเคลื่อนไหวปัจจุบันหยุดลงและ
ภาพเคลื่อนไหวใหม่จะเริ่มขึ้น
คุณสามารถค้นหาสถานะปัจจุบันของภาพเคลื่อนไหวผ่าน
getAnimationState()
หากไม่มีชื่อภาพเคลื่อนไหวที่ระบุเมื่อเรียกใช้ startAnimation()
การเรียกใช้จะล้มเหลวโดยไม่มีข้อความใดๆ ภาพเคลื่อนไหวที่กำลังทำงานจะหยุด และ getAnimationState()
จะแสดงผล STOPPED
โหลดโมเดล 3 มิติโดยใช้ Scene Viewer
หากกำลังมองหาวิธีที่ง่ายที่สุดในการโหลดโมเดล 3 มิติที่มีความสามารถในการโต้ตอบขั้นพื้นฐาน คุณอาจเลือกใช้ Scene Viewer เหมือนกับที่ใช้ใน อุปกรณ์เคลื่อนที่ ความแตกต่างที่สำคัญระหว่าง Scene Viewer ใน Android XR กับในอุปกรณ์เคลื่อนที่คือ Scene Viewer รองรับเฉพาะพารามิเตอร์ URI ของไฟล์ที่ชี้ ไปยังไฟล์ glTF และจะไม่สนใจพารามิเตอร์อื่นๆ ทั้งหมด
Scene Viewer เป็นแอปแยกต่างหากที่เรียกใช้โดยใช้ Intent และทำงานในโหมด Full Space ด้วยเหตุนี้ เมื่อคุณเรียกใช้ฟังก์ชันนี้ แอปจะไม่ปรากฏอีกต่อไป และ Scene Viewer จะได้รับโฟกัส สภาพแวดล้อมที่คุณอาจเปลี่ยนแปลง จะได้รับการรีเซ็ตเป็นการตั้งค่าระบบของผู้ใช้
ตัวอย่างการใช้ Intent เพื่อดูไฟล์ glTF ใน Scene Viewer
บน Android XR มีดังนี้
val url = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Avocado/glTF/Avocado.gltf" val sceneViewerIntent = Intent(Intent.ACTION_VIEW) val intentUri = Uri.parse("https://arvr.google.com/scene-viewer/1.2") .buildUpon() .appendQueryParameter("file", url) .build() sceneViewerIntent.setData(intentUri) try { startActivity(sceneViewerIntent) } catch (e: ActivityNotFoundException) { // There is no activity that could handle the intent. }
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการโต้ตอบสำหรับ Scene Viewer ได้ในเอกสารประกอบการออกแบบโมเดล 3 มิติ
ส่วนขยาย glTF
Jetpack XR SDK รองรับส่วนขยาย glTF หลายรายการที่ขยายความสามารถของโมเดล 3 มิติ ความสามารถเหล่านี้พร้อมให้บริการผ่านทั้ง
GltfModelEntity และ Scene Viewer
KHR_animation_pointerKHR_draco_mesh_compressionKHR_lights_punctualKHR_materials_clearcoatKHR_materials_sheenKHR_materials_unlitKHR_materials_variantsKHR_mesh_quantizationKHR_texture_basisuKHR_texture_transformEXT_texture_webp