আগে থেকে থাকা Godot XR প্রোজেক্টে Android XR-এর জন্য সহায়তা যোগ করা

প্রযোজ্য XR ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরনের XR ডিভাইসের জন্য অভিজ্ঞতা তৈরি করতে সাহায্য করে।
XR হেডসেট
তারযুক্ত XR গ্লাস

Godot-এ আপনার আগে থেকে কোনও XR প্রোজেক্ট থাকলে, নতুন, আলাদা প্রোজেক্ট শুরু না করেই আপনি Android XR-এর জন্য সহায়তা যোগ করতে পারবেন। কিছু ধাপ সব প্রোজেক্টের জন্য প্রয়োজন, আবার কিছু ধাপ আপনার প্রোজেক্টে ব্যবহৃত XR ফিচারের উপর নির্ভর করে ঐচ্ছিক। ধাপগুলি জুড়ে, আমরা একাধিক ওপেন-সোর্স Godot XR প্রোজেক্টের লিঙ্ক অন্তর্ভুক্ত করেছি যা Android XR-এর জন্য সহায়তা যোগ করেছে, এর সাথে প্রাসঙ্গিক পুল রিকোয়েস্টও রয়েছে যা নির্দিষ্ট ফিচার চালু করার জন্য প্রয়োজনীয় পরিবর্তনগুলি দেখায়।

সব প্রোজেক্টের জন্য প্রয়োজনীয় ধাপ

আপনার প্রোজেক্টে যে ধরনের XR ফিচারই কাজ করুক না কেন, নিম্নলিখিত বিষয়গুলির ধাপ সম্পূর্ণ করুন। তারপরে, আপনার প্রোজেক্টে অতিরিক্ত কাজ করার প্রয়োজন আছে কিনা তা নির্ধারণ করতে ঐচ্ছিক পদক্ষেপের তালিকায় উল্লেখ করা ফিচারগুলি পর্যালোচনা করুন।

Godot এবং Godot OpenXR ভেন্ডর প্লাগ-ইন আপডেট করুন

আপনার প্রোজেক্টকে লেটেস্ট প্রয়োজনীয় ভার্সনে আপডেট করতে এবং Android XR-এর জন্য আপনার প্রোজেক্টের সেটিংস কনফিগার করতে, এইসব ধাপ অনুসরণ করুন:

  1. আপনার Godot ভার্সন 4.6.2 বা তার পরবর্তী যেকোনও ভার্সনে আপডেট করুন। আপনার প্রোজেক্টের জন্য অতিরিক্ত সাহায্যের প্রয়োজন হলে, নতুন ভার্সনে মাইগ্রেট করা সংক্রান্ত ডকুমেন্টেশন দেখুন।
  2. অ্যাসেট স্টোর, অ্যাসেট লাইব্রেরি বা GitHub-এ রিপোজিটরি থেকে Godot OpenXR ভেন্ডর প্লাগ-ইন ভার্সন ৫.১ বা তার পরবর্তী ভার্সন ডাউনলোড করুন।

  3. Android XR-এর জন্য আপনার প্রোজেক্টের সেটিংস কনফিগার করুন:

    1. Android XR-এর জন্য এক্সপোর্ট প্রিসেট যোগ করুন।
    2. Gradle Build ব্যবহার করুন বিকল্প চালু করুন।

    চালু করুন

    1. XR ফিচার বিভাগে, XR মোড-এর জন্য OpenXR বেছে নিন, এবং AndroidXR প্লাগ-ইন চালু করুন বিকল্প বেছে নিন।

    এতে বিকল্প কনফিগার করুন

হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন

কন্ট্রোলার উপলভ্য থাকলেও, Android XR হেডসেট ও XR গ্লাসে ইনপুট দেওয়ার প্রাথমিক পদ্ধতি হল হ্যান্ড ট্র্যাকিং। সম্ভব হলে, আপনার Godot প্রোজেক্টে হ্যান্ড ট্র্যাকিং সহায়তা যোগ করা উচিত।

হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন: প্রোজেক্ট সেটিংস কনফিগার করুন

প্রথমে, হ্যান্ড ট্র্যাকিং ও এর সাথে সম্পর্কিত OpenXR এক্সটেনশন চালু করতে, আপনার প্রোজেক্ট সেটিংস সেট-আপ করার জন্য এইসব ধাপ অনুসরণ করুন।

  1. আপনার প্রোজেক্টের সেটিংস খুলুন এবং সাধারণ > XR > OpenXR বিকল্পে নেভিগেট করুন।
  2. এক্সটেনশন বিভাগে, হ্যান্ড ট্র্যাকিং এবং হ্যান্ড ইন্টার‍্যাকশন প্রোফাইল বেছে নিন।

    এতে বিকল্প কনফিগার করুন

  3. এক্সটেনশন বিভাগের মধ্যে Meta সাবসেকশন খুঁজে নিন এবং হ্যান্ড ট্র্যাকিং মেশ ও হ্যান্ড ট্র্যাকিং লক্ষ্য বিকল্প বেছে নিন।

    এতে বিকল্প কনফিগার করুন

হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন: কন্ট্রোলার নোড যোগ ও কনফিগার করুন

হ্যান্ড ট্র্যাকিংয়ের জন্য আগে থেকে থাকা XRController3D নোড ডায়নামিকভাবে পরিবর্তন করার পরিবর্তে, হ্যান্ড মডেল ট্র্যাক ও ডিসপ্লে করার জন্য কন্ট্রোলার নোড যোগ করুন, সেইসাথে হ্যান্ড ট্র্যাকিং এইম এক্সটেনশন থেকে ইনপুট ম্যানেজ করুন:

  1. আপনার XROrigin3D নোডে আরও তিনটি XRController3D নোড যোগ করুন।

    1. একটির নাম "HandTrackingLeft" দিন এবং ট্র্যাকার প্রপার্টি /user/hand_tracker/left-এ সেট করুন।
    2. অন্যটির নাম "HandTrackingRight" দিন এবং ট্র্যাকার প্রপার্টি /user/hand_tracker/right-এ সেট করুন।
    3. শেষটির নাম "HandTrackingAimLeft" দিন এবং ট্র্যাকার প্রপার্টি /user/fbhandaim/left-এ সেট করুন।

    আপনার প্রোজেক্টের আসল XRController3D নোডের নাম যদি "XRController3D_left" এবং "XRController3D_right" হয়, তাহলে আপনার দৃশ্য কিছুটা এইরকম দেখতে হবে:

    কন্ট্রোলার নোড যোগ করার পরে আপনার দৃশ্য কেমন হতে পারে।

  2. HandTrackingLeft এবং HandTrackingRight-এ সিগন্যাল tracking_changed কানেক্ট করুন এমন স্বতন্ত্র ফাংশনে যা সংশ্লিষ্ট কন্ট্রোলার ট্র্যাকারের দৃশ্যমানতা আপডেট করে (আগের উদাহরণে XRController3D_left এবং XRController3D_right)।

    যেমন, HandTrackingLeft-এ সিগন্যালের সাথে কানেক্ট করা ফাংশন এইরকম দেখতে হতে পারে:

    func _on_hand_tracking_left_hand_tracking_changed(tracking):
        $XROrigin3D/XRController3D_left.visible = not tracking
    
  3. হ্যান্ড ট্র্যাকিং কন্ট্রোলার নোডে ট্র্যাক করা হলে দেখান প্রপার্টি চালু করুন।

    ব্যবহারকারী হ্যান্ড ট্র্যাকিং নাকি কন্ট্রোলার ব্যবহার করছেন তার উপর নির্ভর করে, আপনার প্রোজেক্ট এখন কন্ট্রোলার মডেল ও হ্যান্ড ট্র্যাকিং মডেলের মধ্যে ভিজ্যুয়ালি অদলবদল করতে পারবে।

  4. আপনার হ্যান্ড ট্র্যাকিং কন্ট্রোলার নোডে চাইল্ড হিসেবে কিছু OpenXRFbHandTrackingMesh নোড যোগ করুন।

  5. মডেলগুলিতে রিয়েল টাইম হ্যান্ড ট্র্যাকিং ডেটা প্রয়োগ করতে, সঠিক হ্যান্ড ট্র্যাকার প্রপার্টি সেট করা হয়েছে কিনা তা নিশ্চিত করে, এই OpenXRFbHandTrackingMesh নোডগুলিতে চাইল্ড হিসাবে XRHandModifier3D নোড যোগ করুন।

    আপনার কন্ট্রোলার নোডে চাইল্ড নোড যোগ করার পরে আপনার দৃশ্যটি কেমন হতে পারে।

হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন: OpenXR অ্যাকশন ম্যাপে হ্যান্ড ইন্টার‍্যাকশন প্রোফাইল সেট-আপ করুন

এরপর, আপনি OpenXR অ্যাকশন ম্যাপ-এ হ্যান্ড ইন্টার‍্যাকশন প্রোফাইল সেট-আপ করবেন:

  1. এডিটরের নিচে OpenXR অ্যাকশন ম্যাপ মেনু খুলুন।
  2. Galaxy XR কন্ট্রোলারের সাথে মানানসই হওয়ার সমস্যা এড়াতে Simple Controller প্রোফাইল মুছে দিন।
  3. প্রোফাইল যোগ করুন বিকল্পে ক্লিক করুন, হ্যান্ড ইন্টার‍্যাকশন বিকল্প বেছে নিন এবং তারপর ঠিক আছে বিকল্পে ক্লিক করুন।
  4. আপনার পছন্দ অনুযায়ী এক বা একাধিক অ্যাকশন সেটে এই প্রোফাইল ম্যাপ করুন।

আপনার অ্যাপের প্রয়োজনীয়তার উপর নির্ভর করে, হ্যান্ড ট্র্যাকিংয়ের মাধ্যমে আপনার অ্যাপ কীভাবে ব্যবহারকারীর ইনপুট ম্যানেজ করে, তাও আপনি অ্যাডজাস্ট করতে চাইতে পারেন।

হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করা: Android XR-এর জন্য মেনু জেসচার সেট-আপ করা

সবশেষে, আপনি Android XR-এর জন্য মেনু জেসচার প্রয়োগ করতে পারেন। এটি একটি আইকন দেখায় যখন প্লেয়ারের বাঁ হাত মেনু জেসচার পারফর্ম করার জন্য সঠিক পজিশনে থাকে, পাশাপাশি ব্যবহারকারী জেসচার পারফর্ম করলে মেনু দেখায় বা লুকায়। এটি ম্যানেজ করতে, আপনি HandTrackingAimLeft নোড ব্যবহার করবেন যা আপনি আগেই যোগ করেছেন।

  1. বাঁদিকের হ্যান্ড ট্র্যাকিং নোডে একটি বিলবোর্ড করা কোয়াড যোগ করুন যা আপনার বেছে নেওয়া একটি আইকন দেখায় (আগে যোগ করা কন্ট্রোলার নোড থেকে নিম্নলিখিত ছবিতে MenuIcon নোডটি দেখুন)।

    আপনার কন্ট্রোলার নোডে চাইল্ড নোড যোগ করার পরে আপনার দৃশ্যটি কেমন হতে পারে।

  2. HandTrackingAimLeft-এ button_pressed এবং button_released সিগন্যালের সাথে কানেক্ট করুন যাতে এই ধরনের ফাংশন কাজ করে:

    @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-এ, সিস্টেমের অনেক মৌলিক অ্যাকশনের জন্য পিঞ্চ করা ব্যবহার করা হয়, যেমন আইটেম বেছে নেওয়া, স্ক্রল করা, উইন্ডো সরানো বা ছোট বড় করা এবং 2D ও 3D স্পেসে UI এলিমেন্ট বা অবজেক্ট সরানো। এই প্যাটার্নের সাথে সামঞ্জস্য রাখতে এবং ব্যবহারকারীর অভিজ্ঞতা একই রকম রাখতে, হ্যান্ড ট্র্যাকিং ব্যবহার করার সময় আপনার অ্যাপে পিঞ্চ করার অ্যাকশনকে কন্ট্রোলারে বোতাম প্রেস করার মতো একইভাবে রেজিস্টার করা উচিত।

এইভাবে আপনার অ্যাপ কনফিগার করতে, ভার্চুয়াল অ্যাকশন তৈরি করার জন্য আপনার তৈরি করা হ্যান্ড ইন্টার‍্যাকশন প্রোফাইল থেকে পাওয়া ফ্লোট ভ্যালু ব্যবহার করুন:

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 টুল ফাংশন কাজ করার জন্য, যেমন মেনু ইন্টারঅ্যাকশনের জন্য FunctionPointer, ব্যবহারকারী হ্যান্ড ট্র্যাকিংয়ে সুইচ করলে, এটি যে অ্যাকশন খুঁজছে তা সোয়্যাপ করার জন্য আপনার কিছু অতিরিক্ত কোডের প্রয়োজন হবে।

যেমন, মেনু ইন্টার‍্যাকশনের জন্য FunctionPointer ব্যবহার করার সময়, active_button_action প্রপার্টি আপডেট করে হ্যান্ড-ট্র্যাকিং অ্যাকশনে সেট করুন। এটি হ্যান্ড-ট্র্যাকিংয়ের জন্য XRController3D নোডের tracking_changed সিগন্যালের উপর ভিত্তি করে করা হয় (এই নোডগুলি আগের হ্যান্ড ট্র্যাকিং সেট-আপ করার ধাপ-এ 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-এ কন্ট্রোলারের থাম্বস্টিক ব্যবহার করে আর্টিফিশিয়াল লোকোমোশন করা যায়। "ভার্চুয়াল থাম্বস্টিক" যোগ করার মাধ্যমে হ্যান্ড ট্র্যাকিং লোকোমোশন প্রয়োগ করা হয়েছে, যা প্লেয়ার শূন্যে পিঞ্চ করে ট্রিগার করেন এবং যেদিকে থাম্বস্টিক সরাতে চান সেদিকে হাত সরান।

পুল রিকোয়েস্ট যা এই সহায়তা প্রয়োগ করেছে, তার থেকে কিছু গুরুত্বপূর্ণ বিষয় এখানে দেওয়া হল:

  • পিঞ্চ শনাক্ত করা হলে একটি XRVirtualThumbstick দৃশ্য ইনস্ট্যান্টিয়েট করা হয়।
  • পিঞ্চ ধরে রাখার সময়, পিঞ্চের আসল লোকেশন থেকে আপেক্ষিক দূরত্ব ও দিক Vector2-এ পরিবর্তিত হয় এবং স্বাভাবিক থাম্বস্টিক ইনপুটে ভার্চুয়ালি ম্যাপ করা হয়।
  • এই ইনপুটের ভিজ্যুয়াল ফিডব্যাকও প্লেয়ারকে দেওয়া হয়, দুটি বিলবোর্ড করা কোয়াড মেশের আকারে, যা থাম্বস্টিকের পজিশন দেখায়।

আপনার আগে থেকে থাকা থাম্বস্টিক-চালিত লোকোমোশন কোড যাতে ন্যূনতম পরিবর্তন করে কাজ করে, তার জন্য আপনি একই ধরনের পদ্ধতি ব্যবহার করে দেখতে পারেন। তবে, আপনার প্রোজেক্টে হ্যান্ড ট্র্যাকিংয়ের জন্য এখনও কাস্টম লোকোমোশন সলিউশনের প্রয়োজন হতে পারে।

পাসথ্রু সহায়তা যোগ করুন

আপনার অ্যাপে পাসথ্রু সাপোর্ট যোগ করতে পারেন যাতে ব্যবহারকারীরা তাদের আশেপাশের বাস্তব পরিবেশ দেখতে পান।

আপনার অ্যাপের জন্য এটি করতে, নিম্নলিখিত কোড পরিবর্তন করুন:

  • OpenXR XRInterface-এর environment_blend_mode XR_ENV_BLEND_MODE_ALPHA_BLEND-এ সেট করুন।
  • WorldEnvironment নোডের background_mode BG_COLOR-এ সেট করুন।
  • WorldEnvironment নোডের background_color এমন কোনও রঙে সেট করুন যা সম্পূর্ণরূপে স্বচ্ছ।
  • Viewport transparent_bg প্রপার্টিকে true-এ সেট করুন।

লাইট এস্টিমেশন এক্সটেনশন ব্যবহার করা

পাসথ্রু চালু করার সময়, Android XR Light Estimation OpenXR এক্সটেনশন ব্যবহার করার কথা বিবেচনা করুন। এই এক্সটেনশন 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-এর আসল দিক ম্যানুয়ালি রিস্টোর করতে হবে।
  • পাসথ্রু ও লাইট এস্টিমেশন ব্যবহার করে কোনও প্রজেক্টের সম্পূর্ণ উদাহরণ দেখতে, GitLab-এ Expedition to Blobotopia চেক করুন।