Nếu có một dự án XR hiện tại trong Godot, bạn có thể thêm dịch vụ hỗ trợ cho Android XR mà không cần bắt đầu một dự án mới, riêng biệt. Một số bước là bắt buộc đối với tất cả các dự án, trong khi những bước khác là không bắt buộc tuỳ thuộc vào các tính năng XR mà dự án của bạn sử dụng. Trong các bước này, chúng tôi đã thêm đường liên kết đến nhiều dự án Godot XR nguồn mở có hỗ trợ Android XR, cùng với các yêu cầu kéo có liên quan minh hoạ những thay đổi cần thiết để bật một số tính năng.
Các bước bắt buộc đối với tất cả dự án
Hoàn tất các bước trong các chủ đề sau, bất kể dự án của bạn hỗ trợ loại tính năng XR nào. Sau đó, hãy xem xét các tính năng được nêu trong danh sách các bước không bắt buộc để xác định xem dự án của bạn có cần thực hiện thêm việc gì không.
Cập nhật Godot và Trình bổ trợ nhà cung cấp OpenXR của Godot
Hãy làm theo các bước sau để cập nhật dự án của bạn lên các phiên bản bắt buộc mới nhất và định cấu hình chế độ cài đặt của dự án cho Android XR:
- Cập nhật Godot lên phiên bản 4.6.2 trở lên. Hãy xem tài liệu về di chuyển sang phiên bản mới nếu bạn cần được trợ giúp thêm cho dự án của mình.
Tải Godot OpenXR Vendors Plugin phiên bản 5.1 trở lên xuống từ Asset Store, Asset Library hoặc kho lưu trữ trên GitHub.
Định cấu hình chế độ cài đặt dự án cho Android XR:
- Thêm một giá trị đặt trước để xuất sang Android XR.
- Bật chế độ Sử dụng bản dựng Gradle.
- Trong phần XR Features (Tính năng XR), hãy chọn OpenXR cho XR Mode (Chế độ XR) và chọn Enable AndroidXR Plugin (Bật trình bổ trợ AndroidXR).
Thêm tính năng hỗ trợ theo dõi cử động của tay
Mặc dù có thể có bộ điều khiển, nhưng phương thức nhập chính trên thiết bị đeo đầu Android XR và kính thông minh XR là tính năng theo dõi cử động của tay. Nếu có thể, bạn nên thêm tính năng hỗ trợ theo dõi bàn tay vào dự án Godot của mình.
Thêm tính năng hỗ trợ theo dõi cử động của tay: Định cấu hình cài đặt dự án
Trước tiên, hãy làm theo các bước sau để thiết lập chế độ cài đặt dự án nhằm bật tính năng theo dõi bàn tay và các tiện ích OpenXR có liên quan.
- Mở phần cài đặt dự án rồi chuyển đến General > XR > OpenXR (Chung > XR > OpenXR).
Trong phần Tiện ích, hãy chọn Theo dõi bàn tay và Hồ sơ tương tác bằng tay.
Tìm tiểu mục Meta trong mục Tiện ích, rồi chọn Lưới theo dõi bàn tay và Mục tiêu theo dõi bàn tay.
Thêm tính năng hỗ trợ theo dõi cử động của tay: Thêm và định cấu hình các nút bộ điều khiển
Thay vì sửa đổi động các nút XRController3D hiện có để theo dõi bàn tay, hãy thêm các nút bộ điều khiển để theo dõi và hiển thị các mô hình bàn tay, cũng như xử lý dữ liệu đầu vào từ tiện ích Theo dõi bàn tay để nhắm mục tiêu:
Thêm 3 nút
XRController3Dkhác vào nútXROrigin3D.- Đặt tên cho một "HandTrackingLeft" và đặt thuộc tính trình theo dõi thành
/user/hand_tracker/left. - Đặt tên cho một "HandTrackingRight" khác và đặt thuộc tính trình theo dõi thành
/user/hand_tracker/right. - Đặt tên cho "HandTrackingAimLeft" cuối cùng và đặt thuộc tính trình theo dõi thành
/user/fbhandaim/left.
Nếu các nút
XRController3Dban đầu của dự án được đặt tên là "XRController3D_left" và "XRController3D_right", thì cảnh của bạn sẽ có dạng như sau:
- Đặt tên cho một "HandTrackingLeft" và đặt thuộc tính trình theo dõi thành
Kết nối tín hiệu
tracking_changedtrên HandTrackingLeft và HandTrackingRight với các hàm riêng lẻ giúp cập nhật chế độ hiển thị của các trình theo dõi bộ điều khiển tương ứng (XRController3D_left và XRController3D_right trong ví dụ trước).Ví dụ: hàm được kết nối với tín hiệu trên HandTrackingLeft có thể có dạng như sau:
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingBật thuộc tính Show When Tracked (Hiện khi được theo dõi) trên các nút bộ điều khiển theo dõi cử động của tay.
Giờ đây, dự án của bạn có thể chuyển đổi trực quan giữa các mô hình bộ điều khiển và mô hình theo dõi cử động của tay, tuỳ thuộc vào việc người dùng đang sử dụng tính năng theo dõi cử động của tay hay bộ điều khiển.
Thêm một số nút
OpenXRFbHandTrackingMeshlàm nút con vào các nút bộ điều khiển theo dõi cử động của tay.Thêm các nút
XRHandModifier3Dlàm nút con vào các nútOpenXRFbHandTrackingMeshnày, đảm bảo bạn đã đặt đúng thuộc tính Hand Tracker để áp dụng dữ liệu theo dõi cử động của tay theo thời gian thực cho các mô hình.
Thêm tính năng hỗ trợ theo dõi cử động của tay: Thiết lập hồ sơ Tương tác bằng tay trên Bản đồ hành động OpenXR
Tiếp theo, bạn sẽ thiết lập hồ sơ Hand Interaction (Tương tác bằng tay) trên OpenXR Action Map (Bảng thao tác OpenXR):
- Mở trình đơn OpenXR Action Map ở cuối trình chỉnh sửa.
- Xoá hồ sơ Simple Controller để tránh các vấn đề về khả năng tương thích với bộ điều khiển Galaxy XR.
- Nhấp vào Add Profile (Thêm hồ sơ), chọn Hand Interaction (Tương tác bằng tay), rồi nhấp vào OK.
Bạn có thể liên kết hồ sơ này với một hoặc nhiều nhóm thao tác theo ý muốn.
Tuỳ thuộc vào yêu cầu của ứng dụng, bạn cũng có thể muốn điều chỉnh cách ứng dụng xử lý hoạt động đầu vào của người dùng bằng tính năng theo dõi cử động của tay.
Thêm tính năng hỗ trợ theo dõi cử động của tay: Thiết lập cử chỉ trên trình đơn cho Android XR
Cuối cùng, bạn có thể triển khai cử chỉ trình đơn cho Android XR. Thao tác này sẽ hiện một biểu tượng khi tay trái của người chơi ở đúng vị trí để thực hiện cử chỉ mở trình đơn, cũng như hiện hoặc ẩn trình đơn khi người dùng thực hiện cử chỉ. Bạn sẽ sử dụng nút HandTrackingAimLeft mà bạn đã thêm trước đó để xử lý việc này.
Thêm một tứ giác được quảng cáo vào nút theo dõi cử động của tay bên trái, hiển thị một biểu tượng mà bạn đã chọn (xem nút MenuIcon trong hình ảnh sau đây từ các nút bộ điều khiển mà bạn đã thêm trước đó).
Kết nối với các tín hiệu
button_pressedvàbutton_releasedtrên HandTrackingAimLeft với các hàm như hàm này:@onready var menu_icon: MeshInstance3D = $XROrigin3D/HandTrackingLeft/MenuIcon func _on_hand_tracking_aim_left_button_pressed(p_name): if p_name == "menu_pressed": toggle_menu() elif p_name == "menu_gesture": if OS.has_feature("androidxr"): menu_icon.visible = true func _on_hand_tracking_aim_left_button_released(p_name): if p_name == "menu_gesture": menu_icon.visible = false
Các bước không bắt buộc đối với một số tính năng
Sau khi hoàn tất các bước bắt buộc cho dự án của mình, bạn sẽ quyết định xem có cần thực hiện thêm việc gì cho một số tính năng hay không, tuỳ thuộc vào các yêu cầu và khả năng của ứng dụng. Để biết thêm thông tin về từng tính năng không bắt buộc này, hãy xem các phần sau.
Đăng ký thao tác chụm như thao tác nhấn nút
Trong Android XR, cử chỉ chụm được dùng cho nhiều thao tác cơ bản của hệ thống, chẳng hạn như chọn các mục, cuộn, di chuyển hoặc đổi kích thước cửa sổ, cũng như di chuyển các phần tử hoặc đối tượng trên giao diện người dùng trong không gian 2D và 3D. Để phù hợp với các mô thức này và mang đến trải nghiệm người dùng nhất quán, ứng dụng của bạn nên đăng ký cử chỉ chụm tương tự như thao tác nhấn nút trên bộ điều khiển khi sử dụng tính năng theo dõi cử động của tay.
Để định cấu hình ứng dụng theo cách này, hãy sử dụng các giá trị dấu phẩy động do Hồ sơ tương tác bằng tay mà bạn đã tạo cung cấp để tạo một thao tác ảo:
const PRESSED_THRESHOLD := 0.8
const RELEASED_THRESHOLD := 0.6
@onready var left_controller: XRController3D = $XROrigin/XRController3D_left
func _on_xr_controller_3d_left_input_float_changed(p_name: String, value: float):
if p_name == "pinch":
var xr_tracker = XRServer.get_tracker(left_controller.tracker)
if _left_hand_pinching:
if value < RELEASED_THRESHOLD:
_left_hand_pinching = false
xr_tracker.set_input("pinch_pressed", false)
else:
if value > PRESSED_THRESHOLD:
_left_hand_pinching = true
xr_tracker.set_input("pinch_pressed", true)
Các điểm chính về mã
- Kiểm tra xem giá trị
floatcó lớn hơn hoặc nhỏ hơn các ngưỡng cụ thể trong tín hiệuXRController3Dinput_float_changedhay không. - Tạo một thao tác ảo có tên là
pinch_pressed.
Sử dụng các chức năng của XR Tools cùng với tính năng theo dõi cử động của tay
Nhiều dự án Godot XR sử dụng Godot XR Tools, bao gồm cả một số dự án nguồn mở được liên kết trong trang này. Để một số chức năng của XR Tools hoạt động, chẳng hạn như FunctionPointer cho các hoạt động tương tác trên trình đơn, bạn sẽ cần thêm một số mã để hoán đổi thao tác mà chức năng này đang tìm kiếm khi người dùng chuyển sang tính năng theo dõi cử động của tay.
Ví dụ: khi sử dụng FunctionPointer cho các lượt tương tác với trình đơn, hãy cập nhật thuộc tính active_button_action thành thao tác theo dõi cử động của tay dựa trên tín hiệu tracking_changed của các nút XRController3D để theo dõi cử động của tay (các nút này là HandTrackingLeft và HandTrackingRight trong các bước thiết lập tính năng theo dõi cử động của tay trước đó).
const TRIGGER_POINTER_ACTION = "trigger_click"
const PINCH_POINTER_ACTION = "pinch_pressed"
@onready var func_point_left: XRToolsFunctionPointer = %FunctionPointerLeft
func _on_hand_tracking_left_tracking_changed(tracking: bool) -> void:
if tracking:
func_point_left.active_button_action = PINCH_POINTER_ACTION
else:
func_point_left.active_button_action = TRIGGER_POINTER_ACTION
Các điểm chính về mã
- Đoạn mã này dựa vào một thao tác ảo
pinch_pressedmà bạn có thể tạo để đăng ký các thao tác chụm như thao tác nhấn nút.
Sử dụng tính năng theo dõi cử động của tay cùng với tính năng di chuyển nhân tạo
Nếu dự án của bạn sử dụng chuyển động nhân tạo, thì bạn vẫn có thể hỗ trợ tính năng theo dõi cử động của tay. Ví dụ: bạn có thể tạo một hệ thống di chuyển cho phép người chơi vẽ đường đi bằng cử chỉ, hoặc bạn có thể cho phép người chơi vung tay lên xuống để tăng tốc, cùng với các cử chỉ bổ sung để nhảy, leo trèo và lướt.
The Museum of All Things có tính năng di chuyển nhân tạo bằng cách sử dụng cần điều khiển trên bộ điều khiển. Chế độ di chuyển bằng tính năng theo dõi cử động của tay được triển khai bằng cách thêm "cần điều khiển ảo" mà người chơi kích hoạt bằng cách chụm ngón tay trong không trung và di chuyển bàn tay theo hướng mà họ muốn cần điều khiển di chuyển.
Sau đây là một số điểm chính cần ghi nhớ trong yêu cầu kéo đã triển khai tính năng hỗ trợ này:
- Một cảnh
XRVirtualThumbsticksẽ được tạo thực thể khi phát hiện thấy thao tác chụm. - Trong khi bạn giữ thao tác chụm, khoảng cách và hướng tương đối so với vị trí chụm ban đầu sẽ chuyển thành
Vector2và được liên kết ảo với chế độ đầu vào thông thường của cần điều khiển. - Phản hồi trực quan về dữ liệu đầu vào này cũng được cung cấp cho người chơi dưới dạng hai lưới tứ giác được quảng cáo trên bảng quảng cáo, minh hoạ vị trí của cần điều khiển.
Bạn có thể thử một phương pháp tương tự để làm cho mã di chuyển hiện có dựa trên cần điều khiển hoạt động với những thay đổi tối thiểu. Tuy nhiên, dự án của bạn vẫn có thể cần một giải pháp di chuyển tuỳ chỉnh để theo dõi cử động của tay.
Thêm chế độ hỗ trợ truyền qua
Bạn có thể thêm tính năng hỗ trợ truyền qua vào ứng dụng để người dùng có thể nhìn thấy môi trường xung quanh trong thế giới thực.
Để thực hiện việc này cho ứng dụng của bạn, hãy thực hiện các thay đổi sau đây về mã:
- Đặt
environment_blend_modecủaXRInterfaceOpenXR thànhXR_ENV_BLEND_MODE_ALPHA_BLEND. - Đặt
background_modecủa nútWorldEnvironmentthànhBG_COLOR. - Đặt
background_colorcủa nútWorldEnvironmentthành bất kỳ màu nào hoàn toàn trong suốt. - Đặt thuộc tính
Viewport transparent_bgthànhtrue.
Sử dụng tiện ích ước tính ánh sáng
Khi bật chế độ truyền qua, hãy cân nhắc sử dụng tiện ích Android XR Light Estimation OpenXR. Tiện ích này điều chỉnh các thuộc tính của WorldEnvironment và DirectionalLight3D để mô phỏng tốt hơn ánh sáng của môi trường thực tế của người dùng, nhờ đó các đối tượng ảo sẽ hoà trộn tốt hơn với điều kiện ánh sáng thực tế. Bạn có thể bật tiện ích này trong phần cài đặt của dự án.
- Mở phần cài đặt dự án rồi chuyển đến General > XR > OpenXR (Chung > XR > OpenXR).
Trong phần Androidxr, hãy chọn Light Estimation (Ước tính ánh sáng).
Thêm một nút
OpenXRAndroidLightEstimationvào cây cảnh của bạn và kết nối nút đó vớiWorldEnvironmentvàDirectionalLight3Dcủa cảnh.
Ví dụ: Bật hoặc tắt tính năng truyền qua và ước tính ánh sáng
Đoạn mã sau đây cho phép bật hoặc tắt tính năng truyền qua và ước tính ánh sáng:
@onready var world_environment = $WorldEnvironment
@onready var directional_light = $DirectionalLight3D
@onready var directional_light_orig_transform: Transform3D = directional_light.transform
func set_passthrough_enabled(p_enabled: bool) -> void:
var xr_interface = XRServer.find_interface("OpenXR")
if xr_interface == null:
return
var supported_blend_modes = xr_interface.get_supported_environment_blend_modes()
if not supported_blend_modes.has(XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND):
return
# Passthrough
if p_enabled:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_STAGE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
world_environment.environment.background_mode = Environment.BG_COLOR
world_environment.environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
get_viewport().transparent_bg = true
else:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_ROOMSCALE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
world_environment.environment.background_mode = Environment.BG_SKY
get_viewport().transparent_bg = false
# Light Estimation
if OS.has_feature("androidxr"):
var light_estimation = Engine.get_singleton("OpenXRAndroidLightEstimationExtension")
if p_enabled and light_estimation.is_light_estimation_supported():
light_estimation.start_light_estimation()
elif light_estimation.is_light_estimation_started():
light_estimation.stop_light_estimation()
directional_light.transform = directional_light_orig_transform
Các điểm chính về mã
- Khi tắt tính năng ước tính ánh sáng, bạn phải khôi phục hướng ban đầu của
DirectionalLight3Dtheo cách thủ công. - Để xem ví dụ đầy đủ về một dự án sử dụng tính năng truyền qua và Ước tính ánh sáng, hãy xem Expedition to Blobotopia trên GitLab.