Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Augmented Reality
Code

ARKit के साथ एक मापने वाला ऐप कोड: ऑब्जेक्ट्स को सीन्स में रखें

by
Difficulty:IntermediateLength:LongLanguages:

Hindi (हिंदी) translation by Taruni Rampal (you can also view the original English article)

कई अन्य चीजों के साथ जो जल्दी से हमारी मॉडर्न टेक्नोलॉजी द्वारा रेप्लसेड कर दिए गए हैं, ऐसा लगता है कि कॉमन टेप उपाय आगे जाने के लिए हो सकता है। इस दो-भाग ट्यूटोरियल सीरीज में, हम एक ऐप बनाने के लिए ऑगमेंटेड रियलिटी और अपने iOS डिवाइस पर कैमरे का उपयोग करना सीख रहे हैं जो दो बिंदुओं के बीच की दूरी की रिपोर्ट करेगा।

पहली पोस्ट में, हमने ऐप प्रोजेक्ट बनाया और इसके मैन इंटरफ़ेस एलिमेंट्स को कोडित किया। इस पोस्ट में, हम AR सीन में दो बिंदुओं के बीच को मापकर इसे समाप्त करेंगे। यदि आपने अभी तक नहीं किया है, तो अपने ARKit प्रोजेक्ट को सेट करने के लिए पहली पोस्ट को फॉलो करें।

टॉप्स को संभालना

इस ट्यूटोरियल के सबसे बड़े हिस्सों में से एक है: हैंडलिंग जब यूजर अपनी दुनिया पर टैप करता है तो वह ठीक उसी जगह पर दिखाई देता है जहां उन्होंने टैप किया था। बाद में, हम यूजर को उनकी दूरी दिखाने के लिए इन क्षेत्रों के बीच की दूरी को कैलकुलेट करेंगे।

जेस्चर रेकग्निजेर टैप करें

टैप के लिए जाँच करने में पहला स्टेप ऐप लॉन्च होने पर एक टैप जेस्चर रेकॉग्नीज़र बनाना है। ऐसा करने के लिए, निम्न के रूप में एक टैप हैंडलर बनाएं:

पहली लाइन UITapGestureRecognizer() क्लास का एक उदाहरण बनाती है और प्रारंभ में दो पैरामीटर्स में गुजरती है: टारगेट और एक्शन। टारगेट उन नोटिफिकेशन्स का रेसिपिएंट है जो यह रेकग्निजेर भेजता है, और हम चाहते हैं कि हमारा ViewController क्लास टारगेट हो। एक्शन बस एक मेथड है जिसे हर बार एक टैप कहा जाना चाहिए।

टेप्स की संख्या निर्धारित करने के लिए, इसे जोड़ें:

अगला, हमे पहले बनाई क्लास का उदाहरण यह जानने की जरूरत है कि रेकग्निजेर को सक्रिय करने के लिए वास्तव में कितने टैप की आवश्यकता है। हमारे मामले में, हमें केवल एक टैप की आवश्यकता है, लेकिन अन्य ऐप्स में, आपको कुछ मामलों के लिए अधिक (जैसे कि डबल टैप) की आवश्यकता हो सकती है।

हैंडलर को सीन्स में इस तरह जोड़ें:

अंत में, कोड की यह सिंगल लाइन केवल sceneView में जेस्चर रेकग्निजेर को जोड़ती है, जो कि हम सब कुछ कर रहे हैं। यह वह जगह है जहां कैमरे का प्रीव्यू होगा और साथ ही यूजर स्क्रीन पर दिखाई देने के लिए एक स्फीयर को प्राप्त करने के लिए सीधे टैप करेगा, इसलिए यह रेकग्निजेर को उस सीन्स में जोड़ने के लिए समझ में आता है जिसके साथ यूजर बातचीत करेगा।

टैप मेथड को हैंडल करें

जब हमने UITapGestureRecognizer() बनाया, तो आपको याद होगा कि हमने एक्शन के लिए एक handleTap मेथड निर्धारित की है। अब, हम उस मेथड को डिक्लेअर करने के लिए तैयार हैं। ऐसा करने के लिए, बस अपने ऐप में निम्नलिखित जोड़ें:

हालांकि फ़ंक्शन डिक्लेरेशन बहुत सेल्फ-एक्सप्लनेटोरी हो सकती है, आप आश्चर्यचकित हो सकते हैं कि इसके सामने एक @objc टैग क्यों है। Objective-C के तरीकों को उजागर करने के लिए, स्विफ्ट के करंट वर्जन के रूप में, आपको इस टैग की आवश्यकता है। आपको बस यह जानने की जरूरत है कि #selector को Objective-C उपलब्ध होने के लिए रेफ्रेड मेथड की आवश्यकता है। अंत में, मेथड पैरामीटर हमें सटीक स्थान प्राप्त करने देगा जो स्क्रीन पर टैप किया गया था।

स्थान का पता लगाना

हमारे क्षेत्रों को प्रदर्शित करने के लिए अगला स्टेप जहां यूजर ने टैप किया है, वह उस सटीक स्थिति का पता लगाने के लिए है जिसे उन्होंने टैप किया था। अब, यह स्थान प्राप्त करने और स्फीयर बनाने के रूप में सरल नहीं है, लेकिन मुझे यकीन है कि आप इसमें कुछ ही समय में मास्टर करेंगे।

अपने handleTap() मेथड में कोड की निम्नलिखित तीन पंक्तियों को जोड़कर शुरू करें:

अगर आपको याद है कि हमने handleTap() मेथड में पैरामीटर लिया है, तो आपको याद हो सकता है कि इसे sender का नाम दिया गया था, और यह UITapGestureRecognizer टाइप का था। ठीक है, कोड की यह पहली पंक्ति केवल स्क्रीन पर टैप के स्थान (सीन व्यू के सापेक्ष) पर ले जाती है, और इसे एक निरंतर Location पर सेट करती है।

अगला, हम कुछ कर रहे हैं SceneView पर ही एक हिट टेस्ट कहा जाता है। यह क्या करता है, सरल शब्दों में, रियल ऑब्जेक्ट्स के लिए सीन्स की जांच करना है, जैसे कि टेबल्स, सर्फेस, दीवारों, फर्श आदि। यह हमें गहराई की भावना और दो बिंदुओं के बीच बहुत सटीक माप प्राप्त करने की अनुमति देता है। इसके अलावा, हम ऑब्जेक्ट्स के प्रकारों का पता लगाने के लिए निर्दिष्ट कर रहे हैं, और जैसा कि आप देख सकते हैं, हम इसे featurePoints की तलाश करने के लिए कह रहे हैं, जो अनिवार्य रूप से फ्लैट सर्फेस हैं, जो मापने वाले ऐप के लिए समझ में आता है।

अंत में, कोड की लाइन सबसे सटीक परिणाम लेती है, जो hitTest के मामले में अंतिम परिणाम होता है, और यह जांचता है कि क्या यह nil नहीं है। यदि यह है, तो यह इस मेथड की बाकी लाइन्स को अनदेखा करता है, लेकिन यदि वास्तव में कोई परिणाम है, तो इसे एक निरंतर result के लिए सौंपा जाएगा।

मैट्रिसेस

यदि आप अपने हाई-स्कूल अलजेब्रा क्लास के बारे में सोचते हैं, तो आपको मैट्रिसेस याद हो सकते हैं, जो शायद उतना महत्वपूर्ण नहीं लग रहा था, जैसा कि वे अभी हैं। वे आमतौर पर कंप्यूटर ग्राफिक्स संबंधित कार्यों में उपयोग किए जाते हैं, और हम इस ऐप में उनकी एक झलक पा रहे हैं।

निम्नलिखित पंक्तियों को अपने handleTap() मेथड में जोड़ें, और हम उनके बारे में विस्तार से जानेंगे:

कोड की पहली पंक्ति में आने से पहले, यह समझना महत्वपूर्ण है कि हिट टेस्ट जो हमने पहले किया था वह एक प्रकार का matrix_float 4x4 है, जो अनिवार्य रूप से फ्लोट वैल्यू के चार-ब्य-चार मैट्रिक्स है। चूँकि हम SceneKit में हैं, हालाँकि, हमें इसे किसी ऐसी चीज़ में बदलने की आवश्यकता होगी, जिसे SceneKit समझ सके- इस मामले में, SCNMatrix4 को।

फिर, हम SCNVector3 बनाने के लिए इस मैट्रिक्स का उपयोग करेंगे, जो कि, जैसा कि इसके नाम से पता चलता है, तीन कंपोनेंट्स वाला एक वेक्टर है। जैसा कि आप अनुमान लगा सकते हैं, वे कंपोनेंट्स हैं, जो हमें स्पेस में एक पोजीशन देने के लिए x, y और z हैं। transform.m41, transform.m42, और transform.m43 तीन कॉम्पोनेन्ट वैक्टर के लिए रिलेवेंट कोआर्डिनेट वैल्यूज हैं।

अंत में, आइए newSphere() मेथड का उपयोग करें जिसे हमने पहले बनाया था, साथ ही हमने टच इवेंट से प्राप्त की गई स्थान जानकारी के साथ, एक sphere बनाने के लिए और इसे एक स्थिर क्षेत्र में नियत किया।

डबल-टैप बग को हल करना

अब, आपको हमारे कोड में थोड़ी सी भी कमी महसूस हुई होगी; यदि यूजर टैपिंग करता रहता है, तो एक नया क्षेत्र निर्मित होता रहेगा। हम ऐसा नहीं चाहते हैं क्योंकि इससे यह निर्धारित करना कठिन हो जाता है कि किन क्षेत्रों को मापा जाना चाहिए। इसके अलावा, यूजर के लिए सभी क्षेत्रों का ट्रैक रखना मुश्किल है!

Arrays के साथ हल

इसे हल करने के लिए पहला स्टेप क्लास के टॉप पर एक ऐरे बनाना है।

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

ऑप्शनल बिंडलिंग

आगे, हम if-else स्टेटमेंट्स की एक सीरीज का उपयोग करेंगे और यह पता लगाने के लिए कि ऐरे में कोई भी स्फेरेस हैं या नहीं। शुरुआत के लिए, अपने ऐप में निम्नलिखित ऑप्शनल बिंडलिंग जोड़ें:

सबसे पहले, हम जाँच कर रहे हैं कि क्या spheres में कोई आइटम हैं, और यदि नहीं, तो else क्लॉज़ में कोड एक्सेक्यूटे करें।

स्फेरेस का ऑडिट कर रहा है

उसके बाद, अपने if-else स्टेटमेंट के पहले भाग (if ब्रांच) में निम्नलिखित जोड़ें:

चूंकि हम पहले से ही एक टैप इवेंट में हैं, हम जानते हैं कि हम एक और स्फीयर बना रहे हैं। इसलिए यदि पहले से ही एक स्फीयर है, तो हमें दूरी प्राप्त करने और इसे यूजर को प्रदर्शित करने की आवश्यकता है। आप स्फीयर पर distance() मेथड को कॉल कर सकते हैं, क्योंकि बाद में, हम SCNNode का विस्तार बनाएंगे।

अगला, हमें यह जानना होगा कि क्या पहले से ही अधिकतम दो स्फेरेस हैं। ऐसा करने के लिए, हम सिर्फ हमारे spheres ऐरे की काउंट प्रॉपर्टी और एक if स्टेटमेंट का उपयोग कर रहे हैं। हम ऐरे में सभी स्फेरेस के माध्यम से बार-बार करते हैं और उन्हें सीन्स से हटा देते हैं। (चिंता न करें, हम उनमें से कुछ को बाद में वापस करेंगे।)

अंत में, चूंकि हम पहले से ही if स्टेटमेंट में हैं जो हमें बताता है कि दो से अधिक स्फेरेस हैं, तो हम ऐरे में तीसरे को हटा सकते हैं ताकि हम यह सुनिश्चित कर सकें कि हर समय केवल दो ही ऐरे में बचे हैं।

स्फेरेस को जोड़ना

अंत में, else क्लॉज़ में, हम जानते हैं कि spheres ऐरे खाली है, इसलिए हमें जो करने की आवश्यकता है वह सिर्फ उस स्फीयर को जोड़ने के लिए है जिसे हमने मेथड कॉल के समय बनाया था। अपने else क्लॉज़ के अंदर, इसे जोड़ें:

वाह! हमने अपने spheres के ऐरे में स्फीयर को जोड़ा, और हमारा ऐरे अगले टैप के लिए तैयार है। हमने अब अपने एरे को उन स्फेरेस के साथ तैयार किया है जो स्क्रीन पर होने चाहिए, तो अब, आइए हम इन्हें ऐरे से जोड़ते हैं।

स्फेरेस को जोड़ने और बार-बार के लिए, इस कोड को जोड़ें:

यह for लूप के लिए एक सरल है, और हम सीन्स के रुट नोड के एक चाइल्ड के रूप में स्फेरेस (SCNNode) जोड़ रहे हैं। SceneKit में, यह चीजों को जोड़ने का पसंदीदा तरीका है।

फुल मेथड

यहाँ फाइनल handleTap() मेथड की तरह दिखना चाहिए:

कॅल्क्युलेटिंग डिस्टेन्सेस

अब, अगर आपको याद होगा, तो हमने अपने SCNNode, स्फीयर पर एक distance(to:) मेथड कहा, और मुझे यकीन है कि एक अनडिक्लेयर्ड मेथड का उपयोग करने के लिए Xcode आप पर येल कर (चिल्ला) रहा है। चलिए अब SCNNode क्लास का विस्तार बनाकर इसे समाप्त करते हैं।

एक्सटेंशन बनाने के लिए, बस अपने ViewController क्लास के बाहर निम्न कार्य करें:

यह बस आपको क्लास को बदलने देता है (ऐसा लगता है जैसे आप एक्चुअल क्लास को एडिट कर रहे थे)। फिर, हम एक मेथड जोड़ेंगे जो दो नोड्स के बीच की दूरी की गणना करेगी।

यहाँ यह करने के लिए फ़ंक्शन डिक्लेरेशन है:

यदि आप देखेंगे, तो एक पैरामीटर है जो एक और SCNNode है, और यह परिणाम के रूप में एक CGFloat देता है। एक्चुअल कैलकुलेशन के लिए, इसे अपने distance() फ़ंक्शन में जोड़ें:

कोड की पहली तीन लाइनें एक पैरामीटर के रूप में पास्ड नोड के कोऑर्डिनटस (निर्देशांक) से करंट SCNNode के x, y और z पोसिशन्स को घटाती हैं। हम बाद में इन वैल्यूज को उनकी डिस्टेंस प्राप्त करने के लिए डिस्टेंस फार्मूला में प्लग करेंगे। इसके अलावा, क्योंकि मुझे इंच में परिणाम चाहिए, मैंने बाद में आसान कन्वर्शन के लिए मीटर और इंच के बीच कन्वर्शन दर के लिए एक निरंतरता बनाई है।

अब, दो नोड्स के बीच की डिस्टेंस प्राप्त करने के लिए, अपने मिडिल-स्कूल के मैथ क्लास को याद करें: आप कार्टेसियन प्लेन के लिए डिस्टेंस का फार्मूला याद रख सकते हैं। यहां, हम इसे थ्री-डायमेंशनल स्पेस के बिंदुओं पर लागू कर रहे हैं।

अंत में, हम माप की उपयुक्त यूनिट प्राप्त करने के लिए इंच कन्वर्शन रेश्यो द्वारा मल्टिप्लेड वैल्यू वापस करते हैं। यदि आप यूनाइटेड स्टेट्स के बाहर रहते हैं, तो आप इसे मीटर में छोड़ सकते हैं या चाहें तो सेंटीमीटर में बदल सकते हैं।

निष्कर्ष

खैर, यह एक व्रैप है! आपका अंतिम प्रोजेक्ट इस टाइप का दिखना चाहिए:

Final result showing the measuring app in action

जैसा कि आप देख सकते हैं, मेजेरेमेन्ट्स सही नहीं हैं, लेकिन यह सोचता है कि 15 इंच का कंप्यूटर 14.998 इंच के आसपास है, इसलिए यह बुरा नहीं है!

अब आप जानते हैं कि Apple की नई लाइब्रेरी, ARKit का उपयोग करके दूरी कैसे मापें। इस एप्लिकेशन का उपयोग कई चीजों के लिए किया जा सकता है, और मैं आपको विभिन्न तरीकों के बारे में सोचने के लिए चुनौती देता हूं कि इसका उपयोग वास्तविक दुनिया में किया जा सकता है, और नीचे दिए गए टिप्पणियों में अपने विचारों को छोड़े।

इसके अलावा, इस एप्लिकेशन के लिए GitHub रेपो की जांच करना सुनिश्चित करें। और आप अभी भी यहाँ हैं, तो Envato Tuts + पर हमारे अन्य iOS डेवलपमेंट ट्यूटोरियल देखें!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.