Thêm tính năng hỗ trợ Android XR vào một dự án XR hiện có trên Godot

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

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:

  1. 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.
  2. 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.

  3. Định cấu hình chế độ cài đặt dự án cho Android XR:

    1. Thêm một giá trị đặt trước để xuất sang Android XR.
    2. Bật chế độ Sử dụng bản dựng Gradle.

    Bật

    1. 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).

    Định cấu hình các lựa chọn trong

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.

  1. Mở phần cài đặt dự án rồi chuyển đến General > XR > OpenXR (Chung > XR > OpenXR).
  2. Trong phần Tiện ích, hãy chọn Theo dõi bàn tayHồ sơ tương tác bằng tay.

    Định cấu hình các lựa chọn trong

  3. Tìm tiểu mục Meta trong mục Tiện ích, rồi chọn Lưới theo dõi bàn tayMục tiêu theo dõi bàn tay.

    Định cấu hình các lựa chọn trong

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:

  1. Thêm 3 nút XRController3D khác vào nút XROrigin3D.

    1. Đặt tên cho một "HandTrackingLeft" và đặt thuộc tính trình theo dõi thành /user/hand_tracker/left.
    2. Đặ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.
    3. Đặ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 XRController3D ban đầ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:

    Cảnh của bạn có thể trông như thế này sau khi bạn thêm các nút bộ điều khiển.

  2. Kết nối tín hiệu tracking_changed trên HandTrackingLeftHandTrackingRight 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_leftXRController3D_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 tracking
    
  3. Bậ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.

  4. Thêm một số nút OpenXRFbHandTrackingMesh làm nút con vào các nút bộ điều khiển theo dõi cử động của tay.

  5. Thêm các nút XRHandModifier3D làm nút con vào các nút OpenXRFbHandTrackingMesh nà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.

    Cảnh của bạn có thể trông như thế này sau khi bạn thêm các nút con vào nút bộ điều khiển.

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

  1. Mở trình đơn OpenXR Action Map ở cuối trình chỉnh sửa.
  2. 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.
  3. 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.
  4. 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 HandTrackingAimLeftbạn đã thêm trước đó để xử lý việc này.

  1. 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 đó).

    Cảnh của bạn có thể trông như thế này sau khi bạn thêm các nút con vào nút bộ điều khiển.

  2. Kết nối với các tín hiệu button_pressedbutton_released trê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ị float có lớn hơn hoặc nhỏ hơn các ngưỡng cụ thể trong tín hiệu XRController3D input_float_changed hay 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à HandTrackingLeftHandTrackingRight 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ã

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 XRVirtualThumbstick sẽ đượ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 Vector2 và đượ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_mode của XRInterface OpenXR thành XR_ENV_BLEND_MODE_ALPHA_BLEND.
  • Đặt background_mode của nút WorldEnvironment thành BG_COLOR.
  • Đặt background_color của nút WorldEnvironment thành bất kỳ màu nào hoàn toàn trong suốt.
  • Đặt thuộc tính Viewport transparent_bg thành true.

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 WorldEnvironmentDirectionalLight3D để 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.

  1. Mở phần cài đặt dự án rồi chuyển đến General > XR > OpenXR (Chung > XR > OpenXR).
  2. Trong phần Androidxr, hãy chọn Light Estimation (Ước tính ánh sáng).

    Định cấu hình các lựa chọn trong

  3. Thêm một nút OpenXRAndroidLightEstimation vào cây cảnh của bạn và kết nối nút đó với WorldEnvironmentDirectionalLight3D của cảnh.

    Các lựa chọn cho

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 DirectionalLight3D theo 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.