หากมีโปรเจ็กต์ XR ใน Godot อยู่แล้ว คุณสามารถเพิ่มการรองรับ Android XR ได้โดยไม่ต้องเริ่มโปรเจ็กต์ใหม่แยกต่างหาก บางขั้นตอนจำเป็นสำหรับโปรเจ็กต์ทั้งหมด ส่วนขั้นตอนอื่นๆ จะไม่บังคับโดยขึ้นอยู่กับฟีเจอร์ XR ที่โปรเจ็กต์ ใช้ ในทุกขั้นตอน เราได้ใส่ลิงก์ไปยังโปรเจ็กต์ Godot XR แบบโอเพนซอร์สหลายโปรเจ็กต์ ที่เพิ่มการรองรับ Android XR รวมถึงคำขอ ดึงข้อมูลที่เกี่ยวข้องซึ่งแสดงการเปลี่ยนแปลงที่จำเป็นในการเปิดใช้ฟีเจอร์บางอย่าง
ขั้นตอนที่ต้องดำเนินการสำหรับโปรเจ็กต์ทั้งหมด
ทำตามขั้นตอนในหัวข้อต่อไปนี้ไม่ว่าโปรเจ็กต์จะรองรับฟีเจอร์ XR ประเภทใดก็ตาม หลังจากนั้น ให้ตรวจสอบฟีเจอร์ที่ระบุไว้ในรายการขั้นตอนที่ไม่บังคับเพื่อดูว่าโปรเจ็กต์ของคุณต้องดำเนินการเพิ่มเติมหรือไม่
อัปเดต Godot และปลั๊กอินผู้ให้บริการ OpenXR ของ Godot
ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตโปรเจ็กต์เป็นเวอร์ชันล่าสุดที่จำเป็นและ กำหนดการตั้งค่าโปรเจ็กต์สำหรับ Android XR
- อัปเดต Godot เป็นเวอร์ชัน 4.6.2 ขึ้นไป โปรดดูเอกสารประกอบเกี่ยวกับการย้ายข้อมูลไปยังเวอร์ชันใหม่หากต้องการความช่วยเหลือเพิ่มเติมสำหรับโปรเจ็กต์
ดาวน์โหลด Godot OpenXR Vendors Plugin เวอร์ชัน 5.1 ขึ้นไปจาก Asset Store, Asset Library หรือที่เก็บใน GitHub
กำหนดค่าการตั้งค่าโปรเจ็กต์สำหรับ Android XR ดังนี้
- เพิ่มค่าที่กำหนดล่วงหน้าสำหรับการส่งออกสำหรับ Android XR
- เปิดใช้ใช้การสร้าง Gradle
- ในส่วนฟีเจอร์ XR ให้เลือก OpenXR สำหรับโหมด XR แล้วเลือกเปิดใช้ปลั๊กอิน AndroidXR
เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ
แม้ว่าตัวควบคุมอาจพร้อมใช้งาน แต่รูปแบบการป้อนข้อมูลหลักในชุดหูฟังและแว่นตา XR ที่ใช้ Android XR คือการติดตามการเคลื่อนไหวของมือ หากเป็นไปได้ คุณควรเพิ่มการรองรับการติดตามมือลงในโปรเจ็กต์ Godot
เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: กำหนดค่าการตั้งค่าโปรเจ็กต์
ก่อนอื่น ให้ทำตามขั้นตอนต่อไปนี้เพื่อตั้งค่าโปรเจ็กต์เพื่อเปิดใช้การติดตามการเคลื่อนไหวของมือ และส่วนขยาย OpenXR ที่เกี่ยวข้อง
- เปิดการตั้งค่าโปรเจ็กต์ แล้วไปที่ทั่วไป > XR > OpenXR
ในส่วนส่วนขยาย ให้เลือกการติดตามมือและโปรไฟล์การโต้ตอบด้วยมือ
ค้นหาส่วนย่อย Meta ในส่วนส่วนขยาย แล้วเลือก Hand Tracking Mesh และ Hand Tracking Aim
เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: เพิ่มและกำหนดค่าโหนดคอนโทรลเลอร์
แทนที่จะแก้ไขโหนด XRController3D ที่มีอยู่แบบไดนามิกสำหรับการติดตามมือ ให้เพิ่มโหนดคอนโทรลเลอร์สำหรับการติดตามและแสดงโมเดลมือ รวมถึงการจัดการอินพุตจากส่วนขยายการเล็งด้วยการติดตามมือ
เพิ่ม
XRController3Dโหนดอีก 3 รายการไปยังXROrigin3Dโหนด- ตั้งชื่อว่า "HandTrackingLeft" และตั้งค่าพร็อพเพอร์ตี้ของเครื่องมือติดตามเป็น
/user/hand_tracker/left - ตั้งชื่ออีกอันว่า "HandTrackingRight" และตั้งค่าพร็อพเพอร์ตี้ของเครื่องติดตามเป็น
/user/hand_tracker/right - ตั้งชื่อ "HandTrackingAimLeft" สุดท้าย และตั้งค่าพร็อพเพอร์ตี้ของเครื่องมือติดตามเป็น
/user/fbhandaim/left
หากตั้งชื่อโหนด
XRController3Dเดิมของโปรเจ็กต์เป็น "XRController3D_left" และ "XRController3D_right" ฉากของคุณจะมีลักษณะ ดังนี้
- ตั้งชื่อว่า "HandTrackingLeft" และตั้งค่าพร็อพเพอร์ตี้ของเครื่องมือติดตามเป็น
เชื่อมต่อสัญญาณ
tracking_changedใน HandTrackingLeft และ HandTrackingRight กับฟังก์ชันแต่ละรายการที่ อัปเดตระดับการมองเห็นของเครื่องมือติดตามคอนโทรลเลอร์ที่เกี่ยวข้อง (XRController3D_left และ XRController3D_right ในตัวอย่างก่อนหน้า)เช่น ฟังก์ชันที่เชื่อมต่อกับสัญญาณใน HandTrackingLeft อาจมีลักษณะดังนี้
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingเปิดใช้พร็อพเพอร์ตี้แสดงเมื่อติดตามในตัวควบคุมการติดตามการเคลื่อนไหวของมือ โหนด
ตอนนี้โปรเจ็กต์ของคุณสามารถสลับระหว่างโมเดลคอนโทรลเลอร์กับโมเดลการติดตามการเคลื่อนไหวของมือได้โดยขึ้นอยู่กับว่าผู้ใช้กำลังใช้การติดตามการเคลื่อนไหวของมือหรือคอนโทรลเลอร์
เพิ่ม
OpenXRFbHandTrackingMeshโหนดบางรายการเป็นโหนดลูกของโหนดการติดตามการเคลื่อนไหวของมือของคอนโทรลเลอร์เพิ่มโหนด
XRHandModifier3Dเป็นโหนดย่อยของโหนดOpenXRFbHandTrackingMeshเหล่านี้ และตรวจสอบว่าได้ตั้งค่าพร็อพเพอร์ตี้ Hand Tracker ที่ถูกต้องแล้ว เพื่อใช้ข้อมูลการติดตามการเคลื่อนไหวของมือแบบเรียลไทม์กับโมเดล
เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: ตั้งค่าโปรไฟล์การโต้ตอบด้วยมือในแผนที่การทำงานของ OpenXR
จากนั้น คุณจะต้องตั้งค่าโปรไฟล์การโต้ตอบด้วยมือในการแมปการดำเนินการ OpenXR ดังนี้
- เปิดเมนูแผนที่การทำงานของ OpenXR ที่ด้านล่างของเครื่องมือแก้ไข
- ลบโปรไฟล์ Simple Controller เพื่อหลีกเลี่ยงปัญหาความเข้ากันได้กับ ตัวควบคุม Galaxy XR
- คลิกเพิ่มโปรไฟล์ เลือกการโต้ตอบด้วยมือ แล้วคลิกตกลง
แมปโปรไฟล์นี้กับชุดการดำเนินการอย่างน้อย 1 ชุดตามที่คุณต้องการ
คุณอาจต้องปรับวิธีที่แอปจัดการข้อมูลจากผู้ใช้ด้วยการติดตามการเคลื่อนไหวของมือด้วย ทั้งนี้ขึ้นอยู่กับข้อกำหนดของแอป
เพิ่มการรองรับการติดตามการเคลื่อนไหวของมือ: ตั้งค่าท่าทางสัมผัสเมนูสำหรับ Android XR
สุดท้าย คุณสามารถใช้ท่าทางสัมผัสเมนูสำหรับ Android XR ได้ ซึ่งจะแสดงไอคอนเมื่อมือซ้ายของผู้เล่นอยู่ในตำแหน่งที่ถูกต้องเพื่อทำท่าทางสัมผัสเมนู รวมถึงแสดงหรือซ่อนเมนูเมื่อผู้ใช้ทำท่าทางสัมผัส คุณจะใช้โหนด HandTrackingAimLeft ที่คุณเพิ่มไว้ก่อนหน้านี้เพื่อจัดการกับสิ่งนี้
เพิ่ม Quad ที่ติดป้ายโฆษณาไปยังโหนดการติดตามการเคลื่อนไหวของมือด้านซ้ายที่แสดงไอคอนที่คุณเลือก (ดูโหนด MenuIcon ในรูปภาพต่อไปนี้จากโหนดตัวควบคุมที่คุณเพิ่มไว้ก่อนหน้านี้)
เชื่อมต่อกับสัญญาณ
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มากกว่าหรือน้อยกว่าเกณฑ์ที่เฉพาะเจาะจง ในสัญญาณXRController3Dinput_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
ประเด็นสำคัญเกี่ยวกับโค้ด
- โค้ดนี้อาศัย
pinch_pressedการดำเนินการเสมือนที่คุณสร้างขึ้นเพื่อ ลงทะเบียนการบีบเป็นปุ่มกด
ใช้การติดตามการเคลื่อนไหวของมือร่วมกับการเคลื่อนที่แบบจำลอง
หากโปรเจ็กต์ของคุณใช้การเคลื่อนที่แบบจำลอง ระบบยังคงรองรับการติดตามการเคลื่อนไหวของมือ เช่น คุณสามารถสร้างระบบการเคลื่อนไหวที่ช่วยให้ผู้เล่นวาดเส้นทางเพื่อเคลื่อนที่ด้วยท่าทางสัมผัส หรืออนุญาตให้ผู้เล่นปั๊มมือขึ้นและลงเพื่อเร่งความเร็ว พร้อมท่าทางสัมผัสเพิ่มเติมสำหรับการกระโดด ปีน และร่อน
The Museum of All Things มีการเคลื่อนที่แบบจำลองโดยใช้ ก้านควบคุมบนคอนโทรลเลอร์ การเคลื่อนที่ด้วยการติดตามการเคลื่อนไหวของมือทำได้โดย การเพิ่ม "อนาล็อกเสมือน" ที่ผู้เล่นจะเรียกใช้ได้ด้วยการบีบนิ้วกลางอากาศ และขยับมือไปในทิศทางที่ต้องการให้อนาล็อกเคลื่อนที่
ประเด็นสำคัญบางส่วนจากPull Request ที่ใช้การรองรับนี้มีดังนี้
- ระบบจะสร้างอินสแตนซ์
XRVirtualThumbstickฉากเมื่อตรวจพบการบีบ - ขณะที่บีบอยู่ ระบบจะเปลี่ยนระยะทางและทิศทางสัมพัทธ์จาก
ตำแหน่งที่บีบครั้งแรกเป็น
Vector2และแมปเสมือนกับการ ป้อนข้อมูลด้วยอนาล็อกปกติ - นอกจากนี้ ระบบยังแสดงความคิดเห็นด้วยภาพเกี่ยวกับการป้อนข้อมูลนี้ต่อผู้เล่นในรูปแบบของ Quad Mesh ที่ติดป้ายโฆษณา 2 รายการ ซึ่งแสดงตำแหน่งของ Thumbstick
คุณลองใช้วิธีที่คล้ายกันเพื่อทำให้โค้ดการเคลื่อนที่ที่ขับเคลื่อนด้วยก้านควบคุมที่มีอยู่ทำงานได้โดยมีการเปลี่ยนแปลงน้อยที่สุด อย่างไรก็ตาม โปรเจ็กต์ของคุณอาจยังคงต้องใช้โซลูชันการเคลื่อนที่ที่กำหนดเองสำหรับการติดตามการเคลื่อนไหวของมือ
เพิ่มการรองรับการส่งผ่าน
คุณสามารถเพิ่มการรองรับการส่งผ่านไปยังแอปเพื่อให้ผู้ใช้เห็นสภาพแวดล้อมจริงรอบตัว
หากต้องการดำเนินการนี้กับแอป ให้ทำการเปลี่ยนแปลงโค้ดต่อไปนี้
- ตั้งค่า
environment_blend_modeของ OpenXRXRInterfaceเป็นXR_ENV_BLEND_MODE_ALPHA_BLEND - ตั้งค่า
background_modeของโหนดWorldEnvironmentเป็นBG_COLOR - ตั้งค่า
background_colorของโหนดWorldEnvironmentเป็นสีใดก็ได้ที่ โปร่งใสทั้งหมด - ตั้งค่าพร็อพเพอร์ตี้
Viewport transparent_bgเป็นtrue
ใช้ส่วนขยายการประมาณแสง
เมื่อเปิดใช้การส่งผ่าน ให้พิจารณาใช้ส่วนขยาย OpenXR
การประมาณแสงของ Android XR ส่วนขยายนี้จะปรับแต่งพร็อพเพอร์ตี้ของ WorldEnvironment และ
DirectionalLight3D เพื่อจำลองแสงสว่างในสภาพแวดล้อมจริงของผู้ใช้ได้ดียิ่งขึ้น
เพื่อให้วัตถุเสมือนผสานรวมกับสภาพแสงในโลกจริงได้ดียิ่งขึ้น
คุณเปิดใช้ส่วนขยายนี้ได้ในการตั้งค่าของโปรเจ็กต์
- เปิดการตั้งค่าโปรเจ็กต์ แล้วไปที่ทั่วไป > XR > OpenXR
ในส่วน Androidxr ให้เลือกการประมาณแสง
เพิ่มโหนด
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