ক্রমাগত ক্লাউড অ্যাঙ্কর সহ ARCore ক্লাউড অ্যাঙ্কর

১. সংক্ষিপ্ত বিবরণ

ARCore হলো মোবাইল ডিভাইসে অগমেন্টেড রিয়েলিটি অ্যাপ তৈরির একটি প্ল্যাটফর্ম। ক্লাউড অ্যাঙ্করস এপিআই আপনাকে এমন এআর অ্যাপ তৈরি করার সুযোগ দেয় যা একটি সাধারণ ফ্রেম-অফ-রেফারেন্স শেয়ার করে, যার ফলে একাধিক ব্যবহারকারী একই বাস্তব-জগতের স্থানে ভার্চুয়াল কন্টেন্ট স্থাপন করতে পারে।

এই কোডল্যাবটি আপনাকে ক্লাউড অ্যাঙ্করস এপিআই (Cloud Anchors API) সম্পর্কে নির্দেশনা দেবে। আপনি একটি বিদ্যমান ARCore অ্যাপ নেবেন, সেটিকে ক্লাউড অ্যাঙ্করস ব্যবহার করার জন্য পরিবর্তন করবেন এবং একটি শেয়ারযোগ্য এআর (AR) অভিজ্ঞতা তৈরি করবেন।

ARCore অ্যাঙ্কর এবং স্থায়ী ক্লাউড অ্যাঙ্কর

ARCore-এর একটি মৌলিক ধারণা হলো অ্যাঙ্কর (Anchor) , যা বাস্তব জগতের একটি স্থির অবস্থানকে বর্ণনা করে। সময়ের সাথে সাথে এর মোশন ট্র্যাকিং উন্নত হওয়ার সাথে সাথে ARCore স্বয়ংক্রিয়ভাবে একটি অ্যাঙ্করের পোজের (pose) মান সামঞ্জস্য করে।

ক্লাউড অ্যাঙ্কর হলো এমন অ্যাঙ্কর যা ক্লাউডে হোস্ট করা থাকে। একাধিক ব্যবহারকারী এগুলোকে রিজলভ করতে পারে, যার মাধ্যমে বিভিন্ন ব্যবহারকারী ও তাদের ডিভাইসের মধ্যে একটি সাধারণ রেফারেন্স ফ্রেম স্থাপন করা যায়।

অ্যাঙ্কর হোস্ট করা

যখন একটি অ্যাঙ্কর হোস্ট করা হয়, তখন নিম্নলিখিত বিষয়গুলো ঘটে:

  1. বিশ্বের সাপেক্ষে অ্যাঙ্করটির অবস্থান ক্লাউডে আপলোড করা হয় এবং একটি ক্লাউড অ্যাঙ্কর আইডি পাওয়া যায়।
    ক্লাউড অ্যাঙ্কর আইডি হলো একটি স্ট্রিং, যা এই অ্যাঙ্করটি রিজলভ করতে ইচ্ছুক যে কাউকে পাঠাতে হবে।
  2. অ্যাঙ্করটির ভিজ্যুয়াল ডেটা সম্বলিত একটি ডেটাসেট গুগল সার্ভারে আপলোড করা হয়।
    এই ডেটাসেটে ডিভাইসটি দ্বারা সম্প্রতি দেখা ভিজ্যুয়াল ডেটা রয়েছে। হোস্টিং করার আগে অ্যাঙ্করের চারপাশের এলাকা বিভিন্ন দৃষ্টিকোণ থেকে ক্যাপচার করার জন্য ডিভাইসটিকে কিছুটা নাড়াচাড়া করলে আরও ভালো লোকলাইজেশন পাওয়া যাবে।

ক্লাউড অ্যাঙ্কর আইডি স্থানান্তর করা হচ্ছে

এই কোডল্যাবে, আপনি ফায়ারবেস ব্যবহার করে ক্লাউড অ্যাঙ্কর আইডি স্থানান্তর করবেন। আপনি চাইলে অন্য উপায়েও ক্লাউড অ্যাঙ্কর আইডি শেয়ার করতে পারেন।

একটি অ্যাঙ্কর সমাধান করা

আপনি ক্লাউড অ্যাঙ্কর আইডি ব্যবহার করে একটি অ্যাঙ্কর রিজলভ করতে ক্লাউড অ্যাঙ্কর এপিআই ব্যবহার করতে পারেন। এটি মূল হোস্ট করা অ্যাঙ্করের মতো একই ভৌতিক অবস্থানে একটি নতুন অ্যাঙ্কর তৈরি করে। রিজলভ করার সময়, ডিভাইসটিকে অবশ্যই মূল হোস্ট করা অ্যাঙ্করের মতো একই ভৌতিক পরিবেশের দিকে নজর রাখতে হবে।

স্থায়ী ক্লাউড অ্যাঙ্কর

১.২০ সংস্করণের আগে, ক্লাউড অ্যাঙ্করগুলো হোস্ট করার পর মাত্র ২৪ ঘণ্টার জন্য রিজলভ করা যেত। পারসিস্টেন্ট ক্লাউড অ্যাঙ্করস এপিআই (Persistent Cloud Anchors API) ব্যবহার করে, আপনি এমন একটি ক্লাউড অ্যাঙ্কর তৈরি করতে পারেন যা তৈরির পর ১ দিন থেকে ৩৬৫ দিন পর্যন্ত রিজলভ করা যাবে।

আপনি যা তৈরি করবেন

এই কোডল্যাবে, আপনি আগে থেকে বিদ্যমান একটি ARCore অ্যাপের উপর ভিত্তি করে আপনার অ্যাপটি তৈরি করবেন। কোডল্যাব শেষে, আপনার অ্যাপটি যা করতে পারবে:

  • স্থায়ী ক্লাউড অ্যাঙ্কর হোস্ট করতে এবং ক্লাউড অ্যাঙ্কর আইডি সংগ্রহ করতে সক্ষম হতে হবে।
  • অ্যান্ড্রয়েড SharedPreferences ব্যবহার করে সহজে খুঁজে পাওয়ার জন্য ডিভাইসে ক্লাউড অ্যাঙ্কর আইডিগুলো সংরক্ষণ করুন।
  • পূর্বে হোস্ট করা অ্যাঙ্করগুলো রিজলভ করতে সংরক্ষিত ক্লাউড অ্যাঙ্কর আইডি ব্যবহার করুন। এর ফলে এই কোডল্যাবের উদ্দেশ্যে একটিমাত্র ডিভাইসে একাধিক ব্যবহারকারীর অভিজ্ঞতা অনুকরণ করা আমাদের জন্য সহজ হয়।
  • একই অ্যাপ চালিত অন্য ডিভাইসের সাথে ক্লাউড অ্যাঙ্কর আইডি শেয়ার করুন, যাতে একাধিক ব্যবহারকারী অ্যান্ড্রয়েড স্ট্যাটাসটি একই অবস্থানে দেখতে পান।

ক্লাউড অ্যাঙ্করের অবস্থানে একটি অ্যান্ড্রয়েড মূর্তি রেন্ডার করা হয়:

আপনি যা শিখবেন

  • ARCore SDK ব্যবহার করে কীভাবে অ্যাঙ্কর হোস্ট করবেন এবং ক্লাউড অ্যাঙ্কর আইডি পাবেন।
  • অ্যাঙ্কর রিজলভ করতে ক্লাউড অ্যাঙ্কর আইডি কীভাবে ব্যবহার করবেন
  • একই ডিভাইসে বা ভিন্ন ভিন্ন ডিভাইসে বিভিন্ন AR সেশনের মধ্যে ক্লাউড অ্যাঙ্কর আইডি কীভাবে সংরক্ষণ এবং শেয়ার করবেন।

আপনার যা যা লাগবে

২. আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করুন।

ডেভেলপমেন্ট মেশিন সেট আপ করা

আপনার ARCore ডিভাইসটি USB কেবলের মাধ্যমে কম্পিউটারের সাথে সংযুক্ত করুন। নিশ্চিত করুন যে আপনার ডিভাইসটিতে USB ডিবাগিংয়ের অনুমতি রয়েছে

একটি টার্মিনাল খুলুন এবং নিচে দেখানো অনুযায়ী adb devices চালান:

adb devices

List of devices attached
<DEVICE_SERIAL_NUMBER>    device

<DEVICE_SERIAL_NUMBER> আপনার ডিভাইসের জন্য একটি অনন্য স্ট্রিং হবে। চালিয়ে যাওয়ার আগে নিশ্চিত করুন যে আপনি ঠিক একটি ডিভাইস দেখতে পাচ্ছেন।

কোড ডাউনলোড এবং ইনস্টল করা

আপনি রিপোজিটরিটি ক্লোন করতে পারেন:

git clone https://github.com/googlecodelabs/arcore-cloud-anchors.git

অথবা একটি ZIP ফাইল ডাউনলোড করে তা এক্সট্র্যাক্ট করুন:

অ্যান্ড্রয়েড স্টুডিও চালু করুন। 'Open an existing Android Studio project'-এ ক্লিক করুন। এরপর, উপরে ডাউনলোড করা জিপ ফাইলটি যেখানে এক্সট্র্যাক্ট করেছেন সেই ডিরেক্টরিতে যান এবং arcore-cloud-anchors ডিরেক্টরিটিতে ডাবল-ক্লিক করুন।

এটি একাধিক মডিউল সহ একটি একক গ্রেডল প্রজেক্ট। যদি অ্যান্ড্রয়েড স্টুডিওর উপরের বাম দিকের প্রজেক্ট প্যানেটি আগে থেকেই প্রদর্শিত না থাকে, তাহলে ড্রপ-ডাউন মেনু থেকে প্রজেক্টস- এ ক্লিক করুন। ফলাফলটি এইরকম হওয়া উচিত:

52282f0415fdbdcb.png

আপনি প্রধানত work মডিউলে কাজ করবেন। অন্যান্য মডিউলগুলোর মধ্যে একটি helpers মডিউল রয়েছে, যেটিতে কিছু দরকারি র‍্যাপার ক্লাস আছে যা আপনি ব্যবহার করবেন। এছাড়াও কোডল্যাবের প্রতিটি অংশের জন্য সম্পূর্ণ সমাধান দেওয়া আছে। helpers মডিউলটি ছাড়া, প্রতিটি মডিউলই একটি বিল্ডেবল অ্যাপ।

যদি আপনি অ্যান্ড্রয়েড গ্রেডল প্লাগইন আপগ্রেড করার পরামর্শ দিয়ে কোনো ডায়ালগ বক্স দেখতে পান, তাহলে এই প্রজেক্টের জন্য ‘আমাকে আবার মনে করিয়ে দেবেন না’ বিকল্পে ক্লিক করুন।

31a93c7e9cc58b53.png

রান > রান... > 'ওয়ার্ক'- এ ক্লিক করুন। প্রদর্শিত সিলেক্ট ডিপ্লয়মেন্ট টার্গেট ডায়ালগ বক্সে, আপনার ডিভাইসটি কানেক্টেড ডিভাইসেস-এর অধীনে তালিকাভুক্ত থাকা উচিত। আপনার ডিভাইসটি নির্বাচন করুন এবং ওকে-তে ক্লিক করুন। অ্যান্ড্রয়েড স্টুডিও প্রাথমিক অ্যাপটি বিল্ড করবে এবং আপনার ডিভাইসে এটি চালাবে।

আপনি যখন প্রথমবার অ্যাপটি চালাবেন, তখন এটি CAMERA অনুমতি চাইবে। চালিয়ে যেতে ALLOW- এ ট্যাপ করুন।

f7ea81f71a4b969e.png

অ্যাপটি কীভাবে ব্যবহার করবেন

  1. অ্যাপটিকে একটি প্লেন খুঁজে পেতে সাহায্য করার জন্য ডিভাইসটি নাড়াচাড়া করুন । প্লেনটি খুঁজে পাওয়া গেলে সেটিকে একটি বিন্দুযুক্ত পৃষ্ঠ হিসাবে দেখানো হবে।
  2. অ্যাঙ্কর স্থাপন করতে প্লেনের যেকোনো জায়গায় ট্যাপ করুন । যেখানে অ্যাঙ্করটি স্থাপন করা হয়েছে, সেখানে একটি অ্যান্ড্রয়েড চিত্র আঁকা হবে। এই অ্যাপটি আপনাকে একবারে শুধুমাত্র একটি অ্যাঙ্কর স্থাপন করার অনুমতি দেয়।
  3. ডিভাইসটি নাড়াচাড়া করুন । ডিভাইসটি নড়াচড়া করলেও চিত্রটিকে একই জায়গায় স্থির বলে মনে হওয়া উচিত।
  4. অ্যাঙ্করটি সরাতে ক্লিয়ার বাটনটি চাপুন । এর ফলে আপনি আরেকটি অ্যাঙ্কর স্থাপন করতে পারবেন।

এই মুহূর্তে, এই অ্যাপটি শুধুমাত্র একবার চলার সময় একটি অ্যাঙ্করকে ট্র্যাক করার জন্য ARCore দ্বারা প্রদত্ত মোশন ট্র্যাকিং ব্যবহার করছে। আপনি যদি অ্যাপটি বন্ধ করে আবার চালু করেন, তাহলে পূর্বে স্থাপন করা অ্যাঙ্কর এবং এর পোজ সহ এর সাথে সম্পর্কিত সমস্ত তথ্য হারিয়ে যাবে।

পরবর্তী কয়েকটি বিভাগে, এই অ্যাপটির উপর ভিত্তি করে আপনারা দেখবেন কীভাবে বিভিন্ন AR সেশনের মধ্যে অ্যাঙ্কর শেয়ার করা যায়।

৩. একজন অ্যাঙ্করকে হোস্ট করুন

এই অংশে আপনি একটি অ্যাঙ্কর হোস্ট করার জন্য work প্রজেক্টটি পরিবর্তন করবেন। কোড লেখার আগে, আপনাকে অ্যাপটির কনফিগারেশনে কয়েকটি পরিবর্তন আনতে হবে।

ইন্টারনেট অনুমতি ঘোষণা করুন

যেহেতু ক্লাউড অ্যাঙ্করগুলির জন্য ARCore ক্লাউড অ্যাঙ্কর API পরিষেবার সাথে যোগাযোগের প্রয়োজন হয়, তাই আপনার অ্যাপের ইন্টারনেট অ্যাক্সেস করার অনুমতি থাকতে হবে।

আপনার AndroidManifest.xml ফাইলে, android.permission.CAMERA পারমিশন ডিক্লারেশনের ঠিক নিচে নিম্নলিখিত লাইনটি যোগ করুন:

<!-- Find this line... -->
<uses-permission android:name="android.permission.CAMERA"/>

<!-- Add the line right below -->
<uses-permission android:name="android.permission.INTERNET"/>

ARCore API সক্রিয় করুন

  1. ARCore API পরিষেবা পৃষ্ঠায় যান।
  2. প্রজেক্টের তালিকা থেকে একটি প্রজেক্ট নির্বাচন করুন অথবা নতুন একটি তৈরি করুন।
  3. সক্রিয় করুন ক্লিক করুন।

কীলেস অথেন্টিকেশন সেট আপ করুন

পার্সিস্টেন্ট ক্লাউড অ্যাঙ্কর ব্যবহার করতে হলে, আপনাকে ARCore API-এর সাথে প্রমাণীকরণের জন্য কীলেস অথেনটিকেশন ব্যবহার করতে হবে।

  1. গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে যান।
  2. প্রকল্পের তালিকা থেকে একটি প্রকল্প নির্বাচন করুন।
  3. যদি APIs & services পেজটি আগে থেকে খোলা না থাকে, তাহলে কনসোলের বাম পাশের মেনুটি খুলুন এবং APIs & Services নির্বাচন করুন।
  4. বাম দিকে, ক্রেডেনশিয়ালস-এ ক্লিক করুন।
  5. Create Credentials-এ ক্লিক করুন, তারপর OAuth ক্লায়েন্ট আইডি নির্বাচন করুন।
  6. নিম্নলিখিত মানগুলি পূরণ করুন:
    • অ্যাপ্লিকেশনের ধরণ : অ্যান্ড্রয়েড
    • প্যাকেজের নাম : com.google.ar.core.codelab.cloudanchor
  7. আপনার ডিবাগ সাইনিং সার্টিফিকেট ফিঙ্গারপ্রিন্ট পুনরুদ্ধার করুন:
    1. আপনার অ্যান্ড্রয়েড স্টুডিও প্রজেক্টে গ্রেডল টুলপেনটি খুলুন।
    2. cloud-anchors > work > Tasks > android-এ , signingReport টাস্কটি চালান।
    3. গুগল ক্লাউডের SHA-1 সার্টিফিকেট ফিঙ্গারপ্রিন্ট ফিল্ডে SHA-1 ফিঙ্গারপ্রিন্টটি কপি করুন।

ARCore কনফিগার করুন

এরপরে, ব্যবহারকারীর ট্যাপে সাধারণ অ্যাঙ্করের পরিবর্তে একটি অ্যাঙ্কর হোস্ট করার জন্য আপনাকে অ্যাপটি পরিবর্তন করতে হবে। এটি করার জন্য, আপনাকে ক্লাউড অ্যাঙ্কর সক্রিয় করতে ARCore সেশনটি কনফিগার করতে হবে।

CloudAnchorFragment.java ফাইলে নিম্নলিখিত কোডটি যোগ করুন:

// Find this line...
session = new Session(requireActivity());

// Add these lines right below:
// Configure the session.
Config config = new Config(session);
config.setCloudAnchorMode(CloudAnchorMode.ENABLED);
session.configure(config);

সামনে এগোনোর আগে, আপনার অ্যাপটি বিল্ড ও রান করুন। খেয়াল রাখবেন যেন শুধু work মডিউলটিই বিল্ড হয়। আপনার অ্যাপটি সফলভাবে বিল্ড হবে এবং আগের মতোই চলতে শুরু করবে।

একজন অ্যাঙ্করকে হোস্ট করুন

এখন এমন একটি অ্যাঙ্কর হোস্ট করার সময় হয়েছে যা ARCore API-তে আপলোড করা হবে।

আপনার CloudAnchorFragment ক্লাসে নিম্নলিখিত নতুন ফিল্ডটি যোগ করুন:

// Find this line...
private Anchor currentAnchor = null;

// Add these lines right below.
@Nullable
private Future future = null;

com.google.ar.core.Future এর জন্য একটি ইম্পোর্ট যোগ করতে মনে রাখবেন।

onClearButtonPressed মেথডটি নিম্নরূপে পরিবর্তন করুন:

private void onClearButtonPressed() {
  // Clear the anchor from the scene.
  if (currentAnchor != null) {
    currentAnchor.detach();
    currentAnchor = null;
  }

  // The next part is the new addition.
  // Cancel any ongoing asynchronous operations.
  if (future != null) {
    future.cancel();
    future = null;
  }
}

এরপরে, আপনার CloudAnchorFragment ক্লাসে নিম্নলিখিত মেথডটি যোগ করুন:

private void onHostComplete(String cloudAnchorId, CloudAnchorState cloudState) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Hosted. ID: " + cloudAnchorId);
  } else {
    messageSnackbarHelper.showMessage(getActivity(), "Error while hosting: " + cloudState.toString());
  }
}

CloudAnchorFragment ক্লাসের handleTap মেথডটি খুঁজুন এবং এই লাইনগুলো যোগ করুন:

// Find this line...
currentAnchor = hit.createAnchor();

// Add these lines right below:
messageSnackbarHelper.showMessage(getActivity(), "Now hosting anchor...");
future = session.hostCloudAnchorAsync(currentAnchor, 300, this::onHostComplete);

অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপটি আবার চালান । যখন আপনি একটি অ্যাঙ্কর স্থাপন করবেন, তখন আপনার " Now hosting anchor... " বার্তাটি দেখা উচিত। হোস্টিং সফলভাবে সম্পন্ন হলে আপনার আরেকটি বার্তা দেখা উচিত। যদি আপনি " Error hosting anchor: ERROR_NOT_AUTHORIZED " বার্তাটি দেখেন, তবে আপনার OAuth ক্লায়েন্টটি সঠিকভাবে কনফিগার করা আছে কিনা তা যাচাই করুন।

যে কেউ অ্যাঙ্কর আইডি জানলে এবং অ্যাঙ্করটির সাথে একই ভৌত স্থানে উপস্থিত থাকলে, সেই অ্যাঙ্কর আইডি ব্যবহার করে তার চারপাশের পরিবেশের সাপেক্ষে হুবহু একই পোজ (অবস্থান এবং অভিমুখ)-এ একটি অ্যাঙ্কর তৈরি করতে পারে।

তবে, অ্যাঙ্কর আইডিটি দীর্ঘ হওয়ায় অন্য কোনো ব্যবহারকারীর পক্ষে এটি হাতে লিখে প্রবেশ করানো সহজ নয়। পরবর্তী বিভাগগুলিতে, আপনি ক্লাউড অ্যাঙ্কর আইডিগুলি সহজে খুঁজে পাওয়ার মতো করে সংরক্ষণ করবেন, যাতে একই বা অন্য ডিভাইসে অ্যাঙ্কর রিজলভিং করা যায়।

৪. আইডি সংরক্ষণ করুন এবং অ্যাঙ্করগুলি সমাধান করুন

এই অংশে, আপনি দীর্ঘ ক্লাউড অ্যাঙ্কর আইডিগুলোতে সংক্ষিপ্ত কোড নির্ধারণ করবেন, যাতে অন্য কোনো ব্যবহারকারীর পক্ষে তা হাতে লিখে প্রবেশ করানো সহজ হয়। আপনি শেয়ার্ড প্রেফারেন্সেস এপিআই ব্যবহার করে ক্লাউড অ্যাঙ্কর আইডিগুলোকে একটি কী-ভ্যালু টেবিলে ভ্যালু হিসেবে সংরক্ষণ করবেন। অ্যাপটি বন্ধ করে আবার চালু করলেও এই টেবিলটি অপরিবর্তিত থাকবে।

আপনার জন্য StorageManager নামে একটি হেল্পার ক্লাস আগে থেকেই দেওয়া আছে। এটি SharedPreferences API-এর একটি র‍্যাপার, যাতে নতুন ইউনিক শর্ট কোড তৈরি করার এবং ক্লাউড অ্যাঙ্কর আইডি পড়া ও লেখার মেথড রয়েছে।

স্টোরেজম্যানেজার ব্যবহার করুন

ক্লাউড অ্যাঙ্কর আইডিগুলো শর্ট কোডসহ সংরক্ষণ করার জন্য CloudAnchorFragment StorageManager ব্যবহার করতে পরিবর্তন করুন, যাতে সেগুলো সহজে পুনরুদ্ধার করা যায়।

CloudAnchorFragment এ নিম্নলিখিত নতুন ফিল্ডটি তৈরি করুন:

// Find this line...
private TapHelper tapHelper;

// And add the storageManager.
private final StorageManager storageManager = new StorageManager();

তারপর onHostComplete মেথডটি পরিবর্তন করুন:

private void onHostComplete(String cloudAnchorId, CloudAnchorState cloudState) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    int shortCode = storageManager.nextShortCode(getActivity());
    storageManager.storeUsingShortCode(getActivity(), shortCode, anchor.getCloudAnchorId());
    messageSnackbarHelper.showMessage(
        getActivity(), "Cloud Anchor Hosted. Short code: " + shortCode);
  } else {
    messageSnackbarHelper.showMessage(getActivity(), "Error while hosting: " + cloudState.toString());
  }
}

এখন, অ্যান্ড্রয়েড স্টুডিও থেকে অ্যাপটি বিল্ড ও রান করুন । যখন আপনি কোনো অ্যাঙ্কর তৈরি ও হোস্ট করবেন, তখন দেখবেন দীর্ঘ ক্লাউড অ্যাঙ্কর আইডিগুলোর পরিবর্তে সংক্ষিপ্ত কোড প্রদর্শিত হচ্ছে।

অ্যাঙ্কর স্থাপন করার ঠিক পরেই

কিছুক্ষণ অপেক্ষা করার পর

উল্লেখ্য যে, StorageManager দ্বারা তৈরি শর্ট কোডগুলো বর্তমানে সর্বদা ক্রমবর্ধমান ক্রমে বরাদ্দ করা হয়।

এরপরে, আপনি কয়েকটি UI এলিমেন্ট যোগ করবেন, যেগুলো আপনাকে শর্ট কোড প্রবেশ করাতে এবং অ্যাঙ্করগুলো পুনরায় তৈরি করতে দেবে।

সমাধান বোতামটি যোগ করুন

আপনি CLEAR বাটনের পাশে আরেকটি বাটন যোগ করবেন। এটি হবে RESOLVE বাটন। RESOLVE বাটনে ক্লিক করলে একটি ডায়ালগ বক্স খুলবে, যেখানে ব্যবহারকারীর কাছে একটি শর্ট কোড চাওয়া হবে। এই শর্ট কোডটি StorageManager থেকে Cloud Anchor ID সংগ্রহ করতে এবং অ্যাঙ্করটি রিজলভ করতে ব্যবহৃত হয়।

বাটনটি যোগ করার জন্য, আপনাকে res/layout/cloud_anchor_fragment.xml ফাইলটি পরিবর্তন করতে হবে। অ্যান্ড্রয়েড স্টুডিওতে, ফাইলটির উপর ডাবল-ক্লিক করুন, তারপর মূল XML ফাইলটি দেখার জন্য নিচের "Text" ট্যাবে ক্লিক করুন। নিম্নলিখিত পরিবর্তনগুলো করুন:

<!-- Find this element. -->
<Button
    android:text="CLEAR"
    android:id="@+id/clear_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<!-- Add this element right below. -->
<Button
    android:text="RESOLVE"
    android:id="@+id/resolve_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

এখন, CloudAnchorFragment এ একটি নতুন ফিল্ড যোগ করুন:

private Button resolveButton;

একটি নতুন পদ্ধতি যোগ করুন:

private void onResolveButtonPressed() {
  ResolveDialogFragment dialog = new ResolveDialogFragment();
  dialog.show(getFragmentMagetActivity().getSupportFragmentManagernager(), "Resolve");
}

onCreateView মেথডে resolveButton নিম্নরূপে ইনিশিয়ালাইজ করুন:

// Find these lines...
Button clearButton = rootView.findViewById(R.id.clear_button);
clearButton.setOnClickListener(v -> onClearButtonPressed());

// Add these lines right below.
resolveButton = rootView.findViewById(R.id.resolve_button);
resolveButton.setOnClickListener(v -> onResolveButtonPressed());

handleTap মেথডটি খুঁজুন এবং এটি পরিবর্তন করুন:

private void handleTap(Frame frame, Camera camera) {
  // ...

  // Find this line.
  currentAnchor = hit.createAnchor();

  // Add this line right below.
  getActivity().runOnUiThread(() -> resolveButton.setEnabled(false)); 
}

onClearButtonPressed মেথডে একটি লাইন যোগ করুন:

private void onClearButtonPressed() {
  // Clear the anchor from the scene.
    if (currentAnchor != null) {
      currentAnchor.detach();
      currentAnchor = null;
    }

    // Cancel any ongoing async operations.
    if (future != null) {
      future.cancel();
      future = null;
    }

  // The next line is the new addition.
  resolveButton.setEnabled(true);
}

অ্যান্ড্রয়েড স্টুডিও থেকে অ্যাপটি বিল্ড এবং রান করুন । আপনি CLEAR বাটনের পাশে RESOLVE বাটনটি দেখতে পাবেন। RESOLVE বাটনে ক্লিক করলে নিচে দেখানো ছবির মতো একটি ডায়ালগ বক্স আসবে।

RESOLVE বাটনটি এখন দেখা যাচ্ছে।

বাটনটিতে ক্লিক করলে এই ডায়ালগ বক্সটি প্রদর্শিত হয়।

প্লেনে ট্যাপ করে একটি অ্যাঙ্কর স্থাপন করলে RESOLVE বাটনটি নিষ্ক্রিয় হয়ে যাবে, কিন্তু CLEAR বাটনে ট্যাপ করলে এটি আবার সক্রিয় হয়ে যাবে। এটি ইচ্ছাকৃতভাবেই করা হয়েছে, যাতে দৃশ্যে একবারে কেবল একটি অ্যাঙ্করই থাকে।

‘রিজলভ অ্যাঙ্কর’ ডায়ালগ বক্সটি কোনো কাজ করে না, কিন্তু আপনি এখন সেটি পরিবর্তন করবেন।

অ্যাঙ্করগুলি সমাধান করুন

CloudAnchorFragment ক্লাসে নিম্নলিখিত মেথডগুলো যোগ করুন:

private void onShortCodeEntered(int shortCode) {
  String cloudAnchorId = storageManager.getCloudAnchorId(getActivity(), shortCode);
  if (cloudAnchorId == null || cloudAnchorId.isEmpty()) {
    messageSnackbarHelper.showMessage(
        getActivity(),
        "A Cloud Anchor ID for the short code " + shortCode + " was not found.");
    return;
  }
  resolveButton.setEnabled(false);
  future = session.resolveCloudAnchorAsync(
      cloudAnchorId, (anchor, cloudState) -> onResolveComplete(anchor, cloudState, shortCode));
}

private void onResolveComplete(Anchor anchor, CloudAnchorState cloudState, int shortCode) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Resolved. Short code: " + shortCode);
    currentAnchor = anchor;
  } else {
    messageSnackbarHelper.showMessage(
        getActivity(),
        "Error while resolving anchor with short code "
            + shortCode
            + ". Error: "
            + cloudState.toString());
    resolveButton.setEnabled(true);
  }
}

তারপর, onResolveButtonPressed মেথডটি পরিবর্তন করুন:

private void onResolveButtonPressed() {
  ResolveDialogFragment dialog = ResolveDialogFragment.createWithOkListener(
      this::onShortCodeEntered);
  dialog.show(getActivity().getSupportFragmentManager(), "Resolve");
}

অ্যান্ড্রয়েড স্টুডিও থেকে অ্যাপটি বিল্ড ও রান করুন এবং নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. একটি প্লেনে একটি অ্যাঙ্কর তৈরি করুন এবং অ্যাঙ্করটি হোস্ট হওয়ার জন্য অপেক্ষা করুন।
    শর্ট কোডটি মনে রাখবেন।
  2. অ্যাঙ্করটি মুছে ফেলার জন্য ক্লিয়ার বাটনটি চাপুন।
  3. RESOLVE বাটনটি চাপুন। ধাপ ১ থেকে পাওয়া শর্ট কোডটি প্রবেশ করান।
  4. আপনি অ্যাঙ্করটিকে পরিবেশের সাপেক্ষে ঠিক সেই অবস্থানেই দেখতে পাবেন, যেখানে আপনি এটিকে প্রথমে স্থাপন করেছিলেন।
  5. অ্যাপটি বন্ধ করে আবার খুলুন।
  6. ধাপ (3) এবং (4) পুনরাবৃত্তি করুন। আপনি আবার একই অবস্থানে একটি নতুন অ্যাঙ্কর দেখতে পাবেন।

একটি শর্ট কোড প্রবেশ করানো

অ্যাঙ্কর সফলভাবে সমাধান করা হয়েছে

৫. ডিভাইসগুলোর মধ্যে শেয়ার করুন

আপনি দেখেছেন কীভাবে একটি অ্যাঙ্করের ক্লাউড অ্যাঙ্কর আইডি আপনার ডিভাইসের লোকাল স্টোরেজে সংরক্ষণ করা যায় এবং পরে একই অ্যাঙ্করটি পুনরায় তৈরি করার জন্য তা পুনরুদ্ধার করা যায়। কিন্তু ক্লাউড অ্যাঙ্করের সম্পূর্ণ সম্ভাবনা তখনই উন্মোচিত হয়, যখন আপনি বিভিন্ন ডিভাইসের মধ্যে ক্লাউড অ্যাঙ্কর আইডিগুলো শেয়ার করতে পারেন।

আপনার অ্যাপ কীভাবে ক্লাউড অ্যাঙ্কর আইডি শেয়ার করবে, তা আপনার উপর নির্ভর করে। একটি ডিভাইস থেকে অন্য ডিভাইসে স্ট্রিংটি স্থানান্তর করার জন্য যেকোনো কিছুই ব্যবহার করা যেতে পারে। এই কোডল্যাবের জন্য, আপনি অ্যাপের ইনস্ট্যান্সগুলোর মধ্যে ক্লাউড অ্যাঙ্কর আইডি স্থানান্তর করতে ফায়ারবেস রিয়েলটাইম ডেটাবেস ব্যবহার করবেন।

ফায়ারবেস সেট আপ করা

এই অ্যাপটি ব্যবহার করার জন্য আপনাকে আপনার গুগল অ্যাকাউন্ট দিয়ে একটি ফায়ারবেস রিয়েলটাইম ডেটাবেস সেট আপ করতে হবে। অ্যান্ড্রয়েড স্টুডিওতে ফায়ারবেস অ্যাসিস্ট্যান্টের সাহায্যে এটি সহজেই করা যায়।

অ্যান্ড্রয়েড স্টুডিওতে, টুলস > ফায়ারবেস- এ ক্লিক করুন। যে অ্যাসিস্ট্যান্ট প্যানেটি পপ আপ হবে, সেখানে রিয়েলটাইম ডেটাবেস-এ ক্লিক করুন, তারপর সেভ অ্যান্ড রিট্রিভ ডেটা- তে ক্লিক করুন:

68e927cbf324a3b2.png

আপনার অ্যান্ড্রয়েড স্টুডিও প্রজেক্টকে একটি নতুন বা বিদ্যমান ফায়ারবেস প্রজেক্টের সাথে সংযুক্ত করতে 'Connect to Firebase' বোতামটিতে ক্লিক করুন।

63f3b1ffd6bd263e.png

এটি আপনাকে একটি মডিউল নির্বাচন করতে বলবে। work মডিউলটি নির্বাচন করুন:

be737c689ad6dd78.png

সংযোগ শুরু করার ডায়ালগ বক্সটি প্রদর্শিত হবে। এতে কিছুটা সময় লাগতে পারে।

b48626f8672551ee.png

আপনার গুগল অ্যাকাউন্ট দিয়ে সাইন ইন করুন এবং অ্যান্ড্রয়েড স্টুডিওতে ফিরে না আসা পর্যন্ত আপনার অ্যাপের জন্য একটি ফায়ারবেস প্রজেক্ট তৈরির ওয়েব ওয়ার্কফ্লোটি অনুসরণ করুন।

এরপরে, অ্যাসিস্ট্যান্ট প্যানে, আপনার অ্যাপে রিয়েলটাইম ডেটাবেস যোগ করতে ক্লিক করুন:

68e0843fa2531c4c.png

যে ডায়ালগ বক্সটি আসবে, সেখানে টার্গেট মডিউল ড্রপ-ডাউন থেকে 'work' নির্বাচন করুন, তারপর 'Accept Changes'-এ ক্লিক করুন।

155fd89533c02671.png

এর ফলে:

  1. আপনার work ডিরেক্টরিতে একটি google-services.json ফাইল যোগ করুন।
  2. একই ডিরেক্টরিতে থাকা আপনার build.gradle ফাইলে কয়েকটি লাইন যোগ করুন।
  3. অ্যাপটি বিল্ড ও রান করুন (এবং আপনি ফায়ারবেস ডাটাবেস ভার্সন নম্বর সম্পর্কে একটি রিজলভ এরর দেখতে পারেন)।

work মডিউলের build.gradle ফাইলে, নিম্নলিখিত লাইনটি খুঁজুন এবং মুছে ফেলুন ( xxxx হলো সর্বশেষ সংস্করণ নম্বরের জন্য একটি প্লেসহোল্ডার)।

dependencies {
  ...
  implementation 'com.google.firebase:firebase-database:xxxx'

এরপরে, আপনার Firebase Realtime Database-কে বিশ্বব্যাপী লেখার যোগ্য (world writable) করার জন্য , 'configure your rules for public access ' পেজ থেকে লিঙ্ক করা নির্দেশাবলী পর্যালোচনা করুন (কিন্তু এখনই অনুসরণ করবেন না)। এটি এই কোডল্যাবে টেস্টিং সহজ করতে সাহায্য করে:

666ebefd39019c05.png

Firebase Console থেকে, আপনার Android Studio প্রজেক্টটি যেটির সাথে সংযুক্ত করেছেন সেটি নির্বাচন করুন, তারপর BUILD > Realtime Database নির্বাচন করুন।

ফায়ারবেস রিয়েলটাইম ডেটাবেস অবস্থান

রিয়েলটাইম ডেটাবেস কনফিগার ও সেটআপ করতে 'ডেটাবেস তৈরি করুন'- এ ক্লিক করুন:

ডাটাবেস তৈরি করুন

যেকোনো ডাটাবেস অবস্থান নির্বাচন করুন।

পরবর্তী ধাপে, টেস্ট মোড নিরাপত্তা নিয়মগুলি নির্বাচন করুন এবং সক্ষম করুন- এ ক্লিক করুন:

ডাটাবেস নিরাপত্তা

আপনার অ্যাপটি এখন ফায়ারবেস ডাটাবেস ব্যবহার করার জন্য কনফিগার করা হয়েছে।

ফায়ারবেস ম্যানেজার ব্যবহার করে

এখন আপনি StorageManager FirebaseManager দ্বারা প্রতিস্থাপন করবেন।

অ্যান্ড্রয়েড স্টুডিওতে, work ডিরেক্টরির অধীনে CloudAnchorFragment ক্লাসটি খুঁজুন। StorageManager একটি FirebaseManager দিয়ে প্রতিস্থাপন করুন:

// Find this line.
private final StorageManager storageManager = new StorageManager();

// And replace it with this line.
private FirebaseManager firebaseManager;

onAttach মেথডে firebaseManager ইনিশিয়ালাইজ করুন:

public void onAttach(@NonNull Context context) {
  super.onAttach(context);
  tapHelper = new TapHelper(context);
  trackingStateHelper = new TrackingStateHelper(requireActivity());

  // The next line is the new addition.
  firebaseManager = new FirebaseManager(context);
}

onShortCodeEntered মেথডটি নিম্নরূপে পরিবর্তন করুন:

private void onShortCodeEntered(int shortCode) {
  firebaseManager.getCloudAnchorId(shortCode, cloudAnchorId -> {
    if (cloudAnchorId == null || cloudAnchorId.isEmpty()) {
      messageSnackbarHelper.showMessage(
          getActivity(),
          "A Cloud Anchor ID for the short code " + shortCode + " was not found.");
      return;
    }
    resolveButton.setEnabled(false);
    future = session.resolveCloudAnchorAsync(
        cloudAnchorId, (anchor, cloudState) -> onResolveComplete(anchor, cloudState, shortCode));
  });
}

তারপর, onHostComplete মেথডটি নিম্নরূপভাবে পরিবর্তন করুন:

private void onHostComplete(String cloudAnchorId, CloudAnchorState cloudState) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    firebaseManager.nextShortCode(shortCode -> {
      if (shortCode != null) {
        firebaseManager.storeUsingShortCode(shortCode, cloudAnchorId);
        messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Hosted. Short code: " + shortCode);
      } else {
        // Firebase could not provide a short code.
        messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Hosted, but could not "
            + "get a short code from Firebase.");
      }
    });
  } else {
    messageSnackbarHelper.showMessage(getActivity(), "Error while hosting: " + cloudState.toString());
  }
}

আপনার অ্যাপটি বিল্ড করে রান করুন । আপনি আগের অংশের মতোই UI ফ্লো দেখতে পাবেন, তবে এখন ডিভাইস-লোকাল স্টোরেজের পরিবর্তে ক্লাউড অ্যাঙ্কর আইডি এবং শর্ট কোডগুলো সংরক্ষণ করার জন্য অনলাইন ফায়ারবেস ডেটাবেস ব্যবহার করা হচ্ছে।

একাধিক ব্যবহারকারী পরীক্ষা

একাধিক ব্যবহারকারীর অভিজ্ঞতা পরীক্ষা করার জন্য, দুটি ভিন্ন ফোন ব্যবহার করুন:

  1. দুটি ডিভাইসে অ্যাপটি ইনস্টল করুন।
  2. একটি ডিভাইস ব্যবহার করে অ্যাঙ্কর হোস্ট করুন এবং শর্ট কোড তৈরি করুন।
  3. অন্য ডিভাইসটি ব্যবহার করে ঐ শর্ট কোডটির সাহায্যে অ্যাঙ্করটি সমাধান করুন।

আপনার এমন সুবিধা হওয়া উচিত যে, আপনি একটি ডিভাইস থেকে অ্যাঙ্কর হোস্ট করতে পারবেন, একটি শর্ট কোড পাবেন এবং অন্য ডিভাইসে সেই শর্ট কোডটি ব্যবহার করে একই জায়গায় অ্যাঙ্করটি দেখতে পারবেন!

৬. উপসংহার

অভিনন্দন! আপনি এই কোডল্যাবের শেষ প্রান্তে পৌঁছেছেন!

আমরা যা আলোচনা করেছি

  • ARCore SDK ব্যবহার করে কীভাবে অ্যাঙ্কর হোস্ট করবেন এবং ক্লাউড অ্যাঙ্কর আইডি পাবেন।
  • অ্যাঙ্কর রিজলভ করতে ক্লাউড অ্যাঙ্কর আইডি কীভাবে ব্যবহার করবেন
  • একই ডিভাইসে বা ভিন্ন ভিন্ন ডিভাইসে বিভিন্ন AR সেশনের মধ্যে ক্লাউড অ্যাঙ্কর আইডি কীভাবে সংরক্ষণ এবং শেয়ার করবেন।

আরও জানুন