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

อุปกรณ์ XR ที่ใช้ได้
คำแนะนำนี้จะช่วยให้คุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทต่างๆ เหล่านี้ได้
ชุดหูฟัง XR
แว่นตา XR แบบมีสาย

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

ดูภาพรวมโดยย่อของวัสดุที่รองรับได้ที่คุณสมบัติ PBR ของ glTF ในเว็บไซต์ Khronos

แอปที่สร้างด้วย Jetpack XR SDK จะโหลดโมเดล 3 มิติได้ 2 วิธีหลักๆ ดังนี้

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

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

ตัวอย่างการเพิ่มชิ้นงานลงในไดเรกทอรี /models

หากต้องการโหลดโมเดล 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 มิติที่โหลด

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

แม้ว่าคุณจะยังคงต้องโหลด glTF ลงในหน่วยความจำโดยใช้ GltfModel.create() แต่คุณก็สามารถวางโมเดล 3 มิติลงใน SceneCoreEntity ได้หากสร้าง UI ด้วย Jetpack Compose สำหรับ XR ดูที่ใช้ SceneCoreEntity เพื่อวางออบเจ็กต์ 3 มิติในเลย์เอาต์

สร้างภาพเคลื่อนไหวโมเดล 3 มิติ

โมเดล 3 มิติสามารถมีภาพเคลื่อนไหวฝังอยู่ได้ ซึ่งเป็นส่วนหนึ่งของข้อกำหนด glTF Jetpack XR SDK รองรับภาพเคลื่อนไหวแบบโครงกระดูก (Rigged), แบบแข็ง และแบบเป้าหมายการเปลี่ยนรูป (Blend Shapes) นอกจากนี้ยังรองรับภาพเคลื่อนไหวของวัสดุที่สร้างด้วยKHR_animation_pointerส่วนขยาย glTF ด้วย

หากต้องการเล่นภาพเคลื่อนไหว ให้เรียกใช้ startAnimation() แล้วระบุชื่อของ ภาพเคลื่อนไหว คุณระบุได้ว่าจะให้ภาพเคลื่อนไหววนซ้ำอย่างไม่สิ้นสุดหรือไม่

gltfEntity.startAnimation(loop = true, animationName = "Walk")

การเรียกใช้ startAnimation เป็นครั้งที่ 2 จะทำให้ภาพเคลื่อนไหวปัจจุบันหยุดลงและ ภาพเคลื่อนไหวใหม่จะเริ่มขึ้น

คุณสามารถค้นหาสถานะปัจจุบันของภาพเคลื่อนไหวผ่าน getAnimationState()

หากไม่มีชื่อภาพเคลื่อนไหวที่ระบุเมื่อเรียกใช้ startAnimation() การเรียกใช้จะล้มเหลวโดยไม่มีข้อความใดๆ ภาพเคลื่อนไหวที่กำลังทำงานจะหยุด และ getAnimationState() จะแสดงผล STOPPED

โหลดโมเดล 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