เพิ่มโมเดล 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 แล้ว ขั้นตอนถัดไปคือการเพิ่มไฟล์ลงในไดเรกทอรี Asset ใน 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 มิติโดยใช้ SpatialGltfModel

Android XR รองรับรูปแบบ glTF สำหรับโมเดล 3 มิติ ซึ่งโดยปกติจะบันทึกเป็นไฟล์ .glb หากต้องการเพิ่มออบเจ็กต์เหล่านี้ลงในเลย์เอาต์ ให้ใช้ Composable SpatialGltfModel API นี้ช่วยลดความซับซ้อนของ กระบวนการโหลดชิ้นงานและจัดการสถานะของชิ้นงาน

หากต้องการแสดงโมเดล ให้กำหนดแหล่งที่มาและสถานะของโมเดลก่อนโดยใช้ rememberSpatialGltfModelState คุณโหลดโมเดลได้จากโฟลเดอร์ assets ของแอป, URI หรือ raw data

val modelState = rememberSpatialGltfModelState(
    source = SpatialGltfModelSource.fromPath(
        Paths.get("models/model_name.glb")
    )
)

เมื่อกำหนดสถานะแล้ว ให้ใช้ Composable SpatialGltfModel เพื่อแสดงผลภายในพื้นที่ย่อย

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

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

หากต้องการวางโมเดล 3 มิติโดยใช้ SceneCoreEntity คุณต้องโหลด glTF ลงในหน่วยความจำก่อนโดยใช้ GltfModel.create() จากนั้นคุณจะวางโมเดล 3 มิติลงใน SceneCoreEntity เพื่อเชื่อมคอมโพเนนต์ SceneCore กับเลย์เอาต์ Compose for XR ได้ ดูที่ ใช้ SceneCoreEntity เพื่อวางออบเจ็กต์ 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 รองรับส่วนขยาย gfTF หลายรายการที่ขยายความสามารถของโมเดล 3 มิติ ความสามารถเหล่านี้พร้อมให้บริการผ่านทั้ง GltfModelEntity และ Scene Viewer