अपने ऐप्लिकेशन में सबस्पेस जोड़ना

एक्सआर की सुविधा वाले डिवाइस
इस गाइड की मदद से, इन तरह के एक्सआर डिवाइसों के लिए अनुभव बनाए जा सकते हैं.
एक्सआर हेडसेट
वायर्ड एक्सआर ग्लास

सबस्पेस, आपके ऐप्लिकेशन में 3D स्पेस का एक हिस्सा होता है. इसमें 3D मॉडल रखे जा सकते हैं, 3D लेआउट बनाए जा सकते हैं, और 2D कॉन्टेंट को 3D में बदला जा सकता है. सबस्पेस सिर्फ़ तब रेंडर होता है, जब स्पेशलाइज़ेशन की सुविधा चालू हो. होम स्पेस या नॉन-एक्सआर डिवाइसों पर, उस सबस्पेस में मौजूद किसी भी कोड को अनदेखा किया जाता है.

लेआउट बनाने और 2D कॉन्टेंट को 3D स्पेस में रखने के लिए, सबस्पेस कंपोज़ेबल का इस्तेमाल किया जा सकता है. जैसे, SpatialPanel, SpatialRow, और SpatialColumn. 3D कॉन्टेंट को रखने के लिए, सही Subspace Composable का इस्तेमाल करें. जैसे, 3D मॉडल के लिए SceneCoreEntity और स्टीरियो इमेज के लिए SpatialExternalSurface. एक्सआर के कुछ कॉम्पोनेंट, जैसे कि Orbiter या SpatialDialog, स्टैंडर्ड 2D कंपोज़ेबल होते हैं. इनका इस्तेमाल, 2D यूज़र इंटरफ़ेस (यूआई) के किसी भी हिस्से में किया जा सकता है. हालांकि, SubspaceComposable को आपके ऐप्लिकेशन के सबस्पेस में शुरू करना होगा. इसके लिए, Subspace सबस्पेस कंपोज़ेबल का इस्तेमाल करें.

सबस्पेस हैरारकी के बारे में जानकारी

टॉप-लेवल Subspace, सबसे बाहरी सबस्पेस होता है. इसे आपका ऐप्लिकेशन चालू करता है. Subspace को हर कॉल से, नई और स्वतंत्र स्पैटियल यूज़र इंटरफ़ेस (यूआई) हैरारकी बनती है. यह किसी भी पैरंट Subspace की जगह, ओरिएंटेशन या स्केल को इनहेरिट नहीं करता है.

SpatialPanel, Orbiter, SpatialPopup या किसी अन्य कॉम्पोनेंट में एम्बेड की गई या नेस्ट की गई Subspace बनाने के लिए, PlanarEmbeddedSubspace का इस्तेमाल करें.

PlanarEmbeddedSubspace और Subspace में दो मुख्य अंतर हैं:

  • ये उस 2D लेआउट में हिस्सा लेते हैं जिसमें इन्हें चालू किया जाता है. इसका मतलब है कि सबस्पेस की ऊंचाई और चौड़ाई, उसके 2D पैरंट लेआउट की ऊंचाई और चौड़ाई से तय होगी.
  • ये उस इकाई के चाइल्ड कॉम्पोनेंट के तौर पर काम करते हैं जिसमें इन्हें शामिल किया जाता है. इसका मतलब है कि अगर किसी SpatialPanel के अंदर नेस्ट किए गए किसी कंपोज़ेबल सबस्पेस को कॉल किया जाता है, तो वह सबस्पेस, उस SpatialPanel का चाइल्ड होता है जिसमें उसे कॉल किया जाता है.

PlanarEmbeddedSubspace के इन व्यवहारों से, ये सुविधाएं मिलती हैं:

  • चाइल्ड को पैरंट इकाई के साथ ले जाना
  • ऑफ़सेट SubspaceModifier का इस्तेमाल करके, बच्चे की जगह की जानकारी को ऑफ़सेट करना
  • ऐसा 3D ऑब्जेक्ट दिखाया जा रहा है जो आपके 2D यूज़र इंटरफ़ेस (यूआई) के ऊपर घूमता है. साथ ही, यह 2D लेआउट में मौजूद सही स्पेस की ऊंचाई और चौड़ाई से मेल खाता है

किसी सबस्पेस के लिए लेआउट बदलना

Android XR पर, आपके ऐप्लिकेशन का लेआउट डिफ़ॉल्ट रूप से, फ़ुल स्पेस मोड में Subspace के VolumeConstraints से जुड़ा होता है. इसलिए, आपको यह देखना चाहिए कि उपयोगकर्ता को कितना स्पेस दिख रहा है. इसके बाद, अपने लेआउट को उसके हिसाब से अडजस्ट करना चाहिए. recommendedContentBoxInFullSpace, ActivitySpace के अंदर मौजूद बाउंडिंग बॉक्स के लिए खास डाइमेंशन उपलब्ध कराता है, ताकि कॉन्टेंट को उपयोगकर्ता के फ़ील्ड ऑफ़ व्यू में रखा जा सके.

आपके ऐप्लिकेशन का मुख्य कॉन्टेंट, इस बॉक्स में होना चाहिए. अगर आपके पास ऐसा कॉन्टेंट है जिसका साइज़, सुझाई गई सीमाओं से ज़्यादा होना चाहिए, तो ऐसा लेआउट इस्तेमाल करें जिससे लोगों को अपना सिर घुमाकर, स्पेस को एक्सप्लोर करने के लिए बढ़ावा मिले. recommendedContentBoxInFullSpace की डिफ़ॉल्ट सीमा को, साइज़ के हिसाब से तय किए गए कस्टम मॉडिफ़ायर, जैसे कि SubspaceModifier.requiredSizeIn को लागू करके बदला जा सकता है. अनबाउंडेड व्यवहार के लिए, allowUnboundedSubspace = true सेट करें.

ज़रूरत के मुताबिक इन डाइमेंशन को पाने के लिए, मौजूदा सेशन का इस्तेमाल करके recommendedContentBoxInFullSpace को कॉल करें. यह उदाहरण देखें:

val session = LocalSession.current
session?.scene?.activitySpace?.recommendedContentBoxInFullSpace

अपने ऐप्लिकेशन में सबस्पेस जोड़ना

यहां दिए गए कोड के उदाहरण में, आपके ऐप्लिकेशन में Subspace और PlanarEmbeddedSubspace जोड़ने का तरीका बताया गया है:

setContent {
    // This is a top-level subspace
    Subspace {
        SpatialPanel {
            MyComposable()
        }
    }
}

@Composable
private fun MyComposable() {
    Row {
        PrimaryPane()
        SecondaryPane()
    }
}

@Composable
private fun PrimaryPane() {
    // This is an embedded subspace, because PrimaryPane is in a SpatialPanel
    // and that SpatialPanel is in the top-level Subspace
    PlanarEmbeddedSubspace {
        SpatialPanel {}
    }
}

ज़्यादा जानकारी के लिए, Subspace और PlanarEmbeddedSubspace के बारे में पूरा रेफ़रंस दस्तावेज़ देखें.