अपने ऐप्लिकेशन में 3D मॉडल जोड़ना

3D मॉडल के साथ काम करते समय, Jetpack XR SDK, glTF 2.0 ओपन स्टैंडर्ड के साथ काम करता है. जब Android XR, Jetpack XR SDK टूल से बनाए गए ऐप्लिकेशन को रेंडर करता है, तो 3D मॉडल को glTF 2.0 स्टैंडर्ड में बताई गई फ़िज़िकली आधारित रेंडरिंग (पीबीआर) तकनीकों के साथ रेंडर किया जाएगा. साथ ही, extensions के साथ काम करने वाले Autodesk Maya, Maxon ZBrush, Blender, और Spline जैसे ज़्यादातर डिजिटल कॉन्टेंट क्रिएशन (डीसीसी) टूल, 3D मॉडल को glTF फ़ॉर्मैट (.gltf या .glb फ़ाइलें) में एक्सपोर्ट कर सकते हैं.

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

इस्तेमाल किए जा सकने वाले मटीरियल के बारे में खास जानकारी पाने के लिए, Khronos साइट पर glTF PBR Properties देखें.

Jetpack XR SDK टूल की मदद से बनाए गए ऐप्लिकेशन में 3D मॉडल लोड करने के दो मुख्य तरीके हैं.

ActivitySpace में 3D मॉडल डालना

glTF फ़ाइल बनाने के बाद, अगला चरण यह है कि उसे Android Studio में एसेट डायरेक्ट्री में जोड़ें. हमारा सुझाव है कि ऐसेट टाइप को बेहतर तरीके से व्यवस्थित करने के लिए, models डायरेक्ट्री बनाएं.

/models डायरेक्ट्री में ऐसेट जोड़ने का उदाहरण

glTF मॉडल लोड करने के लिए, createGltfResourceAsync को कॉल करें.

// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()

इस समय, मॉडल मेमोरी में लोड हो जाता है, लेकिन उसे अभी रेंडर नहीं किया जा रहा है. अगर आपको कई 3D मॉडल लोड करने हैं या आपका मॉडल बड़ा है, तो समय से पहले उन्हें एसिंक्रोनस तौर पर लोड करना एक अच्छा विचार है. इस तरह, उपयोगकर्ताओं को आपके मॉडल के मेमोरी में लोड होने का इंतज़ार नहीं करना पड़ता.

हमें ActivitySpace में glTF जोड़ना होगा. इकाई बनाने और उसे ActivitySpace में डालने के लिए, createGltfEntity को कॉल करें. सबसे सही तरीके के तौर पर, आपको देखना चाहिए कि ऐप्लिकेशन ऐसी स्थिति में है या नहीं जिसमें स्पेस की जानकारी देने वाली सुविधाएं काम करती हैं.

// check for spatial capabilities
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)){
  // create the gltf entity using the gltf file from the previous snippet
   val gltfEntity = xrSession.createGltfEntity(gltfModel)
}

अब ऐप्लिकेशन चलाने पर, आपको लोड किया गया 3D मॉडल दिखेगा.

लोड किए गए 3D मॉडल का उदाहरण

Compose वॉल्यूम में 3D मॉडल डालना

आपको अब भी createGltfResourceAsync का इस्तेमाल करके, glTF को मेमोरी में लोड करना होगा. हालांकि, अगर XR के लिए Jetpack Compose का इस्तेमाल करके यूज़र इंटरफ़ेस (यूआई) बनाया जा रहा है, तो 3D मॉडल को Volume में रखा जा सकता है. अपने लेआउट में 3D ऑब्जेक्ट डालने के लिए वॉल्यूम का इस्तेमाल करना लेख पढ़ें.

3D मॉडल ऐनिमेट करना

glTF स्पेसिफ़िकेशन के तहत, 3D मॉडल में ऐनिमेशन जोड़े जा सकते हैं. Jetpack XR SDK में स्केलेटल (रिग किए गए), रिगिड, और मॉर्फ़ टारगेट (ब्लेंड किए गए आकार) ऐनिमेशन का इस्तेमाल किया जा सकता है. KHR_animation_pointer glTF एक्सटेंशन की मदद से बनाए गए मटीरियल ऐनिमेशन भी काम करते हैं.

कोई ऐनिमेशन चलाने के लिए, startAnimation बोलें और ऐनिमेशन का नाम बताएं. आपके पास यह तय करने का विकल्प होता है कि ऐनिमेशन को हमेशा लूप में चलाया जाए या नहीं.

//start a looping walk animation for a model
gltfEntity.startAnimation(loop = true, animationName = "Walk")

startAnimation को दूसरी बार दबाने पर, मौजूदा ऐनिमेशन बंद हो जाएगा और नया ऐनिमेशन शुरू हो जाएगा.

getAnimationState() की मदद से, ऐनिमेशन की मौजूदा स्थिति के बारे में क्वेरी की जा सकती है.

अगर startAnimation() को कॉल करते समय, ऐनिमेशन का जो नाम दिया गया है वह मौजूद नहीं है, तो कॉल चुपचाप बंद हो जाता है. साथ ही, चल रहे सभी ऐनिमेशन बंद हो जाते हैं और getAnimationState() के तौर पर STOPPED दिखता है.

सीन व्यूअर का इस्तेमाल करके 3D मॉडल लोड करना

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

सीन व्यूअर एक अलग ऐप्लिकेशन है. इसे किसी इंटेंट की मदद से चालू किया जाता है और यह फ़ुल स्क्रीन मोड में काम करता है. इस वजह से, इसे चालू करने पर, आपका ऐप्लिकेशन नहीं दिखेगा और सीन व्यूअर पर फ़ोकस रहेगा. आपने जिन एनवायरमेंट में बदलाव किया है उन्हें उपयोगकर्ता के सिस्टम की प्राथमिकताओं पर रीसेट कर दिया जाएगा.

Android XR पर Scene Viewer में glTF फ़ाइल देखने के लिए, Intent का इस्तेमाल करने का उदाहरण यहां दिया गया है:

val THREED_MODEL_URL = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/FlightHelmet/glTF/FlightHelmet.gltf"
val MIME_TYPE = "model/gltf-binary"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
  Uri.parse("https://arvr.google.com/scene-viewer/1.2")
     .buildUpon()
     .appendQueryParameter("file", THREED_MODEL_URL)
     .build()
sceneViewerIntent.setDataAndType(intentUri, MIME_TYPE)
startActivity(sceneViewerIntent)

सीन व्यूअर के इंटरैक्टिव विकल्पों के बारे में ज़्यादा जानने के लिए, 3D मॉडल के डिज़ाइन से जुड़ा दस्तावेज़ देखें.

glTF एक्सटेंशन

Jetpack XR SDK टूल, कई gfTF एक्सटेंशन के साथ काम करता है. इन एक्सटेंशन की मदद से, 3D मॉडल की सुविधाओं को बेहतर बनाया जा सकता है. ये सुविधाएं, GltfEntity और सीन व्यूअर, दोनों में उपलब्ध हैं.