Thêm mô hình 3D vào ứng dụng

Các thiết bị XR được hỗ trợ
Hướng dẫn này giúp bạn xây dựng các trải nghiệm cho những loại thiết bị XR sau.
Thiết bị đeo đầu XR
Kính thông minh XR có dây

Khi làm việc với các mô hình 3D, Jetpack XR SDK hỗ trợ tiêu chuẩn mở glTF 2.0. Khi Android XR kết xuất các ứng dụng được tạo bằng Jetpack XR SDK, các mô hình 3D sẽ được kết xuất bằng các kỹ thuật kết xuất dựa trên vật lý(PBR) được chỉ định trong tiêu chuẩn glTF 2.0 (cùng với các tiện ích được hỗ trợ). Hầu hết các công cụ tạo nội dung kỹ thuật số (dcc), chẳng hạn như Autodesk Maya, Maxon ZBrush, BlenderSpline đều có thể xuất mô hình 3D sang định dạng glTF (tệp .gltf hoặc .glb).

Nếu người dùng hoặc ứng dụng của bạn đã chỉ định một skybox SpatialEnvironment, thì các mô hình 3D sẽ được chiếu sáng bằng thông tin chiếu sáng do skybox môi trường cung cấp. Vật liệu phản chiếu và điểm nổi bật phản chiếu cũng sẽ phản chiếu hộp bầu trời của môi trường. Nếu chế độ truyền qua được bật, thì ánh sáng, hình ảnh phản chiếu và điểm nổi bật phản chiếu sẽ dựa trên một căn phòng sáng sủa với một nguồn sáng định hướng duy nhất.

Để xem thông tin tổng quan nhanh về các vật liệu được hỗ trợ, hãy tham khảo Thuộc tính PBR glTF trên trang web Khronos. Để tìm hiểu cách tuỳ chỉnh mô hình 3D bằng các thuộc tính này và những thuộc tính khác, hãy xem phần Tuỳ chỉnh mô hình 3D trong ứng dụng

Thêm tệp glTF vào thư mục thành phần

Sau khi có tệp glTF, bước tiếp theo là thêm tệp đó vào thư mục tài sản trong Android Studio. Bạn nên tạo một thư mục models để sắp xếp các loại tài sản của mình một cách hiệu quả hơn.

Ví dụ về cách thêm thành phần vào thư mục /models

Thêm đối tượng 3D bằng SpatialGltfModel

Android XR hỗ trợ định dạng glTF cho các mô hình 3D, thường được lưu dưới dạng tệp .glb. Để thêm các đối tượng này vào bố cục, hãy sử dụng thành phần kết hợp SpatialGltfModel. API này đơn giản hoá quy trình tải tài sản và quản lý trạng thái của tài sản.

Để hiển thị một mô hình, trước tiên, hãy xác định nguồn và trạng thái của mô hình đó bằng cách sử dụng rememberSpatialGltfModelState. Bạn có thể tải các mô hình từ thư mục assets của ứng dụng, URI hoặc raw data.

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

Sau khi xác định trạng thái, hãy dùng thành phần kết hợp SpatialGltfModel để kết xuất trạng thái đó trong một không gian con.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Đặt mô hình 3D bằng Compose SceneCoreEntity

Để đặt mô hình 3D bằng SceneCoreEntity, trước tiên, bạn cần tải glTF vào bộ nhớ bằng GltfModel.create(). Sau đó, bạn có thể đặt một mô hình 3D vào SceneCoreEntity để kết nối các thành phần SceneCore với bố cục Compose cho XR. Tham khảo phần Sử dụng SceneCoreEntity để đặt một đối tượng 3D trong bố cục.

Đặt mô hình 3D bằng Jetpack Scenecore

Để tải mô hình glTF, hãy gọi GltfModel.create().

val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))

Tại thời điểm này, mô hình được tải vào bộ nhớ nhưng chưa được kết xuất. Nếu bạn có nhiều mô hình 3D cần tải hoặc mô hình của bạn có kích thước lớn, thì bạn nên tải các mô hình đó không đồng bộ trước thời hạn. Nhờ đó, người dùng không phải đợi các mô hình của bạn được tải vào bộ nhớ.

Thêm glTF vào ActivitySpace. Gọi GltfModelEntity.create để tạo một thực thể và đặt thực thể đó vào ActivitySpace. Theo phương pháp hay nhất, bạn nên kiểm tra để đảm bảo ứng dụng đang ở trạng thái cho phép các chức năng không gian.

if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) {
    val gltfEntity = GltfModelEntity.create(session, gltfModel)
}

Bây giờ, bạn sẽ thấy mô hình 3D đã tải khi chạy ứng dụng.

Ví dụ về mô hình 3D đã tải

Tải mô hình 3D bằng Scene Viewer

Nếu đang tìm cách đơn giản nhất để tải một mô hình 3D có các chức năng tương tác cơ bản, bạn có thể chọn sử dụng Scene Viewer như trên thiết bị di động. Điểm khác biệt chính giữa Scene Viewer trên Android XR và trên thiết bị di động là Scene Viewer chỉ hỗ trợ tham số URI tệp trỏ đến tệp glTF và tất cả các tham số khác đều bị bỏ qua.

Scene Viewer là một ứng dụng riêng biệt được gọi bằng một ý định và chạy ở Chế độ toàn bộ không gian. Do đó, khi bạn gọi phương thức này, ứng dụng của bạn sẽ không còn hiển thị và Scene Viewer sẽ được lấy làm tiêu điểm. Mọi môi trường mà bạn có thể đã thay đổi sẽ được đặt lại thành lựa chọn ưu tiên của người dùng trên hệ thống.

Dưới đây là ví dụ về cách sử dụng Intent để xem tệp glTF trong Scene Viewer trên 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.
}

Để biết thêm thông tin về các lựa chọn tương tác cho Scene Viewer, hãy tham khảo tài liệu về thiết kế mô hình 3D của chúng tôi.

Tiện ích glTF

Jetpack XR SDK hỗ trợ một số tiện ích gfTF giúp mở rộng khả năng của các mô hình 3D. Bạn có thể sử dụng các chức năng này thông qua cả GltfModelEntity và Scene Viewer.