Godot-এ আপনার আগে থেকে কোনও XR প্রোজেক্ট থাকলে, নতুন, আলাদা প্রোজেক্ট শুরু না করেই আপনি Android XR-এর জন্য সহায়তা যোগ করতে পারবেন। কিছু ধাপ সব প্রোজেক্টের জন্য প্রয়োজন, আবার কিছু ধাপ আপনার প্রোজেক্টে ব্যবহৃত XR ফিচারের উপর নির্ভর করে ঐচ্ছিক। ধাপগুলি জুড়ে, আমরা একাধিক ওপেন-সোর্স Godot XR প্রোজেক্টের লিঙ্ক অন্তর্ভুক্ত করেছি যা Android XR-এর জন্য সহায়তা যোগ করেছে, এর সাথে প্রাসঙ্গিক পুল রিকোয়েস্টও রয়েছে যা নির্দিষ্ট ফিচার চালু করার জন্য প্রয়োজনীয় পরিবর্তনগুলি দেখায়।
সব প্রোজেক্টের জন্য প্রয়োজনীয় ধাপ
আপনার প্রোজেক্টে যে ধরনের XR ফিচারই কাজ করুক না কেন, নিম্নলিখিত বিষয়গুলির ধাপ সম্পূর্ণ করুন। তারপরে, আপনার প্রোজেক্টে অতিরিক্ত কাজ করার প্রয়োজন আছে কিনা তা নির্ধারণ করতে ঐচ্ছিক পদক্ষেপের তালিকায় উল্লেখ করা ফিচারগুলি পর্যালোচনা করুন।
Godot এবং Godot OpenXR ভেন্ডর প্লাগ-ইন আপডেট করুন
আপনার প্রোজেক্টকে লেটেস্ট প্রয়োজনীয় ভার্সনে আপডেট করতে এবং Android XR-এর জন্য আপনার প্রোজেক্টের সেটিংস কনফিগার করতে, এইসব ধাপ অনুসরণ করুন:
- আপনার Godot ভার্সন 4.6.2 বা তার পরবর্তী যেকোনও ভার্সনে আপডেট করুন। আপনার প্রোজেক্টের জন্য অতিরিক্ত সাহায্যের প্রয়োজন হলে, নতুন ভার্সনে মাইগ্রেট করা সংক্রান্ত ডকুমেন্টেশন দেখুন।
অ্যাসেট স্টোর, অ্যাসেট লাইব্রেরি বা GitHub-এ রিপোজিটরি থেকে Godot OpenXR ভেন্ডর প্লাগ-ইন ভার্সন ৫.১ বা তার পরবর্তী ভার্সন ডাউনলোড করুন।
Android XR-এর জন্য আপনার প্রোজেক্টের সেটিংস কনফিগার করুন:
- Android XR-এর জন্য এক্সপোর্ট প্রিসেট যোগ করুন।
- Gradle Build ব্যবহার করুন বিকল্প চালু করুন।
- XR ফিচার বিভাগে, XR মোড-এর জন্য OpenXR বেছে নিন, এবং AndroidXR প্লাগ-ইন চালু করুন বিকল্প বেছে নিন।
হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন
কন্ট্রোলার উপলভ্য থাকলেও, Android XR হেডসেট ও XR গ্লাসে ইনপুট দেওয়ার প্রাথমিক পদ্ধতি হল হ্যান্ড ট্র্যাকিং। সম্ভব হলে, আপনার Godot প্রোজেক্টে হ্যান্ড ট্র্যাকিং সহায়তা যোগ করা উচিত।
হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন: প্রোজেক্ট সেটিংস কনফিগার করুন
প্রথমে, হ্যান্ড ট্র্যাকিং ও এর সাথে সম্পর্কিত OpenXR এক্সটেনশন চালু করতে, আপনার প্রোজেক্ট সেটিংস সেট-আপ করার জন্য এইসব ধাপ অনুসরণ করুন।
- আপনার প্রোজেক্টের সেটিংস খুলুন এবং সাধারণ > XR > OpenXR বিকল্পে নেভিগেট করুন।
এক্সটেনশন বিভাগে, হ্যান্ড ট্র্যাকিং এবং হ্যান্ড ইন্টার্যাকশন প্রোফাইল বেছে নিন।
এক্সটেনশন বিভাগের মধ্যে Meta সাবসেকশন খুঁজে নিন এবং হ্যান্ড ট্র্যাকিং মেশ ও হ্যান্ড ট্র্যাকিং লক্ষ্য বিকল্প বেছে নিন।
হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন: কন্ট্রোলার নোড যোগ ও কনফিগার করুন
হ্যান্ড ট্র্যাকিংয়ের জন্য আগে থেকে থাকা XRController3D নোড ডায়নামিকভাবে পরিবর্তন করার পরিবর্তে, হ্যান্ড মডেল ট্র্যাক ও ডিসপ্লে করার জন্য কন্ট্রোলার নোড যোগ করুন, সেইসাথে হ্যান্ড ট্র্যাকিং এইম এক্সটেনশন থেকে ইনপুট ম্যানেজ করুন:
আপনার
XROrigin3Dনোডে আরও তিনটিXRController3Dনোড যোগ করুন।- একটির নাম "HandTrackingLeft" দিন এবং ট্র্যাকার প্রপার্টি
/user/hand_tracker/left-এ সেট করুন। - অন্যটির নাম "HandTrackingRight" দিন এবং ট্র্যাকার প্রপার্টি
/user/hand_tracker/right-এ সেট করুন। - শেষটির নাম "HandTrackingAimLeft" দিন এবং ট্র্যাকার প্রপার্টি
/user/fbhandaim/left-এ সেট করুন।
আপনার প্রোজেক্টের আসল
XRController3Dনোডের নাম যদি "XRController3D_left" এবং "XRController3D_right" হয়, তাহলে আপনার দৃশ্য কিছুটা এইরকম দেখতে হবে:
- একটির নাম "HandTrackingLeft" দিন এবং ট্র্যাকার প্রপার্টি
HandTrackingLeft এবং HandTrackingRight-এ সিগন্যাল
tracking_changedকানেক্ট করুন এমন স্বতন্ত্র ফাংশনে যা সংশ্লিষ্ট কন্ট্রোলার ট্র্যাকারের দৃশ্যমানতা আপডেট করে (আগের উদাহরণে XRController3D_left এবং XRController3D_right)।যেমন, HandTrackingLeft-এ সিগন্যালের সাথে কানেক্ট করা ফাংশন এইরকম দেখতে হতে পারে:
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingহ্যান্ড ট্র্যাকিং কন্ট্রোলার নোডে ট্র্যাক করা হলে দেখান প্রপার্টি চালু করুন।
ব্যবহারকারী হ্যান্ড ট্র্যাকিং নাকি কন্ট্রোলার ব্যবহার করছেন তার উপর নির্ভর করে, আপনার প্রোজেক্ট এখন কন্ট্রোলার মডেল ও হ্যান্ড ট্র্যাকিং মডেলের মধ্যে ভিজ্যুয়ালি অদলবদল করতে পারবে।
আপনার হ্যান্ড ট্র্যাকিং কন্ট্রোলার নোডে চাইল্ড হিসেবে কিছু
OpenXRFbHandTrackingMeshনোড যোগ করুন।মডেলগুলিতে রিয়েল টাইম হ্যান্ড ট্র্যাকিং ডেটা প্রয়োগ করতে, সঠিক হ্যান্ড ট্র্যাকার প্রপার্টি সেট করা হয়েছে কিনা তা নিশ্চিত করে, এই
OpenXRFbHandTrackingMeshনোডগুলিতে চাইল্ড হিসাবেXRHandModifier3Dনোড যোগ করুন।
হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করুন: OpenXR অ্যাকশন ম্যাপে হ্যান্ড ইন্টার্যাকশন প্রোফাইল সেট-আপ করুন
এরপর, আপনি OpenXR অ্যাকশন ম্যাপ-এ হ্যান্ড ইন্টার্যাকশন প্রোফাইল সেট-আপ করবেন:
- এডিটরের নিচে OpenXR অ্যাকশন ম্যাপ মেনু খুলুন।
- Galaxy XR কন্ট্রোলারের সাথে মানানসই হওয়ার সমস্যা এড়াতে Simple Controller প্রোফাইল মুছে দিন।
- প্রোফাইল যোগ করুন বিকল্পে ক্লিক করুন, হ্যান্ড ইন্টার্যাকশন বিকল্প বেছে নিন এবং তারপর ঠিক আছে বিকল্পে ক্লিক করুন।
আপনার পছন্দ অনুযায়ী এক বা একাধিক অ্যাকশন সেটে এই প্রোফাইল ম্যাপ করুন।
আপনার অ্যাপের প্রয়োজনীয়তার উপর নির্ভর করে, হ্যান্ড ট্র্যাকিংয়ের মাধ্যমে আপনার অ্যাপ কীভাবে ব্যবহারকারীর ইনপুট ম্যানেজ করে, তাও আপনি অ্যাডজাস্ট করতে চাইতে পারেন।
হ্যান্ড ট্র্যাকিংয়ের জন্য সহায়তা যোগ করা: Android XR-এর জন্য মেনু জেসচার সেট-আপ করা
সবশেষে, আপনি Android XR-এর জন্য মেনু জেসচার প্রয়োগ করতে পারেন। এটি একটি আইকন দেখায় যখন প্লেয়ারের বাঁ হাত মেনু জেসচার পারফর্ম করার জন্য সঠিক পজিশনে থাকে, পাশাপাশি ব্যবহারকারী জেসচার পারফর্ম করলে মেনু দেখায় বা লুকায়। এটি ম্যানেজ করতে, আপনি HandTrackingAimLeft নোড ব্যবহার করবেন যা আপনি আগেই যোগ করেছেন।
বাঁদিকের হ্যান্ড ট্র্যাকিং নোডে একটি বিলবোর্ড করা কোয়াড যোগ করুন যা আপনার বেছে নেওয়া একটি আইকন দেখায় (আগে যোগ করা কন্ট্রোলার নোড থেকে নিম্নলিখিত ছবিতে MenuIcon নোডটি দেখুন)।
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ভ্যালুXRController3Dinput_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
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- এই কোডটি
pinch_pressedভার্চুয়াল অ্যাকশনের উপর নির্ভর করে যা আপনি বোতাম প্রেস হিসেবে পিঞ্চ রেজিস্টার করার জন্য তৈরি করতে পারবেন।
আর্টিফিশিয়াল লোকোমোশনের সাথে হ্যান্ড ট্র্যাকিং ব্যবহার করুন
আপনার প্রোজেক্টে আর্টিফিশিয়াল লোকোমোশন ব্যবহার করা হলে, হ্যান্ড ট্র্যাকিং সাপোর্ট এখনও সম্ভব। যেমন, আপনি এমন একটি মুভমেন্ট সিস্টেম তৈরি করতে পারেন যা খেলোয়াড়দের জেসচারের মাধ্যমে অতিক্রম করার জন্য পাথ আঁকতে দেয় অথবা আপনি খেলোয়াড়দের গতি বাড়ানোর জন্য তাদের হাত উপরে এবং নিচে পাম্প করার অনুমতি দিতে পারেন, সাথে লাফানো, আরোহণ এবং গ্লাইডিংয়ের জন্য অতিরিক্ত জেসচারও দিতে পারেন।
The Museum of All Things-এ কন্ট্রোলারের থাম্বস্টিক ব্যবহার করে আর্টিফিশিয়াল লোকোমোশন করা যায়। "ভার্চুয়াল থাম্বস্টিক" যোগ করার মাধ্যমে হ্যান্ড ট্র্যাকিং লোকোমোশন প্রয়োগ করা হয়েছে, যা প্লেয়ার শূন্যে পিঞ্চ করে ট্রিগার করেন এবং যেদিকে থাম্বস্টিক সরাতে চান সেদিকে হাত সরান।
পুল রিকোয়েস্ট যা এই সহায়তা প্রয়োগ করেছে, তার থেকে কিছু গুরুত্বপূর্ণ বিষয় এখানে দেওয়া হল:
- পিঞ্চ শনাক্ত করা হলে একটি
XRVirtualThumbstickদৃশ্য ইনস্ট্যান্টিয়েট করা হয়। - পিঞ্চ ধরে রাখার সময়, পিঞ্চের আসল লোকেশন থেকে আপেক্ষিক দূরত্ব ও দিক
Vector2-এ পরিবর্তিত হয় এবং স্বাভাবিক থাম্বস্টিক ইনপুটে ভার্চুয়ালি ম্যাপ করা হয়। - এই ইনপুটের ভিজ্যুয়াল ফিডব্যাকও প্লেয়ারকে দেওয়া হয়, দুটি বিলবোর্ড করা কোয়াড মেশের আকারে, যা থাম্বস্টিকের পজিশন দেখায়।
আপনার আগে থেকে থাকা থাম্বস্টিক-চালিত লোকোমোশন কোড যাতে ন্যূনতম পরিবর্তন করে কাজ করে, তার জন্য আপনি একই ধরনের পদ্ধতি ব্যবহার করে দেখতে পারেন। তবে, আপনার প্রোজেক্টে হ্যান্ড ট্র্যাকিংয়ের জন্য এখনও কাস্টম লোকোমোশন সলিউশনের প্রয়োজন হতে পারে।
পাসথ্রু সহায়তা যোগ করুন
আপনার অ্যাপে পাসথ্রু সাপোর্ট যোগ করতে পারেন যাতে ব্যবহারকারীরা তাদের আশেপাশের বাস্তব পরিবেশ দেখতে পান।
আপনার অ্যাপের জন্য এটি করতে, নিম্নলিখিত কোড পরিবর্তন করুন:
- OpenXR
XRInterface-এরenvironment_blend_modeXR_ENV_BLEND_MODE_ALPHA_BLEND-এ সেট করুন। WorldEnvironmentনোডেরbackground_modeBG_COLOR-এ সেট করুন।WorldEnvironmentনোডেরbackground_colorএমন কোনও রঙে সেট করুন যা সম্পূর্ণরূপে স্বচ্ছ।Viewport transparent_bgপ্রপার্টিকেtrue-এ সেট করুন।
লাইট এস্টিমেশন এক্সটেনশন ব্যবহার করা
পাসথ্রু চালু করার সময়, Android XR Light Estimation OpenXR
এক্সটেনশন ব্যবহার করার কথা বিবেচনা করুন। এই এক্সটেনশন 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-এর আসল দিক ম্যানুয়ালি রিস্টোর করতে হবে। - পাসথ্রু ও লাইট এস্টিমেশন ব্যবহার করে কোনও প্রজেক্টের সম্পূর্ণ উদাহরণ দেখতে, GitLab-এ Expedition to Blobotopia চেক করুন।