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 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 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 phần mở rộng đượ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, Blender và Spline đề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 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 ánh sáng do hộp bầu trời môi trường cung cấp. Vật liệu phản chiếu và điểm sáng phản chiếu cũng sẽ phản chiếu hộp bầu trời môi trường. Nếu bạn đã bật chế độ nhìn xuyên qua, thì ánh sáng, phản chiếu và phản xạ gương sẽ dựa trên một căn phòng sáng có một đèn định hướng.

Để xem thông tin tổng quan nhanh về các chất liệu được hỗ trợ, hãy tham khảo Thuộc tính glTF PBR 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à 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 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 thành phần 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 SpatialGltfModel. SpatialGltfModel là một thành phần kết hợp không gian phụ cho phép bạn thêm mô hình 3D ở định dạng glTF vào bố cục không gian. API này đơn giản hoá quy trình tải thành phần và quản lý trạng thái của thành phầ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 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 để hiển thị trạng thái đó trong một không gian con:

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Các điểm chính về mã

  • Tải không đồng bộ: Mô hình được tải không đồng bộ. Trong quá trình kết hợp ban đầu, kích thước nội tại của thành phần có thể bằng 0; bố cục sẽ đo lường lại sau khi mô hình sẵn sàng.
  • Kiểm soát trạng thái: Sử dụng SpatialGltfModelState.status để truy vấn trạng thái tải hoặc kiểm soát ảnh động.
  • Định cỡ và điều chỉnh tỷ lệ: Theo mặc định, kích thước bố cục khớp với hộp giới hạn của thành phần. Bạn có thể ghi đè giá trị này bằng SubspaceModifier.size để điều chỉnh tỷ lệ mô hình một cách đồng nhất cho vừa với các giới hạn đã chỉ định.

Đặ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 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 bố cục Compose cho XR. Tham khảo bài viết Sử dụng SceneCoreEntity để đặt đối tượng 3D vào 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, bạn nên tải các mô hình đó một cách không đồng bộ trước. Bằng cách này, người dùng không phải đợi 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. Tốt nhất là 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ô hình 3D có các khả 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 Trình xem cảnh trên Android XR và trên thiết bị di động là Trình xem cảnh 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, ứng dụng của bạn sẽ không còn hiển thị nữa và Scene Viewer sẽ được lấy tiêu điểm. Mọi môi trường mà bạn có thể đã thay đổi sẽ được đặt lại về lựa chọn ưu tiên về hệ thống của 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 Trình xem cảnh, hãy tham khảo tài liệu 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 khả năng của 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à Trình xem cảnh.