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

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

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

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

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

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