تتيح الحاويات المكانية لتطبيقك عرض محتوى OpenXR الثلاثي الأبعاد داخل مربّع إحاطة حجمي ثلاثي الأبعاد يديره النظام في "وضع المساحة الكاملة"، أو الانتقال أثناء التشغيل إلى تجربة ملء الشاشة غير المحدودة.
اتّبِع هذا الدليل لإعداد "الحاويات المكانية" واستخدامها في مشروعك.
طريقة عمل "الحاويات المكانية"
عند تفعيل الحاوية المكانية في إعدادات مشروعك:
- يتم وضع المشهد الثلاثي الأبعاد النشط بالكامل داخل حاوية مكانية أساسية واحدة
تتوسّط نقطة بداية المشهد
(0, 0, 0). ليس عليك وضع علامات على عُقدNode3Dالفردية أو تخصيصها لوضعها داخل الحاوية. - يتم تشغيل تطبيقك في "وضع المساحة الكاملة" المُدار باستخدام وضع الحدود
(
BoundedأوImmersive) وأبعاد الحدود الأولية التي تم ضبطها في إعدادات مشروعك. في "الوضع المحدود"، يقتطع النظام تلقائيًا أي هندسة ثلاثية الأبعاد في المشهد تمتد خارج أبعاد مربّع الإحاطة. - يوفّر نظام Android XR تلقائيًا عناصر تحكّم في النوافذ ليتمكّن المستخدم من
الإمساك بالحاوية المحدودة ونقلها وإعادة تحديد موضعها في المساحة الثلاثية الأبعاد، أو تصغيرها
وإغلاقها. أثناء التشغيل، يمكن لتطبيقك تغيير حجم الحاوية والتبديل بين
الوضع المحدود (
OpenXRSpatialContainerState.BOUNDED) ووضع ملء الشاشة المجسم (OpenXRSpatialContainerState.IMMERSIVE)، والتفاعل مع التغييرات في الحدود والحالة باستخدام العنصر الفرديOpenXRSpatialContainerExtension.
المتطلبات الأساسية
قبل البدء، تأكَّد من أنّ بيئة التطوير وجهاز الاختبار يستوفيان المتطلبات التالية:
- إصدار Godot: Godot 4.8-dev أو إصدار أحدث
- إعداد المشروع: أكمِل جميع الخطوات الواردة في دليل إعداد مشروع Godot Engine.
- المكوّن الإضافي Godot OpenXR Vendors: ثبِّت الإصدار 5.2 أو إصدارًا أحدث من المكوّن الإضافي Godot OpenXR Vendors الذي يتيح استخدام الإضافات الخاصة بنظام التشغيل Android XR.
- جهاز الاختبار: جهاز Android XR متوافق مع المستوى 4 من واجهة برمجة التطبيقات Spatial أو إصدار أحدث عند التشغيل، يمكنك استدعاء
OpenXRSpatialContainerExtension.is_enabled()للتحقّق من توفّر الإضافة على الجهاز.
تفعيل ميزة "الحاويات المكانية" في إعدادات المشروع
اضبط إعدادات مشروعك لتفعيل OpenXR و"الحاويات المكانية" وأذونات التشغيل التلقائية و"الرؤية المحيطية" الممزوجة بألفا:
- افتح Project (المشروع) > Project Settings (إعدادات المشروع).
- فعِّل مفتاح التبديل الإعدادات المتقدّمة في أعلى يسار نافذة إعدادات المشروع.
- انتقِل إلى إعدادات عامة > الواقع الممتد > برامج التظليل واختَر مفعَّل.
- انتقِل إلى General > XR > OpenXR (الإعدادات العامة > الواقع الممتد > OpenXR) واضبط الإعدادات التالية:
- اختَر مفعَّل لتفعيل OpenXR للمشروع.
- اضبط وضع دمج البيئة (Environment Blend Mode) على دمج ألفا (Alpha Blend).
- ضِمن OpenXR أيضًا، انتقِل إلى قسم الإضافات (Extensions) واضبط
الإعدادات التالية:
- اختَر طلب أذونات التشغيل تلقائيًا (Automatically Request Runtime Permissions) ليطلب تطبيقك من المستخدم تلقائيًا عند بدء التشغيل أي أذونات XR مُعلَن عنها في ملف بيان Android.
- ضمن الفقرة الفرعية الحاوية المكانية، اختَر مفعَّلة.
- اضبط وضع الحدود على محدود لتشغيل التطبيق في مربّع حدود ثلاثي الأبعاد، أو مجسم لتشغيله في وضع مجسم بملء الشاشة.
- اضبط الحدود على أبعاد العرض والارتفاع والعمق الأولية بالمتر، مثل
Vector3(1.0, 1.0, 1.0).
- انتقِل إلى General (الإعدادات العامة) > Rendering (العرض) > Viewport (إطار العرض) واختَر Transparent Background (خلفية شفافة).
ضبط إعدادات التصدير والأذونات و"وضع المساحة الكاملة" في Android
بعد ذلك، اضبط الإعدادات المسبقة لتصدير Android والأذونات ووضع بدء النشاط لتشغيل تطبيقك في "وضع المساحة الكاملة" مع تفعيل "الحاويات المكانية".
ضبط الإعدادات المسبقة لتصدير Android
- انتقِل إلى Project > Export... (المشروع > تصدير...) واختَر الإعداد المُسبَق للتصدير إلى Android.
ضمن إصدار Gradle (Gradle Build)، اختَر استخدام إصدار Gradle (Use Gradle Build) واضبط الحد الأدنى لحزمة تطوير البرامج (Min SDK) على
34أو إصدار أحدث.
ضمن ميزات الواقع الممتد (XR Features)، اضبط وضع الواقع الممتد (XR Mode) على OpenXR واختَر تفعيل المكوّن الإضافي لـ AndroidXR (Enable AndroidXR Plugin).
ضِمن ميزات Android XR، اختَر استخدام الميزات التجريبية.
إضافة أذونات فهم المشهد لقفل الأرضية
لا يتطلّب إنشاء حاوية مكانية أساسية وعرضها أذونات تشغيل خطيرة (وتتم إضافة android.permission.HEAD_TRACKING إلى ملف البيان تلقائيًا عند تفعيل استخدام الميزات التجريبية). ومع ذلك، إذا كان تطبيقك يستخدم ميزات فهم المشهد، مثل قفل حاوية مكانية وتثبيتها على الأرضية المادية، يجب أن يصرّح تطبيقك عن إذن android.permission.SCENE_UNDERSTANDING_COARSE ويطلبه أثناء التشغيل.
يمكنك الاطّلاع على مقالة فهم أذونات XR للحصول على تفاصيل حول أذونات Android XR.
إذا كان تطبيقك يستخدم ميزة تثبيت الأرضية أو فهم المشهد، عليك الإفصاح عن الإذن التالي وطلبه
android.permission.SCENE_UNDERSTANDING_COARSE:
انتقِل إلى المشروع > تصدير... (Project > Export...) > Android، انتقِل إلى الأذونات > الأذونات المخصّصة وأضِف
android.permission.SCENE_UNDERSTANDING_COARSE.عند اختيار طلب أذونات التشغيل تلقائيًا في إعدادات المشروع > الإعدادات العامة > 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
يعلن عن XR_ACTIVITY_START_MODE_FULL_SPACE_MANAGED في نموذج الإصدار
المخصّص (android/build/AndroidManifest.xml، المثبَّت باستخدام المشروع >
تثبيت نموذج إصدار Android...):
<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 استخدام إضافتَي XR_EXT_spatial_container وXR_EXT_spatial_container_self_rendering في لغة GDScript. أثناء التشغيل، استخدِم OpenXRSpatialContainerExtension لفحص حالة الحاوية المكانية الرئيسية وحدودها، والاستماع إلى إشارات الحاوية، وطلب الانتقال بين وضع BOUNDED (مربّع إحاطة ثلاثي الأبعاد) ووضع IMMERSIVE (عرض ملء الشاشة بدون حدود).
الربط بإشارات Spatial Container
يُرجى التحقّق من OpenXRSpatialContainerExtension.is_enabled() للتأكّد من أنّ إضافة Spatial
Container متوافقة ونشطة على الجهاز الحالي، والاتصال
بإشارات حدود الحاوية وحالتها في _ready().
يُصدر OpenXRSpatialContainerExtension إشارات الحالة التالية للحاوية المكانية:
spatial_container_visibility_changed: يتم إرسالها مع(spatial_container, is_visible)عند عرض الحاوية (true) أو إخفائها (false). يمكنك إيقاف الصور المتحركة أو الصوت أو تحديثات المحاكاة مؤقتًا عندما تكون قيمةis_visibleهيfalse.spatial_container_interactability_changed: يتم إرسالها مع(spatial_container, is_interactive)عندما تكتسب الحاوية (true) أو تفقد (false) تركيز إدخال المستخدم. تفعيل أو إيقاف ميزة "التمييز التفاعلي" ومعالجة الإدخال عند تغيير التركيز-
spatial_container_bounds_mode_changed: يتم إرسالها مع(spatial_container, bounds_mode)عندما تبدّل الحاوية بينOpenXRSpatialContainerState.BOUNDEDوOpenXRSpatialContainerState.IMMERSIVE. يمكنك تفعيل أو إيقاف العناصر المرئية في البيئة (مثل الصور البانورامية أو ميزة "الرؤية من خلال النظارة") وعناصر التحكّم في واجهة المستخدم الخاصة بالوضع.
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
تغيير حجم المحتوى الثلاثي الأبعاد ليتناسب مع حدود الحاوية
عند استخدام وضع BOUNDED، يمكنك تغيير حجم المحتوى الثلاثي الأبعاد بشكل موحّد حسب أصغر
بُعد في bounds للحفاظ على نسبة العرض إلى الارتفاع وملاءمة المحتوى دائمًا
للجانب الأصغر من الحاوية. عند الانتقال إلى وضع "IMMERSIVE"،
يجب استعادة المشهد إلى مقياس 1:1:
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
التبديل بين وضعَي "محدود" و"مجسم"
يمكنك استدعاء request_main_spatial_container_bounds_mode باستخدام
OpenXRSpatialContainerState.BOUNDED أو
OpenXRSpatialContainerState.IMMERSIVE للتبديل بين عرض ثلاثي الأبعاد محدود
وعرض غامر بملء الشاشة:
# Request transitioning to immersive mode (or pass BOUNDED to return)
OpenXRSpatialContainerExtension.request_main_spatial_container_bounds_mode(
OpenXRSpatialContainerState.IMMERSIVE
)
انظر أيضًا
- إنشاء محتوى باستخدام "الحاويات المكانية"
- التعرّف على أذونات الواقع الممتد
- إضافة ميزة التوافق مع Android XR إلى مشروع Godot XR الحالي
OpenXR™ وشعار OpenXR هما علامتان تجاريتان تملكهما شركة The Khronos Group Inc. ومسجَّلتان كعلامة تجارية في الصين والاتحاد الأوروبي واليابان والمملكة المتحدة.