Kỹ sư phần mềm cấp cao
Khám phá cách neo và duy trì trải nghiệm 3D trong thế giới thực bằng Unity và Android XR. Phiên này đề cập đến khung Thực thể không gian, Điểm neo trên đám mây và API không gian địa lý, minh hoạ cách xây dựng các ứng dụng nhận biết bối cảnh, ghi nhớ vị trí thực tế và đồng bộ hoá dữ liệu không gian của nhiều người dùng trên các phiên.
Chúng ta sẽ tìm hiểu cấu trúc đằng sau các thực thể không gian, hiểu cách neo tài sản kỹ thuật số vào các đối tượng vật lý, bề mặt và vị trí địa lý. Bạn sẽ nắm được quy trình làm việc thực tế của Unity để lập bản đồ không gian, duy trì nội dung giữa các phiên và tạo trải nghiệm AR/XR được chia sẻ, nhận biết vị trí.
TrySaveAnchorAsync và tải lại bằng GUID được chuyển đổi tuần tự.Bản chép lời
Được rồi.
Chào các bạn.
Đây là bài viết Kiến trúc nội dung không gian trên Android XR bằng Unity.
Tôi là Jennifer Stanton.
Tôi làm việc tại Unity với tư cách là kỹ sư phần mềm cấp cao.
Tôi làm việc trong nhóm Tính năng XR, cụ thể là về AR Foundation và các gói liên quan mang thực tế tăng cường và thực tế hỗn hợp đến Unity.
Tôi là Levana Chen, thuộc nhóm Công cụ phát triển trò chơi XR của Google.
Các nhóm của chúng tôi tập trung vào việc cung cấp các trình bổ trợ và gói để mang đến chức năng XR nâng cao và khả năng tích hợp liền mạch với công cụ phát triển trò chơi.
Một trong những thách thức lớn nhất mà chúng tôi nhận được từ các bạn là việc hỗ trợ nhiều nền tảng XR bằng cùng một cơ sở mã đòi hỏi rất nhiều công sức.
AR Foundation là lớp API thực tế mở rộng cấp cao của Unity.
Bạn có thể nhắm đến nhiều nền tảng XR mà không cần viết lại mã, không cần quản lý nhiều cơ sở mã và bạn có một API tập lệnh cho các tính năng AR trên mọi nền tảng.
Nhờ đó, bạn có thể tập trung vào việc tạo ứng dụng, trò chơi hoặc trải nghiệm, còn Unity sẽ lo các chi tiết về nền tảng cho bạn.
Một cách mà AR Foundation thực hiện việc này là thông qua các tiện ích OpenXR.
Đây là một bộ API mở, theo tiêu chuẩn ngành do Khronos Group xác định.
OpenXR cũng đã tạo Thực thể không gian.
Đây là một khung cho nội dung kỹ thuật số để thể hiện và tương tác với thế giới thực.
Thực thể không gian cung cấp một mô hình hợp nhất để biểu thị các phần tử trong thế giới thực dưới dạng đối tượng kỹ thuật số.
Tôi rất vui được chia sẻ với bạn một số thông tin mới nhất về AR Foundation để bạn có thể bắt đầu hành trình tạo trải nghiệm cho XR.
Tiếp theo, tôi sẽ giới thiệu các tính năng của AR Foundation để nội dung kỹ thuật số của bạn có thể tương tác với thế giới thực.
Sau đó, tôi sẽ hướng dẫn bạn cách thiết lập dự án, bao gồm cả các gói và phần phụ thuộc khác, để bạn có thể triển khai tính năng này trong dự án của mình.
Sau đó, tôi sẽ tổng kết bằng cách điểm qua một số tính năng chỉ có trên Android XR.
Vì vậy, một số cách mà AR Foundation thể hiện thế giới thực dưới dạng kỹ thuật số là mặt phẳng.
Và đây là các bề mặt phẳng trong môi trường thực tế, chẳng hạn như sàn nhà, tường, trần nhà và thậm chí cả bàn và ghế dài.
Lưới là cấu trúc 3D thể hiện hình học của thế giới vật lý.
Và chúng ta cũng có các cách tương tác với thế giới thực, đó là truyền tia.
Những điểm này xác định nơi tia giao nhau với nội dung kỹ thuật số.
Hãy coi đó như một con trỏ laser và bạn sẽ nhận được thông tin về nơi con trỏ laser đó đang chiếu vào.
Chúng tôi cũng có các điểm neo giúp ổn định và di dời một điểm trong không gian.
Tôi sẽ đi sâu hơn vào các điểm neo trong phần sau của bản trình bày này.
Vì vậy, cả 4 tính năng này đều được coi là Tính năng của AR Foundation.
Ngoài ra, còn có một số tính năng khác không được đề cập trong trang trình bày này.
Cụ thể, các mặt phẳng và điểm neo được coi là có thể theo dõi vì chúng mở rộng lớp ARTrackable và trình quản lý của chúng theo dõi thông tin cập nhật từ thời gian chạy.
Giờ hãy chuyển sang máy bay.
Đối với mặt phẳng, chúng ta có thành phần ARPlane, giúp xác định các bề mặt phẳng theo thời gian thực.
Các mặt phẳng này có nhãn ngữ nghĩa mà bạn có thể truy vấn để biết mặt phẳng của mình là sàn, bàn, tường, v.v.
Mặt phẳng cũng có ranh giới động, vì vậy, khi người dùng di chuyển trong thế giới thực và có thể nhìn thấy nhiều bề mặt hơn, ranh giới mặt phẳng sẽ tự động mở rộng, hợp nhất và tinh chỉnh theo thời gian thực.
Chúng ta cũng có thể đính kèm một trình va chạm lưới vào mặt phẳng để xử lý vật lý.
Tại đây, bạn có thể xem ví dụ về tính năng phát hiện mặt phẳng.
Đây là cảnh truyền tia mẫu của AR Foundation đang chạy trên thiết bị Android XR.
Công cụ này phát hiện các đa giác 2D động theo thời gian thực.
Bạn có thể tạo một ứng dụng có chức năng này bằng cách làm theo hướng dẫn thiết lập dự án hoặc sử dụng một trong các mẫu của chúng tôi.
Tiếp theo là lưới.
Lưới là một tính năng thực tế tăng cường (AR) cung cấp lưới 3D của môi trường.
Chúng ta có thể đính kèm một lưới va chạm vào các lưới được tạo này, nhờ đó nội dung kỹ thuật số của bạn có thể tương tác với các đối tượng trong thế giới thực.
Lưới cho phép che khuất đối tượng một cách thuyết phục.
Vì vậy, một đối tượng ảo có thể xuất hiện phía sau một đối tượng thực.
Nếu đối tượng kỹ thuật số của bạn có thể di chuyển trong không gian, bạn có thể sử dụng cùng một hình học để tìm đường đi tránh các đối tượng trong thế giới thực.
Tiếp theo, chúng ta có tính năng truyền tia.
Tính năng truyền tia chiếu các tia ảo vào cảnh 3D của bạn để tìm các giao điểm mà không cần bạn phải lo lắng về phép toán phức tạp.
Tia chiếu có thể giao nhau với nhiều đối tượng 3D trong môi trường của bạn.
Bạn có thể định cấu hình tính năng truyền tia để chỉ nhắm đến một số loại nội dung kỹ thuật số nhất định.
Ví dụ: bạn có thể định cấu hình để tia không chạm vào mặt phẳng mà chỉ giao với lưới.
Bây giờ, hãy xem các gói có liên quan.
Các gói này đều hoạt động cùng nhau để giao tiếp với nhau và tạo ra trải nghiệm XR đầy đủ.
Như đã đề cập, AR Foundation xử lý các tính năng như mặt phẳng và điểm neo.
Trình bổ trợ OpenXR xử lý các API gốc trên nhiều nền tảng XR, vì vậy, bạn nên sử dụng gói này nếu thiết bị của bạn dùng OpenXR.
Bạn có thể ghép trình bổ trợ OpenXR với gói Thực thể không gian OpenXR để truy cập vào các tiện ích Thực thể không gian cụ thể. Chúng ta sẽ tìm hiểu thêm về vấn đề này sau.
Nếu biết rằng bạn sẽ nhắm đến các thiết bị Android XR cụ thể, chẳng hạn như thiết bị đeo đầu XR và kính thông minh XR có dây, thì bạn cần có gói Unity OpenXR Android XR cho việc đó.
Và vì tất cả những điều này đều tuân theo mẫu trình bổ trợ, nên tác động đến mã của bạn sẽ ở mức tối thiểu.
Không phải tính năng nào cũng có trong tất cả các gói AR Foundation.
Ví dụ: nếu bạn xem biểu đồ này, thì tính năng chia lưới hiện không có trong gói Unity OpenXR Spatial Entities.
XR Plug-in Management cho phép bạn quản lý các tính năng OpenXR được chọn trong dự án của mình.
Vì vậy, nếu đang ở trong trình chỉnh sửa Unity, bạn sẽ chuyển đến phần Chỉnh sửa, Cài đặt dự án, sau đó phần Quản lý trình bổ trợ XR sẽ nằm ở thanh bên trái.
Tại đây, bạn có thể tìm thấy các tính năng và nhóm tính năng của OpenXR để chọn và bỏ chọn những tính năng và nhóm tính năng mà bạn muốn đưa vào bản dựng.
Ví dụ: trong ảnh chụp màn hình này, chúng ta đang xem tất cả các tính năng đi kèm với gói Android XR OpenXR.
Sau đó, bạn có thể kết hợp các thành phần này với các thực thể không gian, chẳng hạn như nếu bạn muốn.
Đây là cửa sổ Trình quản lý gói.
Tôi đã làm nổi bật một số gói mà bạn có thể thấy trong một chế độ thiết lập dự án XR thông thường.
Như bạn có thể thấy, chúng ta có AR Foundation, như đã đề cập.
Chúng tôi cũng có trình bổ trợ OpenXR.
Chúng tôi có gói Android XR.
Tôi cũng đã nêu bật một số nền tảng khác vì bạn chắc chắn có thể tạo một dự án biên dịch cho nhiều nền tảng.
Và ở dưới cùng bên phải, chúng ta cũng có một số gói khác.
Lớp thành phần, các lớp này hoạt động với thiết bị OpenXR; Core Utils, rất hữu ích cho mọi thứ liên quan đến XR; sau đó là XR Hands và XR Interaction Toolkit để nhận dữ liệu đầu vào, đây là những thành phần khá thiết yếu.
Tiếp theo, chúng ta sẽ xác thực dự án.
Vì vậy, một lần nữa, đây là một phần của XR Plug-in Management (Quản lý trình bổ trợ XR).
Tính năng xác thực dự án có thể phát hiện các tính năng trùng lặp, cũng như các vấn đề khác trong dự án mà bạn cần khắc phục để dự án chạy được.
Nhưng trong ảnh chụp màn hình này, tôi đã làm nổi bật các tính năng trùng lặp.
Vì vậy, về cơ bản, điều này có nghĩa là hai tính năng giống nhau, chẳng hạn như tôi nghĩ chúng ta có các điểm neo, có thể là mặt phẳng và tia truyền ở đây.
Người dùng đã chọn đưa các bản sao của những tính năng này vào nhiều gói và hệ thống chỉ nhắc người dùng chọn một trong hai.
Giờ chúng ta sẽ chuyển sang phần neo cục bộ và tính bền vững.
Điểm neo đảm bảo rằng nội dung kỹ thuật số luôn ở vị trí mong muốn trong môi trường, bất kể thay đổi đối với trạng thái theo dõi của phiên thực tế tăng cường.
Nền tảng thực tế tăng cường tự động cập nhật tư thế của neo theo thời gian để đảm bảo rằng chúng luôn ở vị trí nhất quán và neo là cách tốt nhất để đảm bảo rằng nội dung của bạn vẫn ở đúng vị trí nếu bạn rời khỏi neo rồi quay lại.
Còn khi người dùng đóng ứng dụng rồi khởi động lại sau đó và quay lại ứng dụng trong một phiên riêng biệt thì sao?
Điểm neo cố định cho phép bạn lưu điểm neo trong một phiên thực tế tăng cường (AR) rồi tải các điểm neo đó trong các phiên tiếp theo.
Các thông báo này vẫn tồn tại trong vòng đời của ứng dụng và khi khởi động lại thiết bị.
Hình dưới đây là mẫu điểm neo cố định trong dự án Mẫu AR Foundation.
Cảnh mẫu có một trình đơn chứa tất cả chức năng được hỗ trợ trên nền tảng đó, chẳng hạn như lưu và tải neo.
Và điều đó đưa chúng ta đến vòng đời của các neo cố định.
Trước tiên, bạn sẽ tạo một neo trên thiết bị, vì vậy, neo này chưa được lưu ở bất cứ đâu, chưa được lưu vào bộ nhớ cố định, chỉ là một neo trên thiết bị.
Sau đó, bạn sẽ lưu trữ dữ liệu đó.
Sau đó, bạn có thể khởi động lại ứng dụng rồi tải ứng dụng từ bộ nhớ.
Một số nền tảng (bao gồm cả Android XR) cũng hỗ trợ xoá hoặc huỷ lưu trữ neo.
Nhà cung cấp Thực thể không gian hỗ trợ tự động tải tất cả neo đã lưu để bạn không phải yêu cầu từng neo theo mã nhận dạng của neo đó theo cách thủ công.
Trong phần cài đặt XR Plug-in Management (Quản lý trình bổ trợ XR), bạn có thể chọn Automatically Load Saved Anchors (Tự động tải các neo đã lưu) trên tính năng Spatial Entities: Anchors (Thực thể không gian: Neo).
Và việc lưu một neo chỉ mất vài dòng mã.
Trước tiên, chúng ta bắt đầu trong trình chỉnh sửa Unity và đảm bảo rằng cảnh của bạn đã sẵn sàng bằng cách thêm thành phần AR Anchor Manager (Trình quản lý neo thực tế tăng cường) vào đối tượng trò chơi XR Origin.
Trình quản lý luôn cập nhật cảnh bằng các neo được theo dõi từ thời gian chạy.
Bây giờ, chúng ta sẽ chuyển sang phần mã.
Để thêm một neo, bạn chỉ cần gọi TryAddAnchorAsync và truyền tư thế của vị trí bạn muốn đặt neo.
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
var result = await manager.TryAddAnchorAsync(pose);
if (result.status.IsError()) {
// handle error
return;
}
var anchor = result.value;
}Tiếp theo, chúng ta sẽ tìm hiểu cách xoá neo.
void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
var result = manager.TryRemoveAnchor(anchor.trackableId);
if (result.status.IsError()) {
// handle error
return;
}
}
void DestroyAnchorComponent(ARAnchor anchor) {
Destroy(anchor);
}Tương tự, bạn chỉ cần thêm một dòng mã.
Bạn gọi TryRemoveAnchor, bạn truyền mã nhận dạng có thể theo dõi của neo.
Khi được tạo, điểm neo đã được cấp một mã nhận dạng có thể theo dõi.
Và sau đó chúng ta có TrySaveAnchorAsync.
async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
var result = await manager.TrySaveAnchorAsync(anchor);
if (result.status.IsError()) {
// handle error
return;
}
// Save this value, then return it as an input parameter
SerializableGuid guid = result.value;
}Bạn truyền vào một điểm neo thực tế tăng cường (AR) làm dữ liệu đầu vào.
Hàm này trả về một SerializableGuid xác định điểm neo trong bộ nhớ ổn định.
Sau này, bạn có thể sử dụng GUID khi tải neo.
Tiếp theo là tải quảng cáo cố định.
async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
var result = await manager.TryLoadAnchorAsync(guid);
if (result.status.IsError()) {
// handle error
return;
}
ARAnchor anchor = result.value;
}Hàm cần gọi ở đây là TryLoadAnchorAsync và bạn truyền vào GUID đã chuyển đổi tuần tự từ trước.
Kết quả là phương thức này sẽ trả về một điểm neo thực tế tăng cường.
Về cơ bản đó chỉ có vậy.
Các hàm này giúp bạn dễ dàng quản lý cả neo cục bộ và neo cố định.
Vì vậy, việc theo dõi điểm neo là một tác vụ khá tốn kém trên hầu hết các nền tảng thực tế tăng cường.
Khi làm việc với neo, hãy cân nhắc các phương pháp hay nhất sau đây: tránh tạo nhiều neo rất gần nhau, cân nhắc xem bạn có thể sử dụng neo gần đó thay vì tạo một neo khác hay không, xoá neo khi bạn không còn sử dụng neo đó nữa và cuối cùng, nếu bạn bật một tính năng thực tế tăng cường khác để giúp tính toán tư thế mong muốn cho một neo, hãy cân nhắc xem bạn có thể tắt tính năng đó sau khi tạo neo thành công hay không.
Giờ tôi xin nhường lại sân khấu cho Levana.
Cảm ơn Jennifer.
Tiếp theo, tôi sẽ giới thiệu cho bạn về những đóng góp của Google cho hành trình Android XR trong Unity.
Vì vậy, ngoài các trình bổ trợ Unity OpenXR mà Jennifer đã giới thiệu, Google còn cung cấp SDK Android XR cho Unity với các tính năng bổ sung có trên nền tảng Android XR.
SDK này chứa nhiều tính năng và gói, và trong buổi nói chuyện này, chúng ta sẽ tập trung vào gói Android XR Extension cho Unity.
Vì vậy, tương tự như Android XR OpenXR và Thực thể không gian OpenXR, gói Android XR Extension for Unity thực chất là một nhà cung cấp OpenXR.
Kiến trúc của gói này trông như thế này và chúng có thể hoạt động song song hoặc độc lập.
Vì vậy, giống như tất cả các nhà cung cấp OpenXR khác, gói của Google được xây dựng trực tiếp trên giao diện OpenXR tiêu chuẩn.
Vì vậy, chúng tôi sẽ trình bày một loạt tính năng để so sánh giữa tất cả các nhà cung cấp khác.
Vì vậy, bạn có thể giúp bạn đưa ra quyết định về thời điểm và lý do nên chọn một trong hai.
Vì vậy, bạn có thể có câu hỏi về điểm đánh dấu thực thể không gian và có thể theo dõi trong bảng này.
Vì vậy, đây là lưu ý bên lề: đối với những người đã từng xây dựng ứng dụng và trải nghiệm trên Android XR, chúng tôi đã cung cấp các tính năng này thông qua các tiện ích có thể theo dõi và chỉ hoạt động trên Android XR.
Sau đó, như Jennifer đã đề cập, chúng tôi làm việc với tư cách là nhóm mở OpenXR, rồi phát hành Tiện ích thực thể không gian ở bên phải và mang đến trải nghiệm nhất quán trên nhiều nền tảng.
Hiện tại, chúng tôi đang ngừng sử dụng tiện ích có thể theo dõi để chuyển sang khung Thực thể không gian.
Không chỉ vì hiệu suất cao hơn mà còn vì khả năng hỗ trợ nhiều nền tảng.
Sau đó, hãy cùng tìm hiểu kỹ hơn về các thực thể không gian.
Vì vậy, ngoài những gì Jennifer đã đề cập về mặt phẳng, truyền tia, neo, bạn cũng có thể tìm thấy tính năng này được hỗ trợ bởi các nhà cung cấp thực thể không gian, chẳng hạn như điểm đánh dấu, có thể phát hiện, giải mã mã vạch 2D tiêu chuẩn và theo dõi vị trí của chúng trong không gian 3D, và hình ảnh sẽ nhận dạng đồ hoạ 2D đã biết và theo dõi chúng trong không gian 3D.
Sau đó là hộp giới hạn, giúp xác định đối tượng vật lý, chẳng hạn như bàn phím, máy tính xách tay hoặc chuột, và theo dõi hộp giới hạn của chúng ở tư thế 3D.
Trong ví dụ tiếp theo, chúng ta sẽ định cấu hình tính năng hộp giới hạn do gói Tiện ích của Google cung cấp.
Vì vậy, chế độ xem này gần như giống nhau đối với tất cả các tính năng của OpenXR.
Vì vậy, trước tiên, bạn chỉ cần chuyển sang nền tảng Android XR, sau đó bật nhà cung cấp OpenXR và chọn tính năng OpenXR mà bạn muốn xây dựng, ví dụ: tính năng hộp giới hạn thực thể không gian được hiển thị ở đây, rồi khắc phục các vấn đề về xác thực dự án.
Việc này sẽ giúp bạn tìm thấy tất cả phần phụ thuộc mà một tính năng nhất định yêu cầu, sau đó giải quyết xung đột do nhiều tính năng cùng đóng góp vào một hệ thống con.
Đôi khi, bạn chỉ cần chọn một tính năng nếu muốn sử dụng, chẳng hạn như neo, mặt phẳng hoặc hộp giới hạn tại đây.
Và cuối cùng, bạn chỉ cần tạo cảnh mẫu hoặc cảnh thử nghiệm.
Để truy cập vào đối tượng có thể theo dõi trong thời gian chạy, bạn chỉ cần thêm thành phần trình quản lý Hộp giới hạn AR. Thành phần này tương tự như Trình quản lý neo AR, sau đó sử dụng giao diện AR Foundation để truy cập vào đối tượng đó.
Ngoài ra, bạn cũng có thể nhập mẫu thực thể không gian do gói tiện ích của chúng tôi cung cấp làm mẫu để bắt đầu.
Sau đây là điểm khác biệt chính khi bạn sử dụng tính năng AR Foundation trên Android XR.
Để hiểu rõ môi trường xung quanh người dùng, ứng dụng của bạn thường cần có quyền truy cập vào dữ liệu nhạy cảm về môi trường.
Để bảo vệ người dùng, Android XR hạn chế quyền truy cập dữ liệu của hệ thống sau khi cấp quyền.
Có thể bạn đã quen với việc đó, chẳng hạn như lệnh gọi quyền thông thường của Android, như quyền truy cập vào camera hoặc quyền truy cập thông tin vị trí, v.v.
Và sau đó, phương pháp hay nhất ở đây là tắt thành phần trình quản lý khi khởi động, từ trình chỉnh sửa (như bạn có thể thấy ở bên phải) hoặc từ tập lệnh (chẳng hạn như sự kiện Awake).
void Awake() {
planeManager = GetComponent<ARPlaneManager>();
planeManager.enabled = false;
boundingBoxManager = GetComponent<ARBoundingBoxManager>();
boundingBoxManager.enabled = false;
permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}
void OnEnable() {
StartCoroutine(WaitForPermissions());
}Sau khi cấp tất cả quyền cần thiết, bạn có thể bật trình quản lý từ tập lệnh, giống như trình trợ giúp WaitForPermissions thực hiện ở đây.
IEnumerator WaitForPermissions() {
planeManager.enabled = false;
boundingBoxManager.enabled = false;
yield return new WaitUntil(() =>
permissionUtil.AllPermissionGranted());
// Enable after granted permissions and
// restart subsystems.
planeManager.enabled = true;
boundingBoxManager.enabled = true;
// Save permission status.
permissionGranted = true;
}Bằng cách này, bạn có thể tránh được lỗi khởi chạy hệ thống con do không đủ quyền.
Và đây là một tính năng đặc biệt.
Như Jennifer đã trình bày về neo bằng AR Foundation, để mở rộng khả năng neo trên Android XR, gói của chúng tôi cũng cung cấp một tính năng mới có tên là neo có thể chia sẻ.
Tính năng này mô phỏng những gì tính năng neo của AR Foundation hiện hỗ trợ, đồng thời cũng đi kèm một số chức năng bổ sung, chẳng hạn như neo không gian địa lý.
Và như bạn có thể hình dung, điểm neo là cầu nối thực sự kết nối thế giới ảo và thế giới thực.
Jennifer đã hướng dẫn chúng ta cách tạo, lưu và tải các đối tượng này, nhưng tất cả đều diễn ra trong không gian cục bộ, chẳng hạn như Living Room của người dùng.
Nhưng còn các quốc gia và vùng lãnh thổ khác thì sao?
Và làm cách nào để chúng ta có thể chia sẻ với nhau?
Và đây là lúc Geospatial API phát huy tác dụng.
Công cụ này cho phép bạn tạo một điểm neo không gian địa lý dựa trên một vị trí trong thế giới thực, chẳng hạn như hiệu sách yêu thích của bạn hoặc một điểm hẹn trong một công viên lớn.
Vì vậy, Geospatial API có thể cung cấp cho bạn trình theo dõi vị trí địa lý chính xác thông qua VPS (còn gọi là hệ thống định vị ảo, giống như GPS), nhưng sử dụng dữ liệu Chế độ xem đường phố ngoài trời để cung cấp kết quả theo dõi chính xác hơn nhiều.
Vì vậy, một số bạn có thể đã quen thuộc với chế độ xem này nếu từng có kinh nghiệm sử dụng tính năng không gian địa lý của ARCore.
Vì vậy, để truy cập vào Geospatial API trên Android XR, trước tiên, chúng ta cần kết nối với phần phụ trợ được lưu trữ trên Google Cloud Platform.
Vì phần phụ trợ không gian địa lý thực sự được cung cấp bởi dịch vụ ARCore trên Google Cloud, nên bạn có thể làm theo chính xác bước tương tự để định cấu hình dự án trên đám mây Google Cloud của mình bằng quyền truy cập API ARCore.
Tất cả những điều này sẽ cho phép sử dụng tính năng Android XR Google Cloud do gói tiện ích của chúng tôi cung cấp.
Sau khi bật Geospatial API và lấy khoá API từ dự án Google Cloud, bạn có thể bật tính năng này và định cấu hình quy trình xác thực thông qua trình đơn cài đặt OpenXR như minh hoạ tại đây, hoặc bạn có thể định cấu hình theo cách thủ công thông qua API tập lệnh có tên là TrySetAuthenticationAsync.
async Task TrySetAuthentication() {
googleCloudFeature =
OpenXRSettings.Instance
.GetFeature<XRGoogleCloudFeature>();
var result = await googleCloudFeature
.TrySetAuthenticationAsync(
strategy, credential);
if (result.IsSuccess()) {
// Ready to use for geospatial tracker.
} else if (result.IsUnsupported()) {
// Google Cloud feature is not supported
} else if (result.IsKeylessError()) {
// Confirm if keyless has been set up properly.
} else {
// Handling other common OpenXR errors.
}
}Xin lưu ý rằng nền tảng Android XR hiện chỉ hỗ trợ phương thức xác thực bằng khoá API, nhưng sẽ hỗ trợ thêm nhiều thông tin xác thực khác trong tương lai.
Vì vậy, sau khi xác thực, bạn có thể sử dụng trình quản lý không gian địa lý để truy cập vào các chức năng không gian địa lý.
Bạn nên kiểm tra Google Maps trước để biết phạm vi cung cấp VPS trước khi tích hợp.
Do đó, bạn cũng phải có quyền truy cập vào mạng khi sử dụng tính năng này.
Vì vậy, XR Geospatial Manager hoạt động tương tự như thành phần Phiên AR do AR Foundation cung cấp.
Vì vậy, nó đi kèm với một thuộc tính trạng thái tĩnh để cho biết khả năng hỗ trợ của hệ thống và trạng thái theo dõi của trình theo dõi không gian địa lý.
Bạn có thể đăng ký sự kiện thay đổi trạng thái bằng một lệnh gọi lại như sau.
void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
// Handle cloud authentication issues.
} else if (isInitFailed) {
// Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
} else {
// Iterate runtime state change, and handle accordingly.
}
}
private void OnEnable() {
XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}Và khi trạng thái không gian địa lý chuyển sang đang chạy, bạn có thể sử dụng thực thể trình quản lý này cho tất cả chức năng sau.
Trước tiên, chẳng hạn như để kiểm tra xem VPS có hoạt động với vị trí GPS đã cho hay không, chúng ta sẽ sử dụng API vị trí của Unity để lấy giá trị GPS, sau đó kiểm tra xem VPS có hoạt động hay không.
async Task CheckVPSAvailability(CancellationToken token) {
var location = Input.location.lastData;
try {
var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
location.latitude, location.longitude);
token.ThrowIfCancellationRequested();
if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
// Invalid coordinates, try with another location.
} else if (result.status.IsError()) {
// Handle common OpenXR error: result.status.ToOpenXRStatus()
} else if (result.value == XRVPSAvailability.Available) {
// You may use this pose to attach geospatial anchors.
var currentGeospatialPose = new XRGeospatialPose(location);
}
}
}Vì vậy, về cơ bản, đây là một giải pháp thay thế nếu bạn không muốn kiểm tra khả năng hỗ trợ VPS thông qua bản đồ, nhưng bạn cần phải ra ngoài để kiểm tra trạng thái GPS thực tế.
Sau đó, bạn cũng có thể chuyển đổi tư thế giữa tư thế Unity và tư thế không gian địa lý bằng TryLocate.
// Geospatial Pose -> Unity Pose
var geospatialPose =
new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
geospatialPose, out XRPoseResult result)) {
if (result.IsPositionValid ||
result.IsPositionTracked) {
transform.position = result.Pose.position;
}
if (result.IsRotationValid ||
result.IsRotationTracked) {
transform.rotation = result.Pose.rotation;
}
}// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
transform.position, transform.rotation);
if (geospatialManager.TryLocate(
pose, out XRGeospatialPoseResult result)) {
if (result.IsPositionValid ||
result.IsRotationValid) {
// You may use for anchor attachment.
}
}Sau đó, khi lấy kết quả từ quy trình kiểm tra VPS hoặc chuyển đổi tư thế, bạn có thể đính kèm neo không gian vào một tư thế không gian địa lý nhất định hoặc trên một loại bề mặt đã biết, chẳng hạn như địa hình hoặc mái nhà.
async void PlaceAnchor(XRGeospatialPose pose) {
try {
Result<ARShareableAnchor> anchorResult;
XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
if (typeToPlace == XRGeospatialSurfaceType.Default) {
anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
} else {
pose.Altitude = 0;
anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
}
if (anchorResult.status.IsSuccess()) {
// ARShareableAnchorManager will track the anchor and update it.
} else {
// Handle OpenXR failures.
}
}
}Sau đó, khi kết hợp tất cả những yếu tố này, bạn có thể xây dựng một số trải nghiệm không gian thực sự kỳ diệu với thế giới thực ở phía trước và trung tâm.
Vì vậy, tại đây, chúng tôi đặt một mũi tên để hướng dẫn đối tượng đến địa điểm mục tiêu trong thế giới thực.
Được rồi.
Vì vậy, SDK Android XR không phải là gói duy nhất mà chúng tôi cung cấp cho nhà phát triển Unity.
SDK Android XR của Google cho Unity hiện cũng bao gồm Android XR Interaction Framework và gói Android XR Audio.
Chúng tôi cũng rất vui mừng khi mở rộng Android XR SDK để hỗ trợ thêm nhiều tính năng và bổ sung thêm nhiều Thực thể không gian.
Được rồi, vậy là chúng ta đã gần kết thúc buổi học.
Bạn có thể theo dõi lộ trình của Unity trên mạng để biết những tính năng sắp ra mắt.
Đừng quên rằng Unity 7, thế hệ tiếp theo của Unity, sẽ ra mắt vào đầu năm sau.
Trong thời gian chờ đợi, bạn có thể dùng thử các công cụ này và tạo một dự án bằng mẫu thực tế hỗn hợp hoặc xem dự án mẫu AR Foundation trên GitHub của chúng tôi.
Ngoài ra, để tìm hiểu thêm về Thực thể không gian và dịch vụ hỗ trợ gói Unity, bạn có thể truy cập vào trang trên trang web dành cho nhà phát triển Android.
Và cuối cùng, xin cảm ơn tất cả các bạn.
Chúng tôi rất mong được thấy những gì bạn có thể xây dựng bằng AR Foundation và Thực thể không gian trên Android XR.
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
var result = await manager.TryAddAnchorAsync(pose);
if (result.status.IsError()) {
// handle error
return;
}
var anchor = result.value;
}void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
var result = manager.TryRemoveAnchor(anchor.trackableId);
if (result.status.IsError()) {
// handle error
return;
}
}
void DestroyAnchorComponent(ARAnchor anchor) {
Destroy(anchor);
}async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
var result = await manager.TrySaveAnchorAsync(anchor);
if (result.status.IsError()) {
// handle error
return;
}
// Save this value, then return it as an input parameter
SerializableGuid guid = result.value;
}async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
var result = await manager.TryLoadAnchorAsync(guid);
if (result.status.IsError()) {
// handle error
return;
}
ARAnchor anchor = result.value;
}void Awake() {
planeManager = GetComponent<ARPlaneManager>();
planeManager.enabled = false;
boundingBoxManager = GetComponent<ARBoundingBoxManager>();
boundingBoxManager.enabled = false;
permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}
void OnEnable() {
StartCoroutine(WaitForPermissions());
}IEnumerator WaitForPermissions() {
planeManager.enabled = false;
boundingBoxManager.enabled = false;
yield return new WaitUntil(() =>
permissionUtil.AllPermissionGranted());
// Enable after granted permissions and
// restart subsystems.
planeManager.enabled = true;
boundingBoxManager.enabled = true;
// Save permission status.
permissionGranted = true;
}async Task TrySetAuthentication() {
googleCloudFeature =
OpenXRSettings.Instance
.GetFeature<XRGoogleCloudFeature>();
var result = await googleCloudFeature
.TrySetAuthenticationAsync(
strategy, credential);
if (result.IsSuccess()) {
// Ready to use for geospatial tracker.
} else if (result.IsUnsupported()) {
// Google Cloud feature is not supported
} else if (result.IsKeylessError()) {
// Confirm if keyless has been set up properly.
} else {
// Handling other common OpenXR errors.
}
}void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
// Handle cloud authentication issues.
} else if (isInitFailed) {
// Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
} else {
// Iterate runtime state change, and handle accordingly.
}
}
private void OnEnable() {
XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}async Task CheckVPSAvailability(CancellationToken token) {
var location = Input.location.lastData;
try {
var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
location.latitude, location.longitude);
token.ThrowIfCancellationRequested();
if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
// Invalid coordinates, try with another location.
} else if (result.status.IsError()) {
// Handle common OpenXR error: result.status.ToOpenXRStatus()
} else if (result.value == XRVPSAvailability.Available) {
// You may use this pose to attach geospatial anchors.
var currentGeospatialPose = new XRGeospatialPose(location);
}
}
}// Geospatial Pose -> Unity Pose
var geospatialPose =
new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
geospatialPose, out XRPoseResult result)) {
if (result.IsPositionValid ||
result.IsPositionTracked) {
transform.position = result.Pose.position;
}
if (result.IsRotationValid ||
result.IsRotationTracked) {
transform.rotation = result.Pose.rotation;
}
}// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
transform.position, transform.rotation);
if (geospatialManager.TryLocate(
pose, out XRGeospatialPoseResult result)) {
if (result.IsPositionValid ||
result.IsRotationValid) {
// You may use for anchor attachment.
}
}async void PlaceAnchor(XRGeospatialPose pose) {
try {
Result<ARShareableAnchor> anchorResult;
XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
if (typeToPlace == XRGeospatialSurfaceType.Default) {
anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
} else {
pose.Altitude = 0;
anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
}
if (anchorResult.status.IsSuccess()) {
// ARShareableAnchorManager will track the anchor and update it.
} else {
// Handle OpenXR failures.
}
}
}