সিনিয়র সফ্টওয়্যার ইঞ্জিনিয়ার
Unity ও Android XR ব্যবহার করে বাস্তব জগতে কীভাবে 3D অভিজ্ঞতা অ্যাঙ্কর ও পারসিস্ট করতে হয় তা জানুন। এই সেশনে স্পেশিয়াল এন্টিটি ফ্রেমওয়ার্ক, Cloud Anchors এবং জিওস্পেশিয়াল API কভার করা হয়। এর মাধ্যমে দেখানো হয় যে কীভাবে প্রসঙ্গ-সচেতন অ্যাপ তৈরি করা যায় যা ফিজিক্যাল প্লেসমেন্ট মনে রাখে এবং সেশন জুড়ে মাল্টি-ইউজার স্পেশিয়াল ডেটা সিঙ্ক করে।
আমরা স্পেশিয়াল এন্টিটির পিছনে থাকা আর্কিটেকচার পরীক্ষা করব, কীভাবে ডিজিটাল অ্যাসেটকে ফিজিক্যাল অবজেক্ট, সারফেস ও ভৌগোলিক লোকেশনে অ্যাঙ্কর করতে হয় তা বুঝব। আপনি স্পেস ম্যাপ করা, সেশন জুড়ে কন্টেন্ট বজায় রাখা এবং শেয়ার করা, লোকেশন-অ্যাওয়ার AR/XR অভিজ্ঞতা তৈরি করার জন্য প্র্যাকটিক্যাল Unity ওয়ার্কফ্লো সম্পর্কে জানতে পারবেন।
TrySaveAnchorAsync-এর মাধ্যমে এগুলি সেভ করে রাখতে এবং সিরিয়ালাইজ করা GUID ব্যবহার করে আবার লোড করতে পারবেন।ট্রান্সস্ক্রিপ্ট করা
ঠিক আছে।
সবাইকে স্বাগত।
এটি হল Unity-এর মাধ্যমে Android XR-এ স্পেশিয়াল কন্টেন্ট আর্কিটেক্ট করা।
আমার নাম জেনিফার স্ট্যান্টন।
আমি Unity-তে সিনিয়র সফ্টওয়্যার ইঞ্জিনিয়ার হিসেবে কাজ করি।
আমি XR ফিচার টিমে কাজ করি, বিশেষ করে AR Foundation এবং সম্পর্কিত প্যাকেজগুলিতে যা Unity-তে অগমেন্টেড এবং মিক্সড রিয়েলিটি নিয়ে আসে।
আমি লেভানা চেন, Google-এর XR গেম ইঞ্জিন টিমে কাজ করি।
আমাদের টিম উন্নত XR কার্যকারিতা এবং নির্বিঘ্ন গেম ইঞ্জিন ইন্টিগ্রেশন আনার জন্য প্লাগ-ইন এবং প্যাকেজ ডেলিভার করার উপর ফোকাস করেছে।
আমরা আপনার কাছ থেকে যে সবচেয়ে বড় চ্যালেঞ্জের কথা শুনি তা হল একই কোডবেস সহ একাধিক XR প্ল্যাটফর্মকে সাপোর্ট করা অনেক কাজ।
AR Foundation হল Unity-র হাই-লেভেল এক্সটেন্ডেড রিয়েলিটি API লেয়ার।
আপনি একাধিক XR প্ল্যাটফর্মকে টার্গেট করতে পারেন, যার জন্য আপনাকে কোড নতুন করে লিখতে হবে না, একাধিক কোডবেস ম্যানেজ করতে হবে না এবং এটি আপনাকে যেকোনও প্ল্যাটফর্মে AR ফিচারের জন্য একটি স্ক্রিপ্টিং API প্রদান করে।
এটি আপনাকে অ্যাপ, গেম বা অভিজ্ঞতা তৈরিতে ফোকাস করতে দেয় এবং Unity আপনার জন্য প্ল্যাটফর্মের বিবরণ ম্যানেজ করে।
AR Foundation এটি করার জন্য OpenXR এক্সটেনশন ব্যবহার করে।
এগুলি হল Khronos Group দ্বারা সংজ্ঞায়িত ওপেন, শিল্পের নির্ধারিত মান API-এর সেট।
OpenXR-ও স্পেশিয়াল এন্টিটি তৈরি করেছে।
এটি হল ডিজিটাল কন্টেন্টের জন্য একটি ফ্রেমওয়ার্ক যা বাস্তব জগতের সাথে ইন্টার্যাক্ট করে ও তাকে উপস্থাপন করে।
বাস্তব জগতের এলিমেন্টকে ডিজিটাল অবজেক্ট হিসেবে দেখানোর জন্য স্পেশিয়াল এন্টিটি একটি ইউনিফায়েড মডেল প্রদান করে।
AR Foundation সম্পর্কে কিছু লেটেস্ট তথ্য আপনার সাথে শেয়ার করতে পেরে আমি আনন্দিত, যাতে আপনি XR-এর জন্য অভিজ্ঞতা তৈরি করার যাত্রা শুরু করতে পারেন।
এরপর, আমি AR Foundation-এর ক্ষমতা সম্পর্কে আলোচনা করব যাতে আপনার ডিজিটাল কন্টেন্ট বাস্তব জগতের সাথে ইন্টার্যাক্ট করতে পারে।
তারপর আমি প্যাকেজ ও অন্যান্য ডিপেন্ডেন্সি সহ প্রোজেক্ট সেট-আপের ব্যাপারে আলোচনা করব, যাতে আপনি নিজের প্রোজেক্টে এটি প্রয়োগ করতে পারেন।
তারপর, Android XR-এর কিছু অনন্য ফিচার সম্পর্কে আলোচনা করে আমি এই সেশন শেষ করব।
তাই, AR Foundation যেভাবে বাস্তব জগতকে ডিজিটালভাবে উপস্থাপন করে তার মধ্যে একটি হল প্লেন।
এগুলি হল বাস্তব পরিবেশের সমতল সারফেস, যেমন মেঝে, দেওয়াল, সিলিং এবং এমনকি টেবিল ও কাউচ।
মেশ হল 3D স্ট্রাকচার যা বাস্তব জগতের জ্যামিতিকে উপস্থাপন করে।
এবং তারপরে আমাদের কাছে বাস্তব জগতের সাথে ইন্টার্যাক্ট করার উপায়ও আছে, রে কাস্ট।
ডিজিটাল কন্টেন্টের সাথে রে কোথায় ইন্টারসেক্ট করে তা এগুলি নির্ধারণ করে।
এটিকে লেজার পয়েন্টার হিসেবে ভাবুন এবং সেই লেজার পয়েন্টারটি কোথায় আলো ফেলছে সেই সম্পর্কে তথ্য পান।
এছাড়াও, আমাদের কাছে অ্যাঙ্কর আছে, যা স্পেসে কোনও পয়েন্টকে স্থিতিশীল করতে এবং স্থান পরিবর্তন করতে সাহায্য করে।
এই প্রেজেন্টেশনের পরের দিকে আমি অ্যাঙ্কর সম্পর্কে আরও বিস্তারিত আলোচনা করব।
তাই, এই চারটিকেই AR Foundation ফিচার হিসেবে বিবেচনা করা হয়।
এছাড়াও, আরও কিছু ফিচার আছে যেগুলি এই স্লাইডে উল্লেখ করা হয়নি।
বিশেষ করে, প্লেন ও অ্যাঙ্করকে ট্র্যাক করা যায় বলে মনে করা হয়, কারণ তারা ARTrackable ক্লাসকে এক্সটেন্ড করে এবং তাদের ম্যানেজার রান টাইম থেকে আপডেট ট্র্যাক করে।
তাহলে, প্লেন সম্পর্কে জানা যাক।
প্লেন, আমাদের কাছে ARPlane কম্পোনেন্ট আছে, যা সমতল পৃষ্ঠের রিয়েল-টাইম শনাক্তকরণ প্রদান করে।
এগুলিতে সিম্যান্টিক লেবেল থাকে যা আপনি কোয়েরি করতে পারেন, যাতে আপনি জানতে পারেন যে আপনার প্লেনটি মেঝে, টেবিল, দেওয়াল নাকি অন্য কিছু।
প্লেনেরও ডায়নামিক বাউন্ডারি থাকে, তাই ব্যবহারকারী বাস্তব জগতে ঘুরে বেড়ানোর সময় আরও বেশি সারফেস দেখতে পান, প্লেনের বাউন্ডারি ডায়নামিকভাবে প্রসারিত হয়, মার্জ হয় এবং রিয়েল-টাইমে রিফাইন হয়।
ফিজিক্স ম্যানেজ করার জন্য আমরা প্লেনে মেশ কোলাইডারও অ্যাটাচ করতে পারি।
এখানে আপনি প্লেন শনাক্তকরণের একটি উদাহরণ দেখতে পাবেন।
এটি হল Android XR ডিভাইসে চলা AR Foundation স্যাম্পেল রে কাস্ট সিন।
এটি রিয়েল-টাইম, ডায়নামিক, 2D পলিগন শনাক্ত করে।
আমাদের প্রোজেক্ট সেট-আপ গাইড অনুসরণ করে অথবা আমাদের স্যাম্পেল বা টেমপ্লেটের মধ্যে কোনও একটি ব্যবহার করে আপনি এমন অ্যাপ তৈরি করতে পারবেন যাতে এই কার্যকারিতা আছে।
এরপর, আমাদের কাছে মেশ আছে।
মেস হল একটি AR ফিচার যা পরিবেশের 3D মেস প্রদান করে।
আমরা এই জেনারেট করা মেশের সাথে মেশ কোলাইডার অ্যাটাচ করতে পারি এবং এটি আপনার ডিজিটাল কন্টেন্টকে বাস্তব জগতের অবজেক্টের সাথে ইন্টার্যাক্ট করার অনুমতি দেয়।
মেশ অবজেক্টের বিশ্বাসযোগ্য অক্লুশন দেখানোর অনুমতি দেয়।
তাই, কোনও ভার্চুয়াল অবজেক্টকে কোনও ফিজিক্যাল অবজেক্টের পিছনে আছে বলে মনে হতে পারে।
আপনার ডিজিটাল অবজেক্ট যদি স্পেসে মুভ করতে পারে, তাহলে আপনি একই জ্যামিতি ব্যবহার করে এমন একটি পাথ খুঁজে পেতে পারেন যা বাস্তব জগতের অবজেক্টকে এড়িয়ে যায়।
এরপর, আমাদের কাছে রে কাস্টিং আছে।
রে কাস্টিং আপনার 3D দৃশ্যে ভার্চুয়াল রে প্রজেক্ট করে যাতে জটিল গণিত নিয়ে চিন্তা না করেই ইন্টারসেকশন খোঁজা যায়।
প্রোজেক্ট করা রে আপনার পরিবেশের একাধিক 3D অবজেক্টের সাথে ইন্টারসেক্ট করতে পারে।
আপনি রে কাস্ট কনফিগার করতে পারেন যাতে এটি শুধুমাত্র নির্দিষ্ট ধরনের ডিজিটাল কন্টেন্ট হিট করে।
যেমন, আপনি এটি এমনভাবে কনফিগার করতে পারেন যাতে এটি প্লেনে আঘাত না করে এবং শুধুমাত্র মেশের সাথে ইন্টারসেক্ট করে।
এখন, প্রাসঙ্গিক প্যাকেজগুলি দেখে নেওয়া যাক।
এইসব প্যাকেজ একে অপরের সাথে যোগাযোগ করতে এবং সম্পূর্ণ XR অভিজ্ঞতা তৈরি করতে একসাথে কাজ করে।
যেমন উল্লেখ করা হয়েছে, AR Foundation প্লেন ও অ্যাঙ্করের মতো ফিচার ম্যানেজ করে।
OpenXR প্লাগ-ইন বিভিন্ন XR প্ল্যাটফর্মে নেটিভ API ম্যানেজ করে, তাই আপনার ডিভাইস OpenXR ব্যবহার করলে আপনি এই প্যাকেজ ব্যবহার করতে চাইবেন।
OpenXR প্লাগ-ইনকে OpenXR স্পেশাল এন্টিটি প্যাকেজের সাথে পেয়ার করা যেতে পারে যাতে স্পেশাল এন্টিটি এক্সটেনশন অ্যাক্সেস করা যায়, এই বিষয়ে পরে আরও জানানো হবে।
আপনি যদি জানেন যে আপনি বিশেষভাবে Android XR ডিভাইসগুলিকে টার্গেট করবেন, যেমন XR হেডসেট এবং তারযুক্ত XR গ্লাস, তার জন্য Unity OpenXR Android XR প্যাকেজ প্রয়োজন।
এবং যেহেতু এই সবকটি প্লাগ-ইন প্যাটার্ন অনুসরণ করে, তাই আপনার কোডের উপর এর প্রভাব ন্যূনতম হওয়া উচিত।
সব AR Foundation প্যাকেজে সব ফিচার উপলভ্য নয়।
যেমন, আপনি যদি এই চার্টটি দেখেন, তাহলে দেখতে পাবেন যে Unity OpenXR Spatial Entities প্যাকেজে বর্তমানে মেশিং উপলভ্য নেই।
XR প্লাগ-ইন ম্যানেজমেন্ট আপনাকে আপনার প্রোজেক্টে কোন OpenXR ফিচার বেছে নেওয়া হয়েছে তা ম্যানেজ করতে দেয়।
তাই আপনি Unity এডিটরে থাকলে, আপনাকে এডিট, প্রোজেক্ট সেটিংস বিকল্পে যেতে হবে এবং তারপরে XR প্লাগ-ইন ম্যানেজমেন্ট বাঁদিকের সাইডবারে থাকবে।
এখানে আপনি OpenXR ফিচার ও ফিচার গ্রুপ দেখতে পাবেন, যাতে আপনার বিল্ডে কোন কোন ফিচার ও ফিচার গ্রুপ অন্তর্ভুক্ত করতে চান তা বেছে নিতে ও বাদ দিতে পারেন।
যেমন, এই স্ক্রিনশটে, আমরা Android XR OpenXR প্যাকেজের সাথে আসা সবকটি দেখছি।
এবং তারপর আপনি এগুলিকে স্পেশিয়াল এন্টিটির সাথে মিক্স ও ম্যাচ করতে পারবেন, যেমন, আপনি যদি চান।
তাহলে, এখানে প্যাকেজ ম্যানেজার উইন্ডো আছে।
আমি কিছু প্যাকেজ হাইলাইট করেছি যা আপনি সাধারণ XR প্রোজেক্ট সেট-আপে দেখতে পেতে পারেন।
আপনি দেখতে পাচ্ছেন, আমাদের AR Foundation আছে, যার উল্লেখ করা হয়েছে।
এছাড়াও, আমাদের কাছে OpenXR প্লাগ-ইন আছে।
আমাদের কাছে Android XR প্যাকেজ আছে।
আমি অন্যান্য প্ল্যাটফর্ম থেকে আরও কিছু হাইলাইট করেছি কারণ আপনি অবশ্যই এমন একটি প্রোজেক্ট তৈরি করতে পারেন যা একাধিক প্ল্যাটফর্মে কম্পাইল করে।
আর তারপর আমাদের কাছে নিচে ডানদিকে আরও কিছু প্যাকেজও আছে।
কম্পোজিশন লেয়ার, যা OpenXR ডিভাইসের সাথে কাজ করে; Core Utils, XR সম্পর্কিত যেকোনও কিছুর জন্য খুবই উপযোগী; এবং তারপর আপনার ইনপুট পাওয়ার জন্য XR Hands এবং XR Interaction Toolkit, যা খুবই প্রয়োজনীয়।
এরপর আমাদের প্রোজেক্ট যাচাই করতে হবে।
তাই, আবার বলছি, এটি XR প্লাগ-ইন ম্যানেজমেন্টের অংশ।
প্রোজেক্ট যাচাইকরণ ডুপ্লিকেট ফিচার শনাক্ত করতে পারে, পাশাপাশি আপনার প্রোজেক্টের অন্যান্য সমস্যাও শনাক্ত করতে পারে যা প্রোজেক্টটি চালানোর জন্য আপনাকে সমাধান করতে হবে।
তবে এই স্ক্রিনশটে, আমি ডুপ্লিকেট ফিচার হাইলাইট করেছি।
সুতরাং, এটি মূলত যা বলছে তা হল একই দুটি ফিচার, যেমন আমার মনে হয় আমাদের এখানে অ্যাঙ্কর, সম্ভবত প্লেন এবং রেকাস্ট আছে।
ব্যবহারকারী একাধিক প্যাকেজ থেকে এইসব ফিচারের ডুপ্লিকেট অন্তর্ভুক্ত করার জন্য বেছে নিয়েছেন এবং এটি ব্যবহারকারীকে একটি বা অন্যটি বেছে নেওয়ার জন্য প্রম্পট করছে।
তাই, এটি আমাদের লোকাল অ্যাঙ্কর এবং পারসিস্টেন্সের দিকে নিয়ে যায়।
অ্যাঙ্কর নিশ্চিত করে যে AR সেশনের ট্র্যাকিং স্ট্যাটাসে পরিবর্তন হওয়া সত্ত্বেও ডিজিটাল কন্টেন্ট পরিবেশে কাঙ্ক্ষিত লোকেশনে থাকে।
AR প্ল্যাটফর্ম সময়ের সাথে সাথে অটোমেটিক অ্যাঙ্করের পোজ আপডেট করে যাতে সেগুলি একই পজিশনে থাকে এবং অ্যাঙ্কর হল সবচেয়ে ভাল উপায় যার মাধ্যমে আপনি অ্যাঙ্কর থেকে দূরে সরে গিয়ে আবার ফিরে এলেও আপনার কন্টেন্ট একই জায়গায় থাকে।
ব্যবহারকারী অ্যাপ বন্ধ করে পরে আবার চালু করলে এবং আলাদা সেশনে ফিরে এলে কী হবে?
পারসিস্টেন্ট অ্যাঙ্কর আপনাকে একটি AR সেশনে অ্যাঙ্কর সেভ করতে এবং তারপরে পরবর্তী সেশনে সেগুলি লোড করতে দেয়।
অ্যাপ লাইফ সাইকেল ও ডিভাইস রিস্টার্ট করার পরেও এগুলি থেকে যায়।
এখানে AR Foundation Samples প্রোজেক্টে আমাদের স্থায়ী অ্যাঙ্করের স্যাম্পেল দেখানো হয়েছে।
স্যাম্পেল দৃশ্যে একটি মেনু আছে যাতে সেই প্ল্যাটফর্মে কাজ করে এমন সব ফাংশন আছে, যেমন অ্যাঙ্কর সেভ ও লোড করা।
আর তাই এটি আমাদের পারসিস্টেন্ট অ্যাঙ্করের লাইফ সাইকেলে নিয়ে আসে।
প্রথমে আপনি স্থানীয়ভাবে একটি অ্যাঙ্কর তৈরি করবেন, তাই এটি এখনও কোথাও সেভ করা হয়নি, স্থায়ী স্টোরেজে সেভ করা হয়নি, শুধু একটি স্থানীয় অ্যাঙ্কর।
এবং তারপর আপনি এটি স্টোরেজে সেভ করবেন।
তারপরে, আপনি অ্যাপটি রিস্টার্ট করতে পারবেন এবং তারপরে আপনি এটি স্টোরেজ থেকে লোড করতে পারবেন।
Android XR সহ কিছু প্ল্যাটফর্ম অ্যাঙ্কর মুছে ফেলা বা আন-পারসিস্ট করার সুবিধাও প্রদান করে।
Spatial Entities প্রোভাইডার সব সেভ করা অ্যাঙ্কর অটোমেটিক লোড করার সুবিধা দেয় যাতে আপনাকে প্রতিটি অ্যাঙ্করের আইডির মাধ্যমে ম্যানুয়ালি অনুরোধ করতে না হয়।
XR প্লাগ-ইন ম্যানেজমেন্ট সেটিংসে, আপনি স্পেশিয়াল এন্টিটি: অ্যাঙ্কর ফিচারে সেভ করা অ্যাঙ্কর অটোমেটিক লোড করুন বিকল্পটি বেছে নিতে পারেন।
আর অ্যাঙ্কর সেভ করতে মাত্র কয়েক লাইন কোড লাগে।
প্রথমে, আমরা Unity এডিটরে শুরু করি এবং আপনার XR Origin গেম অবজেক্টে AR Anchor Manager কম্পোনেন্ট যোগ করে আপনার দৃশ্যটি প্রস্তুত কিনা তা নিশ্চিত করি।
ম্যানেজার রান-টাইম থেকে ট্র্যাক করা অ্যাঙ্কর সহ দৃশ্য আপডেট রাখে।
তাই, এবার আমরা কোড নিয়ে আলোচনা করব।
অ্যাঙ্কর যোগ করতে, আপনি শুধু TryAddAnchorAsync কল করতে পারেন এবং যেখানে অ্যাঙ্কর রাখতে চান সেখানে পোজ পাস করতে পারেন।
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
var result = await manager.TryAddAnchorAsync(pose);
if (result.status.IsError()) {
// handle error
return;
}
var anchor = result.value;
}এরপর, আমরা অ্যাঙ্কর সরিয়ে দিই।
void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
var result = manager.TryRemoveAnchor(anchor.trackableId);
if (result.status.IsError()) {
// handle error
return;
}
}
void DestroyAnchorComponent(ARAnchor anchor) {
Destroy(anchor);
}এবং একইভাবে, এটি প্রায় এক লাইনের কোড।
আপনি TryRemoveAnchor কল করেন, আপনি অ্যাঙ্করের ট্র্যাক করা যায় এমন আইডি পাস করেন।
অ্যাঙ্কর তৈরি করার সময়, এটিকে আগে থেকেই ট্র্যাক করা যায় এমন আইডি দেওয়া হয়েছে।
এবং তারপর আমাদের কাছে TrySaveAnchorAsync আছে।
async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
var result = await manager.TrySaveAnchorAsync(anchor);
if (result.status.IsError()) {
// handle error
return;
}
// Save this value, then return it as an input parameter
SerializableGuid guid = result.value;
}আপনি ইনপুট হিসেবে একটি AR অ্যাঙ্কর পাস করেন।
এই ফাংশনটি একটি SerializableGuid রিটার্ন করে যা পার্সিস্টেন্ট স্টোরেজে অ্যাঙ্কর শনাক্ত করে।
অ্যাঙ্কর লোড করার সময় আপনি পরে GUID ব্যবহার করতে পারবেন।
আর এর ফলে আমরা লোডিং অ্যাঙ্কর সম্পর্কে জানতে পারি।
async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
var result = await manager.TryLoadAnchorAsync(guid);
if (result.status.IsError()) {
// handle error
return;
}
ARAnchor anchor = result.value;
}এখানে কল করার ফাংশন হল TryLoadAnchorAsync এবং আপনি আগে থেকে সিরিয়ালাইজ করা GUID পাস করেন।
এটি ফলাফল হিসেবে একটি AR অ্যাঙ্কর রিটার্ন করবে।
আর এই পর্যন্তই।
এইসব ফাংশন আপনাকে লোকাল ও পারসিস্টেন্ট অ্যাঙ্কর, দুটিই সহজে ম্যানেজ করতে দেয়।
তাই, বেশিরভাগ AR প্ল্যাটফর্মে অ্যাঙ্কর ট্র্যাকিং বেশ ব্যয়বহুল কাজ।
অ্যাঙ্কর নিয়ে কাজ করার সময়, নিম্নলিখিত পেশাদার পদ্ধতিগুলি বিবেচনা করুন: একে অপরের খুব কাছাকাছি একাধিক অ্যাঙ্কর তৈরি করা এড়িয়ে চলুন, অন্য একটি তৈরি করার পরিবর্তে আপনি কাছাকাছি কোনও অ্যাঙ্কর ব্যবহার করতে পারেন কিনা তা বিবেচনা করুন, আপনি যখন আর ব্যবহার করছেন না তখন অ্যাঙ্করগুলি সরিয়ে দিন এবং অবশেষে, আপনি যদি অ্যাঙ্করের জন্য কাঙ্ক্ষিত পোজ গণনা করতে সাহায্য করার জন্য অন্য একটি AR ফিচার চালু করেন, তাহলে অ্যাঙ্করটি সফলভাবে তৈরি হয়ে গেলে আপনি সেই ফিচারটি বন্ধ করতে পারবেন কিনা তা বিবেচনা করুন।
আর এখন, আমি লেভানাকে এটি পাস করব।
ধন্যবাদ, জেনিফার।
এরপর, Unity-তে Android XR-এর যাত্রায় Google-এর অবদান কী, তা আমি আপনাকে জানাব।
তাই, জেনিফার এখনও পর্যন্ত যে Unity OpenXR প্লাগ-ইনগুলি চালু করেছে, সেগুলি ছাড়াও Google, Unity-র জন্য Android XR SDK প্রদান করে, যার অতিরিক্ত ক্ষমতা Android XR প্ল্যাটফর্মে উপলভ্য।
এই SDK-তে অনেক ফিচার ও প্যাকেজ আছে এবং এই আলোচনায় আমরা Unity প্যাকেজের জন্য Android XR এক্সটেনশনের উপর ফোকাস করব।
তাই, OpenXR Android XR এবং OpenXR স্পেশিয়াল এন্টিটির মতো, Unity প্যাকেজের জন্য Android XR এক্সটেনশন আসলে একটি OpenXR প্রোভাইডার।
এই প্যাকেজের আর্কিটেকচার এইরকম দেখতে এবং এগুলি সমান্তরালভাবে বা স্বাধীনভাবে কাজ করতে পারে।
তাই, অন্যান্য সব OpenXR প্রোভাইডারের মতো, Google-এর প্যাকেজ সরাসরি স্ট্যান্ডার্ড OpenXR ইন্টারফেসের উপর ভিত্তি করে তৈরি করা হয়েছে।
তাই, এখানে আমরা অন্যান্য সব পরিষেবা প্রদানকারীর মধ্যে তুলনা হিসেবে একগুচ্ছ ফিচার দেখাই।
তাই, আপনি একটির পরিবর্তে অন্যটি কখন এবং কেন বেছে নেবেন সেই সিদ্ধান্ত নিতে আপনাকে সাহায্য করতে পারেন।
তাই, এই টেবিলে দেখানো ট্র্যাক করা যায় এমন এবং স্পেশিয়াল এন্টিটি মার্কার সম্পর্কে আপনার প্রশ্ন থাকতে পারে।
তাই, এখানে সাইড নোট দেওয়া হল: যারা আগে থেকেই Android XR-এ অ্যাপ ও অভিজ্ঞতা তৈরি করেছেন, তাদের জন্য আমরা এই ফিচার ট্র্যাক করা যায় এমন এক্সটেনশনের মাধ্যমে প্রদান করেছি এবং এটি শুধুমাত্র Android XR-এ কাজ করে।
এবং পরে, জেনিফার যেমন উল্লেখ করেছেন, OpenXR ওপেন গ্রুপ হিসেবে কাজ করা এবং তারপরে ডানদিকে স্পেশিয়াল এন্টিটি এক্সটেনশন রিলিজ করা এবং একটি সামঞ্জস্যপূর্ণ এবং ক্রস-প্ল্যাটফর্ম অভিজ্ঞতা প্রদান করা।
বর্তমানে, আমরা স্পেশিয়াল এন্টিটি ফ্রেমওয়ার্কের জন্য ট্র্যাক করা যায় এমন এক্সটেনশন বন্ধ করে দিচ্ছি।
Not only the later much more performant, but also for the cross-platform support.
এবং তারপর, আসুন স্পেশিয়াল এন্টিটি আরও ভালোভাবে দেখি।
তাই, জেনিফার প্লেন, রে কাস্টিং, অ্যাঙ্কর সম্পর্কে যা উল্লেখ করেছেন, তা ছাড়াও আপনি এই ফিচারটি স্পেশিয়াল এন্টিটি প্রোভাইডারদের দ্বারা সমর্থিত পাবেন, যেমন মার্কার, যা স্ট্যান্ডার্ড 2D বারকোড শনাক্ত করতে, ডিকোড করতে এবং 3D স্পেসে তাদের অবস্থান ট্র্যাক করতে পারে এবং এটি পরিচিত 2D গ্রাফিক্স শনাক্ত করবে এবং 3D স্পেসে তাদের ট্র্যাক করবে।
এবং তারপরে বাউন্ডিং বক্স, যা কীবোর্ড, ল্যাপটপ বা মাউসের মতো ফিজিক্যাল অবজেক্ট শনাক্ত করবে এবং 3D পোজের মধ্যে তাদের বাউন্ডিং বক্স ট্র্যাক করবে।
এবং পরবর্তী উদাহরণে, আমরা Google-এর এক্সটেনশন প্যাকেজ দ্বারা প্রদত্ত বাউন্ডিং বক্স ফিচার কনফিগার করব।
তাই, এখানে এই ভিউ সব OpenXR ফিচারের জন্য প্রায় একই রকম।
তাই, আপনাকে প্রথমে Android XR প্ল্যাটফর্মে সুইচ করতে হবে এবং তারপর OpenXR প্রোভাইডার চালু করে OpenXR ফিচার বেছে নিতে হবে, যার সাহায্যে আপনি তৈরি করতে চান, যেমন, এখানে স্পেশিয়াল এন্টিটি বাউন্ডিং বক্স ফিচার দেখানো হয়েছে এবং তারপর প্রোজেক্ট যাচাইকরণ সংক্রান্ত সমস্যার সমাধান করতে হবে।
এটি আপনাকে কোনও নির্দিষ্ট ফিচারের জন্য প্রয়োজনীয় সব ডিপেন্ডেন্সি খুঁজে পেতে সাহায্য করবে এবং তারপরে একাধিক ফিচার একই সাব-সিস্টেমে কন্ট্রিবিউট করার কারণে হওয়া দ্বন্দ্বের সমাধান করবে।
কখনও কখনও আপনি বেশিরভাগ ক্ষেত্রে, আপনি যদি ব্যবহার করতে চান তবে আপনাকে কেবল একটি ফিচার বেছে নিতে হবে, উদাহরণস্বরূপ, এখানে অ্যাঙ্কর, প্লেন বা বাউন্ডিং বক্স।
এবং সবশেষে আপনি স্যাম্পেল দৃশ্য বা আপনার টেস্ট দৃশ্য তৈরি করতে পারেন।
রান টাইমে ট্র্যাক করা যায় এমন অবজেক্ট অ্যাক্সেস করতে, আপনি শুধু AR বাউন্ডিং বক্স ম্যান-- ম্যানেজার কম্পোনেন্ট যোগ করতে পারেন, এটি AR অ্যাঙ্কর ম্যানেজারের মতো একই কম্পোনেন্ট এবং তারপর এটি অ্যাক্সেস করতে AR ফাউন্ডেশন ইন্টারফেস ব্যবহার করুন।
এছাড়াও, আপনি আমাদের এক্সটেনশন প্যাকেজের মাধ্যমে প্রদান করা স্পেশিয়াল এন্টিটি স্যাম্পেল টেমপ্লেট হিসেবে ইমপোর্ট করে শুরু করতে পারেন।
তাই, Android XR-এ AR Foundation ফিচার ব্যবহার করার সময় আপনি যে প্রধান পার্থক্য দেখতে পাবেন তা এখানে উল্লেখ করা হল।
আপনার ব্যবহারকারীর চারপাশের পরিবেশ বুঝতে সাহায্য করার জন্য, আপনার অ্যাপের সাধারণত পরিবেশের চারপাশের সংবেদনশীল ডেটাতে অ্যাক্সেসের প্রয়োজন হয়।
এবং ব্যবহারকারীকে সুরক্ষিত রাখতে, Android XR সিস্টেমকে সীমাবদ্ধ করে-- অনুমতির পিছনে ডেটা অ্যাক্সেস।
আপনি হয়ত আগে থেকেই এই বিষয়ে জানেন, যেমন সাধারণ Android অনুমতির কল, যেমন ক্যামেরা অ্যাক্সেস বা লোকেশন অ্যাক্সেস, এই ধরনের জিনিস।
এবং তারপরে এখানে সেরা পদ্ধতি হল স্টার্টআপে ম্যানেজার কম্পোনেন্ট বন্ধ করা, হয় এডিটর থেকে, যেমন আপনি ডানদিকে দেখতে পাচ্ছেন, অথবা স্ক্রিপ্ট থেকে, যেমন Awake ইভেন্ট।
void Awake() {
planeManager = GetComponent<ARPlaneManager>();
planeManager.enabled = false;
boundingBoxManager = GetComponent<ARBoundingBoxManager>();
boundingBoxManager.enabled = false;
permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}
void OnEnable() {
StartCoroutine(WaitForPermissions());
}তারপর, আপনি প্রয়োজনীয় সব অনুমতি দিলে, স্ক্রিপ্ট থেকে ম্যানেজার চালু করতে পারবেন, যেমন WaitForPermissions হেল্পার এখানে করে।
IEnumerator WaitForPermissions() {
planeManager.enabled = false;
boundingBoxManager.enabled = false;
yield return new WaitUntil(() =>
permissionUtil.AllPermissionGranted());
// Enable after granted permissions and
// restart subsystems.
planeManager.enabled = true;
boundingBoxManager.enabled = true;
// Save permission status.
permissionGranted = true;
}এটি করলে, আপনি পর্যাপ্ত অনুমতি না থাকার কারণে সাবসিস্টেম শুরু করার সময় হওয়া সমস্যা এড়াতে পারবেন।
আর এটি হল এখানকার একটি বিশেষ ফিচার।
Android XR-এ অ্যাঙ্কর ক্ষমতা বাড়াতে, AR Foundation ব্যবহার করে অ্যাঙ্কর সম্পর্কে জেনিফার আমাদের যেভাবে গাইড করেছেন, আমাদের প্যাকেজটি শেয়ার করা যায় এমন অ্যাঙ্কর নামে একটি নতুন ফিচারও প্রদান করে।
এই ফিচারটি AR Foundation অ্যাঙ্কর ফিচার বর্তমানে যা সাপোর্ট করে তার প্রতিলিপি তৈরি করে এবং কিছু অতিরিক্ত কার্যকারিতা সহ আসে, যেমন জিওস্পেশিয়াল অ্যাঙ্কর।
এবং আপনি যেমন কল্পনা করতে পারেন, অ্যাঙ্কর হল ভার্চুয়াল এবং বাস্তব জগতের সংযোগকারী আসল সেতু।
আর জেনিফার আমাদের এগুলি তৈরি, সেভ ও লোড করার পদ্ধতি দেখিয়েছেন, তবে এই সবকিছুই লোকাল স্পেসে হয়েছে, যেমন আপনার ব্যবহারকারীর বসার ঘর।
কিন্তু বাকি বিশ্বের কী হবে?
আর আমরা কীভাবে একে অপরের সাথে এটি শেয়ার করতে পারি?
আর এখানেই Geospatial API-এর ভূমিকা।
এটি আপনাকে বাস্তব-জগতের লোকেশনের উপর ভিত্তি করে একটি জিওস্পেশিয়াল অ্যাঙ্কর তৈরি করতে দেয়, যেমন আপনার প্রিয় বইয়ের দোকান বা একটি বড় পার্কের মিটিং স্পট।
তাই, Geospatial API আপনাকে VPS-এর মাধ্যমে সঠিক জিওপজিশনাল ট্র্যাকার দিতে পারে, যা ভার্চুয়াল পজিশনিং সিস্টেম নামেও পরিচিত, যেমন GPS, তবে অনেক বেশি সঠিক ট্র্যাকিং ফলাফল প্রদান করতে আউটডোর Street View ডেটা ব্যবহার করে।
তাই, আপনাদের মধ্যে কেউ কেউ হয়ত এই ভিউয়ের সাথে আগে থেকেই পরিচিত, যদি আপনার আগে ARCore-এর জিওস্পেশিয়াল ফিচার ব্যবহার করার অভিজ্ঞতা থাকে।
তাই, Android XR-এ Geospatial API অ্যাক্সেস করতে, প্রথমে আমাদের Google Cloud প্ল্যাটফর্মে হোস্ট করা ব্যাকএন্ডের সাথে কানেক্ট করতে হবে।
যেহেতু জিওস্পেশিয়াল ব্যাকএন্ড আসলে Google Cloud-এ ARCore পরিষেবা দ্বারা পরিচালিত হয়, তাই ARCore API অ্যাক্সেস সহ আপনার Google Cloud প্রোজেক্ট কনফিগার করতে আপনি ঠিক একই ধাপ অনুসরণ করতে পারেন।
এইসব কিছু করার পরে, Android XR Google Cloud ফিচার ব্যবহার করা যাবে যা আমাদের এক্সটেনশন প্যাকেজ প্রদান করে।
আপনি Geospatial API চালু করে Google Cloud প্রোজেক্ট থেকে API কী পেয়ে গেলে, এই ফিচার চালু করতে পারবেন এবং এখানে দেখানো OpenXR সেটিংস মেনুর মাধ্যমে যাচাইকরণ কনফিগার করতে পারবেন এবং-- অথবা, আপনি TrySetAuthenticationAsync নামক স্ক্রিপ্টিং API-এর মাধ্যমে ম্যানুয়ালি এটি কনফিগার করতে পারবেন।
async Task TrySetAuthentication() {
googleCloudFeature =
OpenXRSettings.Instance
.GetFeature<XRGoogleCloudFeature>();
var result = await googleCloudFeature
.TrySetAuthenticationAsync(
strategy, credential);
if (result.IsSuccess()) {
// Ready to use for geospatial tracker.
} else if (result.IsUnsupported()) {
// Google Cloud feature is not supported
} else if (result.IsKeylessError()) {
// Confirm if keyless has been set up properly.
} else {
// Handling other common OpenXR errors.
}
}এখানে লক্ষ্য রাখতে হবে যে, Android XR প্ল্যাটফর্ম বর্তমানে শুধুমাত্র API কী যাচাইকরণ সমর্থন করে, তবে ভবিষ্যতে আরও ক্রেডেনশিয়াল সমর্থন যোগ করা হবে।
তাই, আপনি যাচাইকরণ করার পরে, জিওস্পেশিয়াল ম্যানেজার ব্যবহার করে জিওস্পেশিয়াল ক্ষমতা অ্যাক্সেস করতে পারবেন।
ইন্টিগ্রেশনের আগে VPS কভারেজ সম্পর্কে প্রথমে Google Map চেক করার জন্য বিশেষভাবে সাজেস্ট করা হচ্ছে।
তাই, এই ফিচার ব্যবহার করার সময় আপনার নেটওয়ার্ক অ্যাক্সেস থাকতে হবে।
তাই, XR Geospatial Manager, AR Foundation-এর মাধ্যমে প্রদান করা AR সেশন কম্পোনেন্টের মতোই কাজ করে।
তাই সিস্টেম সাপোর্ট ও জিওস্পেশিয়াল ট্র্যাকারের ট্র্যাকিং স্টেট দেখানোর জন্য এতে স্ট্যাটিক স্টেট প্রপার্টি থাকে।
আপনি এই ধরনের কলব্যাকের মাধ্যমে স্ট্যাটাস পরিবর্তন সংক্রান্ত ইভেন্ট রেজিস্টার করতে পারবেন।
void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
// Handle cloud authentication issues.
} else if (isInitFailed) {
// Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
} else {
// Iterate runtime state change, and handle accordingly.
}
}
private void OnEnable() {
XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}এবং জিওস্পেশিয়াল স্টেট চালু হয়ে গেলে, আপনি নিম্নলিখিত সব ফাংশনের জন্য এই ম্যানেজার ইনস্ট্যান্স ব্যবহার করতে পারবেন।
প্রথমত, প্রদত্ত জিপিএস লোকেশনের সাথে ভিপিএস উপলভ্যতা চেক করার জন্য, আমরা জিপিএস ভ্যালু পেতে Unity-এর লোকেশন API ব্যবহার করি এবং তারপর ভিপিএস উপলভ্যতা চেক করি।
async Task CheckVPSAvailability(CancellationToken token) {
var location = Input.location.lastData;
try {
var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
location.latitude, location.longitude);
token.ThrowIfCancellationRequested();
if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
// Invalid coordinates, try with another location.
} else if (result.status.IsError()) {
// Handle common OpenXR error: result.status.ToOpenXRStatus()
} else if (result.value == XRVPSAvailability.Available) {
// You may use this pose to attach geospatial anchors.
var currentGeospatialPose = new XRGeospatialPose(location);
}
}
}তাই, আপনি যদি ম্যাপের মাধ্যমে VPS সাপোর্ট চেক করতে না চান, তাহলে এটি মূলত একটি বিকল্প, তবে আপনাকে আসল জিপিএস স্ট্যাটাস চেক করতে বাইরে যেতে হবে।
এবং তারপরে, আপনি TryLocate-এর মাধ্যমে ইউনিটি পোজ এবং জিওস্পেশিয়াল পোজের মধ্যে পোজ কনভার্ট করতে পারবেন।
// Geospatial Pose -> Unity Pose
var geospatialPose =
new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
geospatialPose, out XRPoseResult result)) {
if (result.IsPositionValid ||
result.IsPositionTracked) {
transform.position = result.Pose.position;
}
if (result.IsRotationValid ||
result.IsRotationTracked) {
transform.rotation = result.Pose.rotation;
}
}// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
transform.position, transform.rotation);
if (geospatialManager.TryLocate(
pose, out XRGeospatialPoseResult result)) {
if (result.IsPositionValid ||
result.IsRotationValid) {
// You may use for anchor attachment.
}
}VPS চেক বা পোজ কনভার্সন থেকে ফলাফল নিয়ে, আপনি তারপর স্পেশিয়াল অ্যাঙ্করকে কোনও নির্দিষ্ট জিওস্পেশিয়াল পোজ বা পরিচিত সারফেস টাইপ, যেমন ভূখণ্ড বা ছাদের সাথে অ্যাটাচ করতে পারবেন।
async void PlaceAnchor(XRGeospatialPose pose) {
try {
Result<ARShareableAnchor> anchorResult;
XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
if (typeToPlace == XRGeospatialSurfaceType.Default) {
anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
} else {
pose.Altitude = 0;
anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
}
if (anchorResult.status.IsSuccess()) {
// ARShareableAnchorManager will track the anchor and update it.
} else {
// Handle OpenXR failures.
}
}
}এবং তারপরে আপনি যখন এই সব একসাথে করবেন, তখন আপনি বাস্তব-জগতের সামনে এবং কেন্দ্রে কিছু সত্যিকারের ম্যাজিক স্পেশিয়াল অভিজ্ঞতা তৈরি করতে পারবেন।
তাই এখানে, আমরা একটি তীরচিহ্ন রাখি যাতে আমাদের দর্শকরা বাস্তব জগতের টার্গেট করা জায়গায় নেভিগেট করতে পারেন।
ঠিক আছে।
তাই, Android XR SDK হল একমাত্র প্যাকেজ নয় যা আমরা Unity ডেভেলপারদের প্রদান করেছি।
Unity-র জন্য Google-এর Android XR SDK-তে এখন Android XR ইন্টার্যাকশন ফ্রেমওয়ার্ক ও Android XR অডিও প্যাকেজও অন্তর্ভুক্ত করা হয়েছে।
আরও বেশি ফিচার সাপোর্ট ও স্পেশিয়াল এন্টিটি সহ Android XR SDK-এর পরিধি বাড়াতে পেরে আমরা অত্যন্ত আনন্দিত।
ঠিক আছে, তাহলে আমরা সেশনের শেষ প্রান্তে পৌঁছে গেছি।
পরবর্তীকালে কী আসতে চলেছে তা দেখতে আপনি অনলাইনে Unity-এর রোডম্যাপ ফলো করতে পারেন।
ভুলবেন না, আগামী বছরের শুরুতে Unity-র পরবর্তী জেনারেশন Unity 7 আসছে।
আর এই সময়ের মধ্যে, আপনি এইসব টুল ব্যবহার করে দেখতে পারেন এবং মিক্সড রিয়ালিটি টেমপ্লেট ব্যবহার করে প্রোজেক্ট তৈরি করতে পারেন অথবা আমাদের GitHub-এ AR Foundation স্যাম্পেল প্রোজেক্ট দেখতে পারেন।
এছাড়াও, Spatial Entity এবং আমাদের Unity প্যাকেজ সহায়তা সম্পর্কে আরও জানতে, আপনি Android ডেভেলপার সাইটের পৃষ্ঠাটি দেখতে পারেন।
আর সবশেষে, সকলকে ধন্যবাদ।
Android XR-এ AR Foundation এবং স্পেশিয়াল এন্টিটি ব্যবহার করে আপনি কী তৈরি করতে পারেন তা দেখার জন্য আমরা অধীর আগ্রহে অপেক্ষা করছি।
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
var result = await manager.TryAddAnchorAsync(pose);
if (result.status.IsError()) {
// handle error
return;
}
var anchor = result.value;
}void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
var result = manager.TryRemoveAnchor(anchor.trackableId);
if (result.status.IsError()) {
// handle error
return;
}
}
void DestroyAnchorComponent(ARAnchor anchor) {
Destroy(anchor);
}async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
var result = await manager.TrySaveAnchorAsync(anchor);
if (result.status.IsError()) {
// handle error
return;
}
// Save this value, then return it as an input parameter
SerializableGuid guid = result.value;
}async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
var result = await manager.TryLoadAnchorAsync(guid);
if (result.status.IsError()) {
// handle error
return;
}
ARAnchor anchor = result.value;
}void Awake() {
planeManager = GetComponent<ARPlaneManager>();
planeManager.enabled = false;
boundingBoxManager = GetComponent<ARBoundingBoxManager>();
boundingBoxManager.enabled = false;
permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}
void OnEnable() {
StartCoroutine(WaitForPermissions());
}IEnumerator WaitForPermissions() {
planeManager.enabled = false;
boundingBoxManager.enabled = false;
yield return new WaitUntil(() =>
permissionUtil.AllPermissionGranted());
// Enable after granted permissions and
// restart subsystems.
planeManager.enabled = true;
boundingBoxManager.enabled = true;
// Save permission status.
permissionGranted = true;
}async Task TrySetAuthentication() {
googleCloudFeature =
OpenXRSettings.Instance
.GetFeature<XRGoogleCloudFeature>();
var result = await googleCloudFeature
.TrySetAuthenticationAsync(
strategy, credential);
if (result.IsSuccess()) {
// Ready to use for geospatial tracker.
} else if (result.IsUnsupported()) {
// Google Cloud feature is not supported
} else if (result.IsKeylessError()) {
// Confirm if keyless has been set up properly.
} else {
// Handling other common OpenXR errors.
}
}void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
// Handle cloud authentication issues.
} else if (isInitFailed) {
// Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
} else {
// Iterate runtime state change, and handle accordingly.
}
}
private void OnEnable() {
XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}async Task CheckVPSAvailability(CancellationToken token) {
var location = Input.location.lastData;
try {
var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
location.latitude, location.longitude);
token.ThrowIfCancellationRequested();
if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
// Invalid coordinates, try with another location.
} else if (result.status.IsError()) {
// Handle common OpenXR error: result.status.ToOpenXRStatus()
} else if (result.value == XRVPSAvailability.Available) {
// You may use this pose to attach geospatial anchors.
var currentGeospatialPose = new XRGeospatialPose(location);
}
}
}// Geospatial Pose -> Unity Pose
var geospatialPose =
new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
geospatialPose, out XRPoseResult result)) {
if (result.IsPositionValid ||
result.IsPositionTracked) {
transform.position = result.Pose.position;
}
if (result.IsRotationValid ||
result.IsRotationTracked) {
transform.rotation = result.Pose.rotation;
}
}// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
transform.position, transform.rotation);
if (geospatialManager.TryLocate(
pose, out XRGeospatialPoseResult result)) {
if (result.IsPositionValid ||
result.IsRotationValid) {
// You may use for anchor attachment.
}
}async void PlaceAnchor(XRGeospatialPose pose) {
try {
Result<ARShareableAnchor> anchorResult;
XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
if (typeToPlace == XRGeospatialSurfaceType.Default) {
anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
} else {
pose.Altitude = 0;
anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
}
if (anchorResult.status.IsSuccess()) {
// ARShareableAnchorManager will track the anchor and update it.
} else {
// Handle OpenXR failures.
}
}
}