เพิ่มโมเดล 3 มิติลงในแอป

เมื่อทำงานกับโมเดล 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 มิติ

วางโมเดล 3 มิติลงใน ActivitySpace

เมื่อคุณมีไฟล์ glTF แล้ว ขั้นตอนถัดไปคือการเพิ่มไฟล์นั้นลงในไดเรกทอรีเนื้อหาใน Android Studio เราขอแนะนำให้สร้างไดเรกทอรี models เพื่อจัดระเบียบประเภทเนื้อหาให้ดียิ่งขึ้น

ตัวอย่างการเพิ่มชิ้นงานลงในไดเรกทอรี /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 มิติที่โหลด

วางโมเดล 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