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

หากต้องการดูภาพรวมโดยย่อของวัสดุที่รองรับ โปรดดูพร็อพเพอร์ตี้ glTF PBR ในเว็บไซต์ Khronos หากต้องการดูวิธีปรับแต่งโมเดล 3 มิติด้วยพร็อพเพอร์ตี้เหล่านี้และพร็อพเพอร์ตี้อื่นๆ โปรดดู ปรับแต่งโมเดล 3 มิติในแอป

เพิ่มไฟล์ glTF ลงในโฟลเดอร์ชิ้นงาน

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

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

เพิ่มออบเจ็กต์ 3 มิติโดยใช้ SpatialGltfModel

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

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

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

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

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

วางโมเดล 3 มิติโดยใช้ Compose SceneCoreEntity

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

วางโมเดล 3 มิติโดยใช้ Jetpack Scenecore

หากต้องการโหลดโมเดล 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 มิติโดยใช้ 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