Godot-এ স্পেশিয়াল কন্টেনার ব্যবহার করা

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

স্পেশিয়াল কন্টেনার আপনার অ্যাপকে ফুল স্পেস মোডে সিস্টেম-ম্যানেজ করা 3D ভলিউমেট্রিক বাউন্ডিং বক্সের মধ্যে 3D OpenXR কন্টেন্ট রেন্ডার করতে দেয়, অথবা রানটাইমে ফুল-স্ক্রিন আনবাউন্ডেড অভিজ্ঞতায় ট্রানজিশন করতে দেয়।

আপনার প্রোজেক্টে স্পেশিয়াল কন্টেনার কনফিগার ও ব্যবহার করতে এই নির্দেশিকা অনুসরণ করুন।

Android XR-এ ফুল স্পেস মোডে একাধিক স্পেশিয়াল কন্টেনার চলছে।
ছবি ১. ফুল স্পেস মোডে স্পেশিয়াল কন্টেনার, যার মধ্যে রয়েছে ফ্লোর-লক করা 3D টেরেন কন্টেনার এবং 2D UI-এর সাথে পেয়ার করা 3D মডেল।

স্পেশিয়াল কন্টেনার কীভাবে কাজ করে

আপনার প্রোজেক্ট সেটিংসে স্পেশিয়াল কন্টেনার চালু করলে:

  • আপনার সম্পূর্ণ অ্যাক্টিভ 3D দৃশ্য একটিমাত্র প্রাইমারি স্পেশিয়াল কন্টেনারের মধ্যে প্লেস করা হয় যা দৃশ্যের উৎস (0, 0, 0)-এর কেন্দ্রে থাকে। কন্টেনারের মধ্যে রাখার জন্য আপনাকে আলাদা আলাদা Node3D নোড ট্যাগ বা অ্যাসাইন করতে হবে না।
  • আপনার প্রোজেক্ট সেটিংসে কনফিগার করা বাউন্ডস মোড (Bounded বা Immersive) এবং প্রাথমিক বাউন্ডস ডাইমেনশন ব্যবহার করে আপনার অ্যাপ ম্যানেজ করা ফুল স্পেস মোডে লঞ্চ হয়। বাউন্ডেড মোডে, সিস্টেম অটোমেটিক আপনার দৃশ্যের যেকোনও 3D জিওমেট্রি ক্লিপ করে যা বাউন্ডিং বক্সের ডাইমেনশনের বাইরে প্রসারিত হয়।
  • ডিফল্ট হিসেবে, Android XR সিস্টেম উইন্ডো কন্ট্রোল প্রদান করে যাতে ব্যবহারকারী 3D স্পেসে বাউন্ডেড কন্টেনার গ্র্যাব, মুভ ও রিপজিশন করতে অথবা মিনিমাইজ ও বন্ধ করতে পারেন। রানটাইমে, আপনার অ্যাপ কন্টেনারের সাইজ পরিবর্তন করতে, বাউন্ডেড মোড (OpenXRSpatialContainerState.BOUNDED) এবং ফুল-স্ক্রিন ইমারসিভ মোডের (OpenXRSpatialContainerState.IMMERSIVE) মধ্যে পরিবর্তন করতে এবং OpenXRSpatialContainerExtension সিঙ্গলটন ব্যবহার করে বাউন্ড ও স্টেট পরিবর্তনের প্রতিক্রিয়া জানাতে পারে।

পূর্বশর্ত

শুরু করার আগে, আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট ও টার্গেট ডিভাইস নিম্নলিখিত প্রয়োজনীয়তা পূরণ করছে কিনা তা নিশ্চিত করুন:

  • Godot ভার্সন: Godot 4.8-dev বা তার থেকে উন্নত ভার্সন।
  • প্রোজেক্ট সেট-আপ: Godot Engine প্রোজেক্ট সেট-আপ গাইডের সবকটি ধাপ সম্পূর্ণ করুন।
  • Godot OpenXR Vendors প্লাগ-ইন: Godot OpenXR Vendors প্লাগ-ইন-এর ৫.২ বা তার পরবর্তী ভার্সন ইনস্টল করুন, যা Android XR-এর জন্য নির্দিষ্ট এক্সটেনশনের জন্য সহায়তা চালু করে।
  • টার্গেট ডিভাইস: Spatial API লেভেল ৪ বা তার চেয়ে উন্নত ভার্সন কাজ করে এমন Android XR ডিভাইস। রানটাইমে, ডিভাইসে এক্সটেনশন উপলভ্য আছে কিনা তা যাচাই করতে OpenXRSpatialContainerExtension.is_enabled() কল করুন।

প্রোজেক্ট সেটিংসে স্পেশিয়াল কন্টেনার চালু করুন

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

  1. প্রোজেক্ট > প্রোজেক্ট সেটিংস খুলুন।
  2. প্রোজেক্ট সেটিংস উইন্ডোর উপরে ডানদিকের কোণে উন্নত সেটিংস টগল চালু করুন।
  3. সাধারণ > XR > Shaders বিকল্পে গিয়ে চালু করা আছে বিকল্প বেছে নিন।
  4. সাধারণ > XR > OpenXR বিকল্পে গিয়ে নিম্নলিখিত সেটিংস কনফিগার করুন:
    • প্রোজেক্টের জন্য OpenXR চালু করতে চালু করা আছে বিকল্প বেছে নিন।
    • এনভায়রনমেন্ট ব্লেন্ড মোড আলফা ব্লেন্ড হিসেবে সেট করুন।
  5. এছাড়াও, OpenXR-এর মধ্যে, এক্সটেনশন বিভাগে যান এবং নিম্নলিখিত সেটিংস কনফিগার করুন:
    • রানটাইম অনুমতির জন্য অটোমেটিক অনুরোধ করুন বিকল্প বেছে নিন যাতে আপনার অ্যাপ অটোমেটিক স্টার্টআপে ব্যবহারকারীকে আপনার Android ম্যানিফেস্টে ঘোষিত যেকোনও XR অনুমতির জন্য প্রম্পট করে।
    • স্পেশিয়াল কন্টেনার সাবসেকশনের অধীনে, চালু করা আছে বিকল্প বেছে নিন।
    • 3D বাউন্ডিং বক্সে লঞ্চ করতে বাউন্ডস মোড বাউন্ডেড হিসেবে সেট করুন অথবা ফুল-স্ক্রিন ইমারসিভ মোডে লঞ্চ করতে ইমারসিভ হিসেবে সেট করুন।
    • Bounds-এর প্রাথমিক প্রস্থ, উচ্চতা ও গভীরতার মাপ মিটারে সেট করুন, যেমন Vector3(1.0, 1.0, 1.0)।
  6. সাধারণ > রেন্ডারিং > ভিউপোর্ট বিকল্পে নেভিগেট করে ট্রান্সপারেন্ট ব্যাকগ্রাউন্ড বিকল্প বেছে নিন।

Android এক্সপোর্ট, অনুমতি ও ফুল স্পেস মোড কনফিগার করা

এরপর, আপনার Android এক্সপোর্ট প্রিসেট, অনুমতি এবং অ্যাক্টিভিটি স্টার্ট মোড কনফিগার করুন যাতে আপনার অ্যাপ স্পেশিয়াল কন্টেনার চালু থাকা অবস্থায় ফুল স্পেস মোডে চলে।

Android এক্সপোর্ট প্রিসেট কনফিগার করুন

  1. প্রোজেক্ট > এক্সপোর্ট করুন... বিকল্পে যান এবং আপনার Android এক্সপোর্ট প্রিসেট বেছে নিন।
  2. Gradle Build-এর মধ্যে, Gradle Build ব্যবহার করুন বিকল্প বেছে নিন এবং Min SDK-কে 34 বা তার বেশি হিসেবে সেট করুন।

    চালু করুন

  3. XR ফিচার বিকল্পে গিয়ে XR মোড বিকল্পকে OpenXR হিসেবে সেট করুন এবং AndroidXR প্লাগ-ইন চালু করুন বিকল্প বেছে নিন।

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

  4. Android XR ফিচার বিকল্পের মধ্যে, এক্সপেরিমেন্টাল ফিচার ব্যবহার করুন বিকল্প বেছে নিন।

ফ্লোর লকিংয়ের জন্য দৃশ্য বোঝার অনুমতি যোগ করুন

একটি বেসিক স্পেশিয়াল কন্টেনার তৈরি ও রেন্ডার করার জন্য বিপজ্জনক রানটাইম অনুমতির প্রয়োজন হয় না (এবং এক্সপেরিমেন্টাল ফিচার ব্যবহার করুন চালু করা হলে ম্যানিফেস্টে অটোমেটিক android.permission.HEAD_TRACKING যোগ করা হয়)। তবে, আপনার অ্যাপ যদি দৃশ্য বোঝার ফিচার ব্যবহার করে, যেমন ফিজিক্যাল ফ্লোরে স্পেশিয়াল কন্টেনার লক ও অ্যাঙ্কর করা, তাহলে আপনার অ্যাপকে রানটাইমে android.permission.SCENE_UNDERSTANDING_COARSE অনুমতি ঘোষণা ও অনুরোধ করতে হবে।

Android XR-এর অনুমতি সম্পর্কে বিস্তারিত জানতে XR-এর জন্য অনুমতি বোঝা দেখুন। আপনার অ্যাপ যদি ফ্লোর লকিং বা দৃশ্য বোঝার সুবিধা ব্যবহার করে, তাহলে android.permission.SCENE_UNDERSTANDING_COARSE ঘোষণা করুন এবং অনুরোধ করুন:

  1. প্রোজেক্ট > এক্সপোর্ট করুন... > Android, অনুমতি > কাস্টম অনুমতি বিকল্পে যান এবং android.permission.SCENE_UNDERSTANDING_COARSE যোগ করুন।

  2. আপনি প্রোজেক্ট সেটিংস > সাধারণ > XR > OpenXR > এক্সটেনশন থেকে রানটাইম অনুমতির জন্য অটোমেটিক অনুরোধ করুন বিকল্প বেছে নিলে, OpenXR চালু হওয়ার সময় আপনার অ্যাপ অটোমেটিক অনুমতির জন্য অনুরোধ করে। পরিবর্তে, GDScript-এ ম্যানুয়ালি অনুমতির অনুরোধ করতে হলে, OS.request_permission() কল করুন:

    if not OS.get_granted_permissions().has("android.permission.SCENE_UNDERSTANDING_COARSE"):
        OS.request_permission("android.permission.SCENE_UNDERSTANDING_COARSE")
    

ফুল স্পেস মোড কনফিগার করুন

Android XR-এ স্পেশিয়াল কন্টেনার শুধুমাত্র ফুল স্পেস মোড (XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED) সাপোর্ট করে। আপনার Android অ্যাক্টিভিটি কাস্টম বিল্ড টেমপ্লেটে (android/build/AndroidManifest.xml, প্রোজেক্ট > Android বিল্ড টেমপ্লেট ইনস্টল করুন... ব্যবহার করে ইনস্টল করা) XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED ঘোষণা করছে কিনা তা নিশ্চিত করুন:

<manifest ...>
    <application ...>
        <property
            android:name="android.window.PROPERTY_XR_ACTIVITY_START_MODE"
            android:value="XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED"
            tools:replace="android:value" />
        ...
    </application>
</manifest>

GDScript-এ স্পেশিয়াল কন্টেনারের সাথে কাজ করা

OpenXRSpatialContainerExtension সিঙ্গলটন এবং OpenXRSpatialContainerState ক্লাস, GDScript-এ XR_EXT_spatial_container এবং XR_EXT_spatial_container_self_rendering এক্সটেনশন এক্সপোজ করে। রানটাইমে, মূল স্পেশিয়াল কন্টেনারের স্ট্যাটাস ও বাউন্ড চেক করতে, কন্টেনার সিগন্যাল শুনতে এবং BOUNDED মোড (একটি 3D বাউন্ডিং বক্স) ও IMMERSIVE মোডের (একটি ফুল-স্ক্রিন আনবাউন্ডেড ভিউ) মধ্যে ট্রানজিশনের অনুরোধ করতে OpenXRSpatialContainerExtension ব্যবহার করুন।

Spatial Container সিগন্যালে কানেক্ট করুন

বর্তমান ডিভাইসে Spatial Container এক্সটেনশন কাজ করে এবং অ্যাক্টিভ আছে কিনা তা যাচাই করতে OpenXRSpatialContainerExtension.is_enabled() চেক করুন এবং _ready()-এ কন্টেনার বাউন্ড ও স্টেট সিগন্যালে কানেক্ট করুন।

OpenXRSpatialContainerExtension স্পেশিয়াল কন্টেনারের জন্য নিম্নলিখিত স্টেট সিগন্যাল এমিট করে:

  • spatial_container_visibility_changed: কন্টেনার দেখানো (true) বা লুকানো (false) হলে (spatial_container, is_visible)-এর সাথে নির্গত হয়। is_visible, false হলে অ্যানিমেশন, অডিও বা সিমুলেশন আপডেট পজ করুন।
  • spatial_container_interactability_changed: কন্টেনার ব্যবহারকারীর ইনপুট ফোকাস পেলে (true) বা হারিয়ে ফেললে (false) (spatial_container, is_interactive)-এর সাথে এমিট করা হয়। ফোকাস পরিবর্তন হলে ইন্টার‍্যাক্টিভ হাইলাইট ও ইনপুট হ্যান্ডলিং চালু বা বন্ধ করুন।
  • spatial_container_bounds_mode_changed: (spatial_container, bounds_mode)-এর সাথে নির্গত হয় যখন কন্টেনার OpenXRSpatialContainerState.BOUNDED এবং OpenXRSpatialContainerState.IMMERSIVE-এর মধ্যে পাল্টায়। এনভায়রনমেন্ট ভিজ্যুয়াল (যেমন স্কাইবক্স বা পাসথ্রু) এবং মোড-নির্দিষ্ট UI কন্ট্রোল টগল করুন।
func _ready() -> void:
    if OpenXRSpatialContainerExtension.is_enabled():
        OpenXRSpatialContainerExtension.spatial_container_bounds_changed.connect(
            _on_bounds_changed
        )
        OpenXRSpatialContainerExtension.spatial_container_bounds_mode_changed.connect(
            _on_bounds_mode_changed
        )
        OpenXRSpatialContainerExtension.spatial_container_visibility_changed.connect(
            _on_visibility_changed
        )
        OpenXRSpatialContainerExtension.spatial_container_interactability_changed.connect(
            _on_interactability_changed
        )

func _on_visibility_changed(_rid: RID, is_visible: bool) -> void:
    # Pause or resume simulation and audio based on visibility
    pass

func _on_interactability_changed(_rid: RID, is_interactive: bool) -> void:
    # Enable or disable input handling and focus highlights
    pass

কন্টেনার বাউন্ডে 3D কন্টেন্ট স্কেল করুন

BOUNDED মোডে থাকাকালীন, bounds-এর সবচেয়ে ছোট ডাইমেনশন অনুযায়ী আপনার 3D কন্টেন্টকে ইউনিফর্মভাবে স্কেল করুন যাতে এটি নিজের অ্যাস্পেক্ট রেশিও বজায় রাখে এবং সবসময় কন্টেনারের সবচেয়ে ছোট সাইডের মধ্যে ফিট করে। IMMERSIVE মোডে ট্রানজিশন করার সময়, আপনার সিনকে ১:১ স্কেলে ফিরিয়ে আনুন:

func _on_bounds_changed(_rid: RID, bounds: Vector3) -> void:
    var uniform_scale: float = min(bounds.x, bounds.y, bounds.z)
    content_root.scale = Vector3.ONE * uniform_scale

func _on_bounds_mode_changed(
    _rid: RID, bounds_mode: OpenXRSpatialContainerState.BoundsMode
) -> void:
    if bounds_mode == OpenXRSpatialContainerState.IMMERSIVE:
        content_root.scale = Vector3.ONE

বাউন্ডেড ও ইমারসিভ মোডের মধ্যে পাল্টানো

বাউন্ডেড 3D ভলিউম এবং ফুল-স্ক্রিন ইমারসিভ ভিউয়ের মধ্যে পাল্টাতে OpenXRSpatialContainerState.BOUNDED বা OpenXRSpatialContainerState.IMMERSIVE সহ request_main_spatial_container_bounds_mode কল করুন:

# Request transitioning to immersive mode (or pass BOUNDED to return)
OpenXRSpatialContainerExtension.request_main_spatial_container_bounds_mode(
    OpenXRSpatialContainerState.IMMERSIVE
)

এছাড়াও দেখুন


OpenXR™ এবং OpenXR লোগো হল The Khronos Group Inc.-এর মালিকানাধীন ট্রেডমার্ক এবং এগুলি চীন, ইউরোপীয় ইউনিয়ন, জাপান ও যুক্তরাজ্যে ট্রেডমার্ক হিসেবে রেজিস্টার করা আছে।