เมื่อทำงานกับโมเดล 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 Skybox โมเดล 3 มิติจะสว่างขึ้นด้วยข้อมูลแสงที่ได้จาก Skybox ของสภาพแวดล้อม วัสดุสะท้อนแสงและไฮไลต์แบบสะท้อนจะสะท้อนท้องฟ้าในสภาพแวดล้อมด้วย หากเปิดใช้การส่งผ่าน แสง การสะท้อน และไฮไลต์แบบสเปกิวลาร์จะอิงตามห้องที่สว่างซึ่งมีแสงแบบกำหนดทิศทางเพียงดวงเดียว
ดูภาพรวมโดยย่อของวัสดุที่รองรับได้ที่พร็อพเพอร์ตี้ glTF PBR ในเว็บไซต์ Khronos หากต้องการดูวิธีปรับแต่งโมเดล 3 มิติด้วยพร็อพเพอร์ตี้เหล่านี้และพร็อพเพอร์ตี้อื่นๆ โปรดดูหัวข้อปรับแต่งโมเดล 3 มิติในแอป
เพิ่มไฟล์ glTF ลงในโฟลเดอร์ชิ้นงาน
เมื่อมีไฟล์ glTF แล้ว ขั้นตอนถัดไปคือการเพิ่มไฟล์ลงในไดเรกทอรี Asset ใน Android Studio เราขอแนะนำให้สร้างไดเรกทอรี models เพื่อจัดระเบียบประเภทเนื้อหาให้ดียิ่งขึ้น

เพิ่มออบเจ็กต์ 3 มิติโดยใช้ SpatialGltfModel
Android XR รองรับรูปแบบ glTF สำหรับโมเดล 3 มิติ ซึ่งโดยปกติจะบันทึกเป็นไฟล์ .glb หากต้องการเพิ่มออบเจ็กต์เหล่านี้ลงในเลย์เอาต์ ให้ใช้ SpatialGltfModel SpatialGltfModel คือคอมโพสิเบิลของพื้นที่ย่อยที่ช่วยให้คุณเพิ่มโมเดล 3 มิติในรูปแบบ glTF ลงในเลย์เอาต์เชิงพื้นที่ได้ API นี้ช่วยลดความซับซ้อนของกระบวนการโหลดชิ้นงานและจัดการสถานะของชิ้นงาน
หากต้องการแสดงโมเดล ให้กำหนดแหล่งที่มาและสถานะของโมเดลก่อนโดยใช้ rememberSpatialGltfModelState คุณสามารถโหลดโมเดลจากโฟลเดอร์ assets ของแอป, URI หรือ raw data
val modelState = rememberSpatialGltfModelState( source = SpatialGltfModelSource.fromPath( Paths.get("models/model_name.glb") ) )
หลังจากกำหนดสถานะแล้ว ให้ใช้ SpatialGltfModel Composable เพื่อแสดงผลภายใน Subspace ดังนี้
SpatialGltfModel(state = modelState, modifier = SubspaceModifier)
ประเด็นสำคัญเกี่ยวกับโค้ด
- การโหลดแบบอะซิงโครนัส: ระบบจะโหลดโมเดลแบบอะซิงโครนัส ในระหว่างการจัดองค์ประกอบเริ่มต้น ขนาดที่แท้จริงอาจเป็น 0 โดยเลย์เอาต์จะวัดอีกครั้งเมื่อโมเดลพร้อม
- สถานะการควบคุม: ใช้
SpatialGltfModelState.statusเพื่อค้นหาสถานะการโหลดหรือควบคุมภาพเคลื่อนไหว - การปรับขนาดและการปรับสัดส่วน: โดยค่าเริ่มต้น ขนาดเลย์เอาต์จะตรงกับกรอบล้อมรอบของชิ้นงาน คุณสามารถลบล้างค่านี้ได้ด้วย
SubspaceModifier.sizeเพื่อปรับขนาดโมเดลให้พอดีกับขอบเขตที่ระบุอย่างสม่ำเสมอ
วางโมเดล 3 มิติโดยใช้ Compose SceneCoreEntity
หากต้องการวางโมเดล 3 มิติโดยใช้ SceneCoreEntity คุณต้องโหลด glTF ลงในหน่วยความจำโดยใช้ GltfModel.create() ก่อน จากนั้นคุณสามารถวางโมเดล 3 มิติลงใน SceneCoreEntity เพื่อเชื่อมโยงคอมโพเนนต์ SceneCore กับเลย์เอาต์ Compose for XR โปรดดูหัวข้อใช้ SceneCoreEntity เพื่อวางวัตถุ 3 มิติในเลย์เอาต์
วางโมเดล 3 มิติโดยใช้ Jetpack Scenecore
หากต้องการโหลดโมเดล 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 มิติโดยใช้ 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