เมื่อทำงานกับโมเดล 3 มิติ Jetpack XR SDK จะรองรับมาตรฐานแบบเปิด glTF 2.0 เมื่อ Android XR แสดงผลแอปที่สร้างด้วย SDK ของ Jetpack XR ระบบจะแสดงผลโมเดล 3 มิติด้วยเทคนิคการแสดงผลตามหลักฟิสิกส์(PBR) ที่ระบุไว้ในมาตรฐาน glTF 2.0 (พร้อมกับ extensions
ที่รองรับ) เครื่องมือการสร้างเนื้อหาดิจิทัล (DCC) ส่วนใหญ่ เช่น Autodesk Maya, Maxon ZBrush, Blender และ Spline สามารถส่งออกโมเดล 3 มิติเป็นรูปแบบ glTF (ไฟล์ .gltf
หรือ .glb
)
หากผู้ใช้หรือแอปของคุณระบุภาพฟ้า SpatialEnvironment
ระบบจะจัดแสงโมเดล 3 มิติด้วยข้อมูลการจัดแสงที่ได้จากภาพฟ้าสภาพแวดล้อม วัสดุที่สะท้อนแสงและไฮไลต์ที่สะท้อนแสงจะสะท้อนสภาพแวดล้อมของกล่องพื้นหลังด้วย หากเปิดใช้การส่งผ่าน แสง แสงสะท้อน และไฮไลต์ที่สะท้อนแสงจะอิงตามห้องที่สว่างและเรียบง่ายซึ่งมีแสงทิศทางเดียว
ดูภาพรวมคร่าวๆ ของวัสดุที่รองรับได้ที่พร็อพเพอร์ตี้ PBR ของ glTF ในเว็บไซต์ Khronos
แอปที่สร้างด้วย Jetpack XR SDK มี 2 วิธีหลักในการโหลดโมเดล 3 มิติ
- โหลดโมเดลลงใน
ActivitySpace
ตามที่อธิบายไว้ในส่วนต่อไปนี้ วางโมเดล 3 มิติลงใน ActivitySpace - ใช้เครื่องมือดูฉากในตัวผ่าน Intent
วางโมเดล 3 มิติลงใน ActivitySpace
เมื่อคุณมีไฟล์ glTF แล้ว ขั้นตอนถัดไปคือการเพิ่มไฟล์นั้นลงในไดเรกทอรีเนื้อหาใน Android Studio เราขอแนะนำให้สร้างไดเรกทอรี models
เพื่อจัดระเบียบประเภทเนื้อหาให้ดียิ่งขึ้น
หากต้องการโหลดโมเดล glTF ให้เรียกใช้ createGltfResourceAsync
// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()
ณ จุดนี้ ระบบจะโหลดโมเดลลงในหน่วยความจํา แต่ยังไม่ได้แสดงผล หากคุณมีโมเดล 3 มิติจำนวนมากหรือโมเดลมีขนาดใหญ่ คุณควรโหลดโมเดลแบบไม่พร้อมกันล่วงหน้า วิธีนี้จะช่วยให้ผู้ใช้ไม่ต้องรอโหลดโมเดลของคุณลงในหน่วยความจำ
เราต้องเพิ่ม glTF ลงใน ActivitySpace
โทรไปที่ createGltfEntity
เพื่อสร้างเอนทิตีและวางลงใน ActivitySpace
แนวทางปฏิบัติแนะนำคือให้ตรวจสอบว่าแอปอยู่ในสถานะที่เปิดใช้ความสามารถเชิงพื้นที่
// check for spatial capabilities
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)){
// create the gltf entity using the gltf file from the previous snippet
val gltfEntity = xrSession.createGltfEntity(gltfModel)
}
ตอนนี้คุณควรเห็นโมเดล 3 มิติที่โหลดเมื่อเรียกใช้แอป
วางโมเดล 3 มิติลงในโวลุ่มการคอมโพส
แม้ว่าคุณจะยังคงต้องโหลด glTF ลงในหน่วยความจำโดยใช้ createGltfResourceAsync
แต่ก็สามารถวางโมเดล 3 มิติลงใน Volume
ได้หากสร้าง UI ด้วย Jetpack Compose สำหรับ XR โปรดดูใช้ปริมาตรเพื่อวางวัตถุ 3 มิติในเลย์เอาต์
เคลื่อนไหวโมเดล 3 มิติ
โมเดล 3 มิติสามารถฝังภาพเคลื่อนไหวได้ ซึ่งเป็นส่วนหนึ่งของข้อกำหนด glTF
Jetpack XR SDK รองรับภาพเคลื่อนไหวโครงกระดูก (การต่อโครง), การเคลื่อนไหวแบบคงที่ และการเคลื่อนไหวแบบเปลี่ยนรูปร่าง (การผสมรูปร่าง) นอกจากนี้ ยังรองรับภาพเคลื่อนไหวของวัสดุที่สร้างด้วยส่วนขยาย KHR_animation_pointer
glTF ด้วย
หากต้องการเล่นภาพเคลื่อนไหว ให้เรียกใช้ startAnimation
แล้วระบุชื่อภาพเคลื่อนไหว คุณระบุได้ว่าต้องการให้ภาพเคลื่อนไหววนซ้ำไปเรื่อยๆ หรือไม่
//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")
การเรียกใช้ startAnimation
ครั้งที่สองจะทำให้ภาพเคลื่อนไหวปัจจุบันหยุดลงและภาพเคลื่อนไหวใหม่จะเริ่มขึ้น
คุณสามารถค้นหาสถานะปัจจุบันของภาพเคลื่อนไหวผ่าน getAnimationState()
หากไม่มีชื่อภาพเคลื่อนไหวที่ระบุเมื่อเรียกใช้ startAnimation()
การเรียกใช้จะไม่สำเร็จโดยอัตโนมัติ ภาพเคลื่อนไหวที่ทำงานอยู่จะหยุดลง และ getAnimationState()
จะแสดงผลเป็น STOPPED
โหลดโมเดล 3 มิติโดยใช้โปรแกรมดูฉาก
หากกำลังมองหาวิธีที่ง่ายที่สุดในการโหลดโมเดล 3 มิติที่โต้ตอบได้แบบพื้นฐาน คุณอาจเลือกใช้ Scene Viewer เช่นเดียวกับในอุปกรณ์เคลื่อนที่ ความแตกต่างที่สำคัญระหว่าง Scene Viewer ใน Android VR กับในอุปกรณ์เคลื่อนที่คือ Scene Viewer รองรับเฉพาะพารามิเตอร์ URI ของไฟล์ที่ชี้ไปยังไฟล์ glTF และจะละเว้นพารามิเตอร์อื่นๆ ทั้งหมด
เครื่องมือดูภาพเป็นแอปแยกต่างหากที่เรียกใช้ผ่าน Intent และทำงานในโหมดพื้นที่ทำงานแบบเต็ม ดังนั้น เมื่อเรียกใช้ คุณจะไม่เห็นแอปอีกต่อไป และฟีเจอร์ Scene Viewer จะมีโฟกัส สภาพแวดล้อมที่คุณอาจเปลี่ยนแปลงจะรีเซ็ตเป็นค่ากําหนดของระบบของผู้ใช้
ต่อไปนี้คือตัวอย่างการใช้ Intent
เพื่อดูไฟล์ glTF ใน Scene Viewer บน Android XR
val THREED_MODEL_URL = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/FlightHelmet/glTF/FlightHelmet.gltf"
val MIME_TYPE = "model/gltf-binary"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
Uri.parse("https://arvr.google.com/scene-viewer/1.2")
.buildUpon()
.appendQueryParameter("file", THREED_MODEL_URL)
.build()
sceneViewerIntent.setDataAndType(intentUri, MIME_TYPE)
startActivity(sceneViewerIntent)
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการโต้ตอบสำหรับโปรแกรมดูฉากได้ที่เอกสารประกอบการออกแบบโมเดล 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