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

Các thiết bị XR áp dụng
Hướng dẫn này giúp bạn tạo trải nghiệm cho các loại thiết bị XR này.
Kính XR
Kính 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 sáng sẽ dựa trên một căn phòng đơn giản, sáng sủa với một nguồn sáng định hướng duy nhất.

Để biết thông tin tổng quan nhanh về các vật liệu được hỗ trợ, hãy tham khảo glTF PBR Properties (Thuộc tính PBR glTF) trên trang web Khronos.

Có 2 cách chính để các ứng dụng được tạo bằng Jetpack XR SDK tải mô hình 3D.

Đặt mô hình 3D vào ActivitySpace

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 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

Để 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 gian. 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ớ.

Chúng ta cần 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 mô hình 3D vào một SceneCoreEntity của Compose

Mặc dù bạn vẫn cần tải glTF vào bộ nhớ bằng GltfModel.create(), nhưng bạn có thể đặt các mô hình 3D vào SceneCoreEntity nếu đang tạo giao diện người dùng bằng Jetpack Compose cho XR. Tham khảo phần Sử dụng SceneCoreEntity để đặt một đối tượng 3D trong bố cục.

Tạo ảnh động cho mô hình 3D

Theo quy cách glTF, mô hình 3D có thể có ảnh động được nhúng. Ảnh động có bộ xương (được trang bị), ảnh động cứng, ảnh động mục tiêu biến đổi (hình dạng kết hợp) đều được hỗ trợ trong Jetpack XR SDK. Ảnh động Material được tạo bằng phần mở rộng KHR_animation_pointer glTF cũng được hỗ trợ.

Để phát một ảnh động, hãy gọi startAnimation() và chỉ định tên của ảnh động. Bạn có thể tuỳ ý chỉ định xem ảnh động có nên lặp lại vô hạn hay không.

gltfEntity.startAnimation(loop = true, animationName = "Walk")

Khi gọi startAnimation lần thứ hai, ảnh động hiện tại sẽ dừng và ảnh động mới sẽ bắt đầu.

Bạn có thể truy vấn trạng thái hiện tại của ảnh động thông qua getAnimationState().

Nếu tên ảnh động được chỉ định khi gọi startAnimation() không tồn tại, thì lệnh gọi sẽ âm thầm thất bại, mọi ảnh động đang chạy sẽ dừng và getAnimationState() sẽ trả về STOPPED.

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ị nữa và Scene Viewer sẽ được lấy làm 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 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.