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, SDK Jetpack XR hỗ trợ tiêu chuẩn mở glTF 2.0. Khi Android XR kết xuất các ứng dụng được xây dựng bằng SDK Jetpack XR, 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 các mô hình 3D sang định dạng glTF (.gltf hoặc .glb tệp).

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

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

Thêm tệp glTF vào thư mục tài sả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 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 .glb tệp. Để 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 giúp đơn giản hoá quá trình tải tài sản và quản lý trạng thái của chúng.

Để 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 sử dụng thành phần kết hợp SpatialGltfModel để kết xuất thành phần đó trong một không gian con.

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

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

Để đặ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 cách sử dụng GltfModel.create(). Sau đó, bạn có thể đặt mô hình 3D vào SceneCoreEntity để kết nối các thành phần SceneCore với Compose cho bố cục XR. Tham khảo bài viết Sử dụng SceneCoreEntity để đặ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. Bằng cách này, 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 các phương pháp hay nhất, bạn nên kiểm tra để đảm bảo rằng ứng dụng đang ở trạng thái cho phép các tính 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ô hình 3D có các tính 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 ý định và chạy ở Chế độ toàn bộ không gian. Do đó, khi bạn gọi ứng dụng này, ứng dụng của bạn sẽ không còn xuất hiện và Scene Viewer sẽ ở trong tâm đ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 hệ thống người dù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

SDK Jetpack XR hỗ trợ một số tiện ích glTF giúp mở rộng các tính năng của mô hình 3D. Các tính năng này có sẵn thông qua cả the GltfModelEntity và Scene Viewer.