เพิ่มการรองรับ Android XR ลงในโปรเจ็กต์ Godot XR ที่มีอยู่

อุปกรณ์ XR ที่รองรับ
คำแนะนำนี้จะช่วยคุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทนี้
ชุดหูฟัง XR
แว่นตา XR แบบมีสาย

หากมีโปรเจ็กต์ XR ใน Godot อยู่แล้ว คุณสามารถเพิ่มการรองรับ Android XR ได้โดยไม่ต้องเริ่มโปรเจ็กต์ใหม่แยกต่างหาก บางขั้นตอนจำเป็นสำหรับโปรเจ็กต์ทั้งหมด ส่วนขั้นตอนอื่นๆ จะไม่บังคับโดยขึ้นอยู่กับฟีเจอร์ XR ที่โปรเจ็กต์ ใช้ ในทุกขั้นตอน เราได้ใส่ลิงก์ไปยังโปรเจ็กต์ Godot XR แบบโอเพนซอร์สหลายโปรเจ็กต์ ที่เพิ่มการรองรับ Android XR รวมถึงคำขอ ดึงข้อมูลที่เกี่ยวข้องซึ่งแสดงการเปลี่ยนแปลงที่จำเป็นในการเปิดใช้ฟีเจอร์บางอย่าง

ขั้นตอนที่ต้องดำเนินการสำหรับโปรเจ็กต์ทั้งหมด

ทำตามขั้นตอนในหัวข้อต่อไปนี้ไม่ว่าโปรเจ็กต์จะรองรับฟีเจอร์ XR ประเภทใดก็ตาม หลังจากนั้น ให้ตรวจสอบฟีเจอร์ที่ระบุไว้ในรายการขั้นตอนที่ไม่บังคับเพื่อดูว่าโปรเจ็กต์ของคุณต้องดำเนินการเพิ่มเติมหรือไม่

อัปเดต Godot และปลั๊กอินผู้ให้บริการ OpenXR ของ Godot

ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตโปรเจ็กต์เป็นเวอร์ชันล่าสุดที่จำเป็นและ กำหนดการตั้งค่าโปรเจ็กต์สำหรับ Android XR

  1. อัปเดต Godot เป็นเวอร์ชัน 4.6.2 ขึ้นไป โปรดดูเอกสารประกอบเกี่ยวกับการย้ายข้อมูลไปยังเวอร์ชันใหม่หากต้องการความช่วยเหลือเพิ่มเติมสำหรับโปรเจ็กต์
  2. ดาวน์โหลด Godot OpenXR Vendors Plugin เวอร์ชัน 5.1 ขึ้นไปจาก Asset Store, Asset Library หรือที่เก็บใน GitHub

  3. กำหนดค่าการตั้งค่าโปรเจ็กต์สำหรับ Android XR ดังนี้

    1. เพิ่มค่าที่กำหนดล่วงหน้าสำหรับการส่งออกสำหรับ Android XR
    2. เปิดใช้ใช้การสร้าง Gradle

    เปิดใช้

    1. ในส่วนฟีเจอร์ XR ให้เลือก OpenXR สำหรับโหมด XR แล้วเลือกเปิดใช้ปลั๊กอิน AndroidXR

    กำหนดค่าตัวเลือกใน

เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ

แม้ว่าตัวควบคุมอาจพร้อมใช้งาน แต่รูปแบบการป้อนข้อมูลหลักในชุดหูฟังและแว่นตา XR ที่ใช้ Android XR คือการติดตามการเคลื่อนไหวของมือ หากเป็นไปได้ คุณควรเพิ่มการรองรับการติดตามมือลงในโปรเจ็กต์ Godot

เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: กำหนดค่าการตั้งค่าโปรเจ็กต์

ก่อนอื่น ให้ทำตามขั้นตอนต่อไปนี้เพื่อตั้งค่าโปรเจ็กต์เพื่อเปิดใช้การติดตามการเคลื่อนไหวของมือ และส่วนขยาย OpenXR ที่เกี่ยวข้อง

  1. เปิดการตั้งค่าโปรเจ็กต์ แล้วไปที่ทั่วไป > XR > OpenXR
  2. ในส่วนส่วนขยาย ให้เลือกการติดตามมือและโปรไฟล์การโต้ตอบด้วยมือ

    กำหนดค่าตัวเลือกใน

  3. ค้นหาส่วนย่อย Meta ในส่วนส่วนขยาย แล้วเลือก Hand Tracking Mesh และ Hand Tracking Aim

    กำหนดค่าตัวเลือกใน

เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: เพิ่มและกำหนดค่าโหนดคอนโทรลเลอร์

แทนที่จะแก้ไขโหนด XRController3D ที่มีอยู่แบบไดนามิกสำหรับการติดตามมือ ให้เพิ่มโหนดคอนโทรลเลอร์สำหรับการติดตามและแสดงโมเดลมือ รวมถึงการจัดการอินพุตจากส่วนขยายการเล็งด้วยการติดตามมือ

  1. เพิ่มXRController3Dโหนดอีก 3 รายการไปยังXROrigin3Dโหนด

    1. ตั้งชื่อว่า "HandTrackingLeft" และตั้งค่าพร็อพเพอร์ตี้ของเครื่องมือติดตามเป็น /user/hand_tracker/left
    2. ตั้งชื่ออีกอันว่า "HandTrackingRight" และตั้งค่าพร็อพเพอร์ตี้ของเครื่องติดตามเป็น /user/hand_tracker/right
    3. ตั้งชื่อ "HandTrackingAimLeft" สุดท้าย และตั้งค่าพร็อพเพอร์ตี้ของเครื่องมือติดตามเป็น /user/fbhandaim/left

    หากตั้งชื่อโหนด XRController3D เดิมของโปรเจ็กต์เป็น "XRController3D_left" และ "XRController3D_right" ฉากของคุณจะมีลักษณะ ดังนี้

    ฉากของคุณอาจมีลักษณะดังนี้หลังจากเพิ่มโหนดตัวควบคุม

  2. เชื่อมต่อสัญญาณ tracking_changed ใน HandTrackingLeft และ HandTrackingRight กับฟังก์ชันแต่ละรายการที่ อัปเดตระดับการมองเห็นของเครื่องมือติดตามคอนโทรลเลอร์ที่เกี่ยวข้อง (XRController3D_left และ XRController3D_right ในตัวอย่างก่อนหน้า)

    เช่น ฟังก์ชันที่เชื่อมต่อกับสัญญาณใน HandTrackingLeft อาจมีลักษณะดังนี้

    func _on_hand_tracking_left_hand_tracking_changed(tracking):
        $XROrigin3D/XRController3D_left.visible = not tracking
    
  3. เปิดใช้พร็อพเพอร์ตี้แสดงเมื่อติดตามในตัวควบคุมการติดตามการเคลื่อนไหวของมือ โหนด

    ตอนนี้โปรเจ็กต์ของคุณสามารถสลับระหว่างโมเดลคอนโทรลเลอร์กับโมเดลการติดตามการเคลื่อนไหวของมือได้โดยขึ้นอยู่กับว่าผู้ใช้กำลังใช้การติดตามการเคลื่อนไหวของมือหรือคอนโทรลเลอร์

  4. เพิ่มOpenXRFbHandTrackingMeshโหนดบางรายการเป็นโหนดลูกของโหนดการติดตามการเคลื่อนไหวของมือของคอนโทรลเลอร์

  5. เพิ่มโหนด XRHandModifier3D เป็นโหนดย่อยของโหนด OpenXRFbHandTrackingMesh เหล่านี้ และตรวจสอบว่าได้ตั้งค่าพร็อพเพอร์ตี้ Hand Tracker ที่ถูกต้องแล้ว เพื่อใช้ข้อมูลการติดตามการเคลื่อนไหวของมือแบบเรียลไทม์กับโมเดล

    ฉากของคุณอาจมีลักษณะดังนี้หลังจากเพิ่มโหนดลูกไปยังโหนดคอนโทรลเลอร์

เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: ตั้งค่าโปรไฟล์การโต้ตอบด้วยมือในแผนที่การทำงานของ OpenXR

จากนั้น คุณจะต้องตั้งค่าโปรไฟล์การโต้ตอบด้วยมือในการแมปการดำเนินการ OpenXR ดังนี้

  1. เปิดเมนูแผนที่การทำงานของ OpenXR ที่ด้านล่างของเครื่องมือแก้ไข
  2. ลบโปรไฟล์ Simple Controller เพื่อหลีกเลี่ยงปัญหาความเข้ากันได้กับ ตัวควบคุม Galaxy XR
  3. คลิกเพิ่มโปรไฟล์ เลือกการโต้ตอบด้วยมือ แล้วคลิกตกลง
  4. แมปโปรไฟล์นี้กับชุดการดำเนินการอย่างน้อย 1 ชุดตามที่คุณต้องการ

คุณอาจต้องปรับวิธีที่แอปจัดการข้อมูลจากผู้ใช้ด้วยการติดตามการเคลื่อนไหวของมือด้วย ทั้งนี้ขึ้นอยู่กับข้อกำหนดของแอป

เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: ตั้งค่าท่าทางสัมผัสเมนูสำหรับ Android XR

สุดท้าย คุณสามารถใช้ท่าทางสัมผัสเมนูสำหรับ Android XR ได้ ซึ่งจะแสดงไอคอนเมื่อมือซ้ายของผู้เล่นอยู่ในตำแหน่งที่ถูกต้องเพื่อทำท่าทางสัมผัสเมนู รวมถึงแสดงหรือซ่อนเมนูเมื่อผู้ใช้ทำท่าทางสัมผัส คุณจะใช้โหนด HandTrackingAimLeft ที่คุณเพิ่มไว้ก่อนหน้านี้เพื่อจัดการกับสิ่งนี้

  1. เพิ่ม Quad ที่ติดป้ายโฆษณาไปยังโหนดการติดตามการเคลื่อนไหวของมือด้านซ้ายที่แสดงไอคอนที่คุณเลือก (ดูโหนด MenuIcon ในรูปภาพต่อไปนี้จากโหนดตัวควบคุมที่คุณเพิ่มไว้ก่อนหน้านี้)

    ฉากของคุณอาจมีลักษณะดังนี้หลังจากเพิ่มโหนดลูกไปยังโหนดคอนโทรลเลอร์

  2. เชื่อมต่อกับสัญญาณ button_pressed และ button_released ใน HandTrackingAimLeft กับฟังก์ชันต่างๆ เช่น ฟังก์ชันนี้

    @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
    

ขั้นตอนที่ไม่บังคับสำหรับฟีเจอร์บางอย่าง

หลังจากทำตามขั้นตอนที่จำเป็นสำหรับโปรเจ็กต์แล้ว คุณจะตัดสินใจได้ว่าจะต้องดำเนินการเพิ่มเติมสำหรับฟีเจอร์บางอย่างหรือไม่ ทั้งนี้ขึ้นอยู่กับข้อกำหนดและความสามารถของแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์เสริมแต่ละรายการได้ในส่วนต่อไปนี้

ลงทะเบียนการบีบเป็นปุ่มกด

ใน Android XR การบีบใช้สำหรับการดำเนินการพื้นฐานของระบบหลายอย่าง เช่น การเลือกรายการ การเลื่อน การย้ายหรือปรับขนาดหน้าต่าง และการย้ายองค์ประกอบ UI หรือออบเจ็กต์ในพื้นที่ 2 มิติและ 3 มิติ เพื่อให้สอดคล้องกับรูปแบบเหล่านี้และส่งเสริมประสบการณ์ของผู้ใช้ที่สม่ำเสมอ แอปของคุณควรกำหนดการลงทะเบียนการบีบคล้ายกับการกดปุ่มบนคอนโทรลเลอร์เมื่อใช้การติดตามการเคลื่อนไหวของมือ

หากต้องการกําหนดค่าแอปในลักษณะนี้ ให้ใช้ค่าลอยที่ได้รับจากโปรไฟล์การโต้ตอบด้วยมือที่คุณสร้างขึ้นเพื่อสร้างการกระทําเสมือนจริง

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)

ประเด็นสำคัญเกี่ยวกับโค้ด

  • ตรวจสอบว่าค่า float มากกว่าหรือน้อยกว่าเกณฑ์ที่เฉพาะเจาะจง ในสัญญาณ XRController3D input_float_changed
  • สร้างการดำเนินการเสมือนชื่อ pinch_pressed

ใช้ฟังก์ชันของเครื่องมือ XR ร่วมกับการติดตามการเคลื่อนไหวของมือ

โปรเจ็กต์ Godot XR หลายโปรเจ็กต์ใช้ Godot XR Tools รวมถึงโปรเจ็กต์โอเพนซอร์สบางโปรเจ็กต์ที่ลิงก์ในหน้านี้ ฟังก์ชันบางอย่างของ XR Tools เช่น FunctionPointer สำหรับการโต้ตอบกับเมนู จะต้องมีโค้ดเพิ่มเติมเพื่อสลับการทำงานที่กำลังค้นหาเมื่อผู้ใช้เปลี่ยนไปใช้การติดตามการเคลื่อนไหวของมือ

เช่น เมื่อใช้ FunctionPointer สำหรับการโต้ตอบกับเมนู ให้อัปเดตพร็อพเพอร์ตี้ active_button_action เป็นการดำเนินการติดตามการเคลื่อนไหวของมือตามสัญญาณ tracking_changed ของโหนด XRController3D สำหรับการติดตามการเคลื่อนไหวของมือ (โหนดเหล่านี้คือ HandTrackingLeft และ HandTrackingRight ในขั้นตอนการตั้งค่าการติดตาม การเคลื่อนไหวของมือก่อนหน้า)

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

ประเด็นสำคัญเกี่ยวกับโค้ด

ใช้การติดตามการเคลื่อนไหวของมือร่วมกับการเคลื่อนที่แบบจำลอง

หากโปรเจ็กต์ของคุณใช้การเคลื่อนที่แบบจำลอง ระบบยังคงรองรับการติดตามการเคลื่อนไหวของมือ เช่น คุณสามารถสร้างระบบการเคลื่อนไหวที่ช่วยให้ผู้เล่นวาดเส้นทางเพื่อเคลื่อนที่ด้วยท่าทางสัมผัส หรืออนุญาตให้ผู้เล่นปั๊มมือขึ้นและลงเพื่อเร่งความเร็ว พร้อมท่าทางสัมผัสเพิ่มเติมสำหรับการกระโดด ปีน และร่อน

The Museum of All Things มีการเคลื่อนที่แบบจำลองโดยใช้ ก้านควบคุมบนคอนโทรลเลอร์ การเคลื่อนที่ด้วยการติดตามการเคลื่อนไหวของมือทำได้โดย การเพิ่ม "อนาล็อกเสมือน" ที่ผู้เล่นจะเรียกใช้ได้ด้วยการบีบนิ้วกลางอากาศ และขยับมือไปในทิศทางที่ต้องการให้อนาล็อกเคลื่อนที่

ประเด็นสำคัญบางส่วนจากPull Request ที่ใช้การรองรับนี้มีดังนี้

  • ระบบจะสร้างอินสแตนซ์XRVirtualThumbstickฉากเมื่อตรวจพบการบีบ
  • ขณะที่บีบอยู่ ระบบจะเปลี่ยนระยะทางและทิศทางสัมพัทธ์จาก ตำแหน่งที่บีบครั้งแรกเป็น Vector2 และแมปเสมือนกับการ ป้อนข้อมูลด้วยอนาล็อกปกติ
  • นอกจากนี้ ระบบยังแสดงความคิดเห็นด้วยภาพเกี่ยวกับการป้อนข้อมูลนี้ต่อผู้เล่นในรูปแบบของ Quad Mesh ที่ติดป้ายโฆษณา 2 รายการ ซึ่งแสดงตำแหน่งของ Thumbstick

คุณลองใช้วิธีที่คล้ายกันเพื่อทำให้โค้ดการเคลื่อนที่ที่ขับเคลื่อนด้วยก้านควบคุมที่มีอยู่ทำงานได้โดยมีการเปลี่ยนแปลงน้อยที่สุด อย่างไรก็ตาม โปรเจ็กต์ของคุณอาจยังคงต้องใช้โซลูชันการเคลื่อนที่ที่กำหนดเองสำหรับการติดตามการเคลื่อนไหวของมือ

เพิ่มการรองรับการส่งผ่าน

คุณสามารถเพิ่มการรองรับการส่งผ่านไปยังแอปเพื่อให้ผู้ใช้เห็นสภาพแวดล้อมจริงรอบตัว

หากต้องการดำเนินการนี้กับแอป ให้ทำการเปลี่ยนแปลงโค้ดต่อไปนี้

  • ตั้งค่า environment_blend_mode ของ OpenXR XRInterface เป็น XR_ENV_BLEND_MODE_ALPHA_BLEND
  • ตั้งค่า background_mode ของโหนด WorldEnvironment เป็น BG_COLOR
  • ตั้งค่า background_color ของโหนด WorldEnvironment เป็นสีใดก็ได้ที่ โปร่งใสทั้งหมด
  • ตั้งค่าพร็อพเพอร์ตี้ Viewport transparent_bg เป็น true

ใช้ส่วนขยายการประมาณแสง

เมื่อเปิดใช้การส่งผ่าน ให้พิจารณาใช้ส่วนขยาย OpenXR การประมาณแสงของ Android XR ส่วนขยายนี้จะปรับแต่งพร็อพเพอร์ตี้ของ WorldEnvironment และ DirectionalLight3D เพื่อจำลองแสงสว่างในสภาพแวดล้อมจริงของผู้ใช้ได้ดียิ่งขึ้น เพื่อให้วัตถุเสมือนผสานรวมกับสภาพแสงในโลกจริงได้ดียิ่งขึ้น คุณเปิดใช้ส่วนขยายนี้ได้ในการตั้งค่าของโปรเจ็กต์

  1. เปิดการตั้งค่าโปรเจ็กต์ แล้วไปที่ทั่วไป > XR > OpenXR
  2. ในส่วน Androidxr ให้เลือกการประมาณแสง

    กำหนดค่าตัวเลือกใน

  3. เพิ่มโหนด OpenXRAndroidLightEstimation ลงในแผนผังฉากและเชื่อมต่อกับ WorldEnvironment และ DirectionalLight3D ของฉาก

    ตัวเลือกสำหรับ

ตัวอย่าง: เปิดหรือปิดใช้การส่งผ่านและการประมาณแสง

โค้ดต่อไปนี้จะเปิดหรือปิดใช้การส่งผ่านและการประมาณค่าแสง

@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
ประเด็นสำคัญเกี่ยวกับโค้ด
  • เมื่อปิดใช้การประมาณแสง คุณต้องกู้คืนทิศทางเดิมของ DirectionalLight3Dด้วยตนเอง
  • ดูตัวอย่างโปรเจ็กต์แบบเต็มที่ใช้การส่งผ่านและค่าประมาณแสงได้ใน Expedition to Blobotopia บน GitLab