เมื่อทำงานกับโมเดล 3 มิติ Jetpack XR SDK จะรองรับมาตรฐานแบบเปิด glTF 2.0 เมื่อ Android XR แสดงผลแอปที่สร้างด้วย SDK ของ Jetpack XR ระบบจะแสดงผลโมเดล 3 มิติด้วยเทคนิคการแสดงผลตามหลักฟิสิกส์(PBR) ที่ระบุไว้ในมาตรฐาน glTF 2.0 (พร้อมกับส่วนขยายที่รองรับ) เครื่องมือสร้างเนื้อหาดิจิทัล (dcc) ส่วนใหญ่ เช่น Autodesk Maya, Maxon ZBrush, Blender และ Spline สามารถส่งออกโมเดล 3 มิติเป็นรูปแบบ glTF (ไฟล์ .gltf
หรือ .glb
)
หากผู้ใช้หรือแอปของคุณระบุสภาพแวดล้อมแบบ SpatialEnvironment
ระบบจะจัดแสงโมเดล 3 มิติด้วยข้อมูลการจัดแสงจากสภาพแวดล้อมแบบ SpatialEnvironment
วัสดุที่สะท้อนแสงและจุดไฮไลต์ที่สะท้อนแสงจะสะท้อนสภาพแวดล้อมของกล่องท้องฟ้าด้วย หากเปิดใช้การส่งผ่าน การจัดแสง แสงสะท้อน และไฮไลต์ที่สะท้อนแสงจะอิงตามห้องที่สว่างและเรียบง่ายซึ่งมีแสงจากแหล่งกำเนิดแสงทิศทางเดียว
ดูภาพรวมโดยย่อของวัสดุที่รองรับได้ที่พร็อพเพอร์ตี้ PBR ของ glTF ในเว็บไซต์ Khronos
แอปที่สร้างด้วย Jetpack XR SDK มี 2 วิธีหลักในการโหลดโมเดล 3 มิติ
- โหลดโมเดลลงใน
ActivitySpace
ตามที่อธิบายไว้ในวางโมเดล 3 มิติลงในActivitySpace
- ใช้เครื่องมือดูฉากในตัวผ่าน Intent
วางโมเดล 3 มิติลงใน ActivitySpace
เมื่อคุณมีไฟล์ glTF แล้ว ขั้นตอนถัดไปคือการเพิ่มไฟล์นั้นลงในไดเรกทอรีเนื้อหาใน Android Studio เราขอแนะนำให้สร้างไดเรกทอรี models
เพื่อจัดระเบียบประเภทชิ้นงานให้ดียิ่งขึ้น
หากต้องการโหลดโมเดล glTF ให้เรียกใช้ GltfModel.create()
val gltfModel = GltfModel.create(session, "models/saturn_rings.glb").await()
เมื่อถึงจุดนี้ ระบบจะโหลดโมเดลลงในหน่วยความจํา แต่ยังไม่ได้แสดงผล หากคุณมีโมเดล 3 มิติจำนวนมากหรือโมเดลมีขนาดใหญ่ คุณควรโหลดโมเดลแบบไม่พร้อมกันล่วงหน้า วิธีนี้จะช่วยให้ผู้ใช้ไม่ต้องรอโหลดโมเดลของคุณลงในหน่วยความจำ
เราต้องเพิ่ม glTF ลงใน ActivitySpace
โทรไปที่ GltfModelEntity.create
เพื่อสร้างเอนทิตีและวางลงใน ActivitySpace
แนวทางปฏิบัติแนะนำคือให้ตรวจสอบว่าแอปอยู่ในสถานะที่เปิดใช้ความสามารถเชิงพื้นที่
if (session.scene.spatialCapabilities .hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT) ) { val gltfEntity = GltfModelEntity.create(session, gltfModel) }
ตอนนี้คุณควรเห็นโมเดล 3 มิติที่โหลดเมื่อเรียกใช้แอป
วางโมเดล 3 มิติลงในโวลุ่มการคอมโพส
แม้ว่าคุณจะยังคงต้องโหลด glTF ลงในหน่วยความจำโดยใช้ GltfModel.create()
แต่ก็สามารถวางโมเดล 3 มิติลงใน Volume
ได้หากสร้าง UI ด้วย Jetpack Compose สำหรับ XR โปรดดูใช้ปริมาตรเพื่อวางวัตถุ 3 มิติในเลย์เอาต์
เคลื่อนไหวโมเดล 3 มิติ
โมเดล 3 มิติสามารถฝังภาพเคลื่อนไหวได้ ซึ่งเป็นส่วนหนึ่งของข้อกำหนด glTF
Jetpack XR SDK รองรับภาพเคลื่อนไหวโครงกระดูก (การต่อโครง), การเคลื่อนไหวแบบคงที่ และการเคลื่อนไหวแบบเปลี่ยนรูปร่าง (การผสมรูปร่าง) นอกจากนี้ ยังรองรับภาพเคลื่อนไหวของวัสดุที่สร้างด้วยส่วนขยาย KHR_animation_pointer
glTF ด้วย
หากต้องการเล่นภาพเคลื่อนไหว ให้เรียกใช้ startAnimation()
และระบุชื่อภาพเคลื่อนไหว คุณเลือกได้ว่าจะให้ภาพเคลื่อนไหววนซ้ำอย่างไม่สิ้นสุดหรือไม่
gltfEntity.startAnimation(loop = true, animationName = "Walk")
การเรียกใช้ startAnimation
ครั้งที่สองจะทำให้ภาพเคลื่อนไหวปัจจุบันหยุดลงและภาพเคลื่อนไหวใหม่จะเริ่มขึ้น
คุณสามารถค้นหาสถานะปัจจุบันของภาพเคลื่อนไหวผ่าน getAnimationState()
หากไม่มีชื่อภาพเคลื่อนไหวที่ระบุเมื่อเรียกใช้ startAnimation()
การเรียกใช้จะไม่สำเร็จโดยอัตโนมัติ ภาพเคลื่อนไหวที่ทำงานอยู่จะหยุดลง และ getAnimationState()
จะแสดงผลเป็น STOPPED
โหลดโมเดล 3 มิติโดยใช้โปรแกรมดูฉาก
หากกำลังมองหาวิธีที่ง่ายที่สุดในการโหลดโมเดล 3 มิติที่โต้ตอบได้แบบพื้นฐาน คุณอาจเลือกใช้ Scene Viewer เช่นเดียวกับในอุปกรณ์เคลื่อนที่ ความแตกต่างที่สำคัญระหว่าง Scene Viewer ใน Android XR กับในอุปกรณ์เคลื่อนที่คือ Scene Viewer รองรับเฉพาะพารามิเตอร์ URI ของไฟล์ที่ชี้ไปยังไฟล์ glTF และจะละเว้นพารามิเตอร์อื่นๆ ทั้งหมด
เครื่องมือดูภาพเป็นแอปแยกต่างหากที่เรียกใช้โดยใช้ Intent และทำงานในโหมดพื้นที่ทำงานแบบเต็ม ดังนั้น เมื่อเรียกใช้ คุณจะไม่เห็นแอปอีกต่อไป และฟีเจอร์ 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. }
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการโต้ตอบสำหรับโปรแกรมดูฉากได้ที่เอกสารประกอบการออกแบบโมเดล 3 มิติ
ส่วนขยาย glTF
Jetpack XR SDK รองรับส่วนขยาย gfTF หลายรายการที่ขยายความสามารถของโมเดล 3 มิติ ความสามารถเหล่านี้พร้อมใช้งานทั้งผ่าน GltfEntity
และ Scene Viewer
KHR_animation_pointer
KHR_draco_mesh_compression
KHR_lights_punctual
KHR_materials_clearcoat
KHR_materials_sheen
KHR_materials_unlit
KHR_materials_variants
KHR_mesh_quantization
KHR_texture_basisu
KHR_texture_transform
EXT_texture_webp