অ্যান্ড্রয়েড NDK-এ বাস্তব-বিশ্বের বিষয়বস্তু অবস্থান করতে ভূ-স্থানিক অ্যাঙ্কর ব্যবহার করুন

জিওস্পেশিয়াল অ্যাঙ্কর হল এক ধরনের অ্যাঙ্কর যা আপনাকে বাস্তব জগতে 3D সামগ্রী রাখতে দেয়।

ভূ-স্থানিক অ্যাঙ্করগুলির প্রকারভেদ

তিন ধরনের জিওস্পেশিয়াল অ্যাঙ্কর রয়েছে, যেগুলো প্রত্যেকটি উচ্চতাকে ভিন্নভাবে পরিচালনা করে:

  1. WGS84 অ্যাঙ্কর :
    WGS84 অ্যাঙ্কর আপনাকে যে কোনো অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতায় 3D সামগ্রী রাখতে দেয়।

  2. ভূখণ্ড নোঙ্গর :
    ভূখণ্ড অ্যাঙ্করগুলি আপনাকে সেই অবস্থানে ভূখণ্ডের সাথে সম্পর্কিত উচ্চতা সহ শুধুমাত্র অক্ষাংশ এবং দ্রাঘিমাংশ ব্যবহার করে সামগ্রী রাখতে দেয়৷ উচ্চতা ভিপিএস দ্বারা পরিচিত স্থল বা তল সাপেক্ষে নির্ধারিত হয়।

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

WGS84 ভূখণ্ড ছাদ
আনুভূমিক অবস্থান অক্ষাংশ দ্রাঘিমাংশ অক্ষাংশ দ্রাঘিমাংশ অক্ষাংশ দ্রাঘিমাংশ
উল্লম্ব অবস্থান WGS84 উচ্চতার সাথে আপেক্ষিক Google মানচিত্র দ্বারা নির্ধারিত ভূখণ্ড স্তরের সাথে সম্পর্কিত Google মানচিত্র দ্বারা নির্ধারিত ছাদের স্তরের সাথে সম্পর্কিত৷
সার্ভার-সমাধান করা প্রয়োজন? না হ্যাঁ হ্যাঁ

পূর্বশর্ত

এগিয়ে যাওয়ার আগে নিশ্চিত করুন যে আপনি ভূ-স্থানীয় API সক্ষম করেছেন

স্থান ভূ-স্থানিক নোঙ্গর

প্রতিটি অ্যাঙ্কর টাইপ তাদের তৈরি করতে উত্সর্গীকৃত API আছে; আরও তথ্যের জন্য জিওস্পেশিয়াল অ্যাঙ্করগুলির প্রকারগুলি দেখুন৷

একটি হিট-পরীক্ষা থেকে একটি অ্যাঙ্কর তৈরি করুন

আপনি একটি হিট-পরীক্ষার ফলাফল থেকে একটি ভূ-স্থানীয় অ্যাঙ্করও তৈরি করতে পারেন। হিট-টেস্ট থেকে পোজটি ব্যবহার করুন এবং এটিকে একটি ArGeospatialPose এ রূপান্তর করুন। বর্ণিত 3টি অ্যাঙ্কর প্রকারের যে কোনো স্থাপন করতে এটি ব্যবহার করুন।

একটি এআর পোজ থেকে একটি ভূ-স্থানিক ভঙ্গি পান

ArEarth_getGeospatialPose() একটি AR পোজকে একটি ভূ-স্থানিক ভঙ্গিতে রূপান্তর করে অক্ষাংশ এবং দ্রাঘিমাংশ নির্ধারণ করার একটি অতিরিক্ত উপায় প্রদান করে।

একটি ভূ-স্থানিক ভঙ্গি থেকে একটি এআর পোজ পান

ArEarth_getPose() একটি পূর্ব-উপ-দক্ষিণ স্থানাঙ্ক ফ্রেমের সাপেক্ষে একটি আর্থ-নির্দিষ্ট অনুভূমিক অবস্থান, উচ্চতা এবং চতুর্ভুজ ঘূর্ণনকে GL ওয়ার্ল্ড কোঅর্ডিনেটের সাপেক্ষে একটি AR পোজে রূপান্তরিত করে।

আপনার ব্যবহারের ক্ষেত্রে কোন পদ্ধতি উপযুক্ত তা চয়ন করুন

একটি অ্যাঙ্কর তৈরির প্রতিটি পদ্ধতি মনে রাখতে সংশ্লিষ্ট ট্রেডঅফ রয়েছে:

  • স্ট্রিটস্কেপ জ্যামিতি ব্যবহার করার সময়, একটি বিল্ডিং-এ সামগ্রী সংযুক্ত করতে একটি হিট-টেস্ট ব্যবহার করুন৷
  • WGS84 অ্যাঙ্করগুলির চেয়ে ভূখণ্ড বা ছাদের নোঙ্গরগুলি পছন্দ করুন কারণ তারা Google মানচিত্র দ্বারা নির্ধারিত উচ্চতা মান ব্যবহার করে৷

একটি অবস্থানের অক্ষাংশ এবং দ্রাঘিমাংশ নির্ধারণ করুন

তিনটি উপায়ে আপনি একটি অবস্থানের অক্ষাংশ এবং দ্রাঘিমাংশ গণনা করতে পারেন:

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

গুগল ম্যাপ ব্যবহার করুন

Google মানচিত্র ব্যবহার করে একটি অবস্থানের অক্ষাংশ এবং দ্রাঘিমাংশ পেতে:

  1. আপনার ডেস্কটপ কম্পিউটারে গুগল ম্যাপে যান।

  2. লেয়ার > আরও- এ নেভিগেট করুন।

  3. স্যাটেলাইটে মানচিত্রের ধরন পরিবর্তন করুন এবং স্ক্রিনের নীচে বাম কোণে গ্লোব ভিউ চেকবক্সটি সাফ করুন।

    এটি একটি 2D দৃষ্টিকোণকে জোর করবে এবং একটি কোণীয় 3D দৃশ্য থেকে আসা সম্ভাব্য ত্রুটিগুলি দূর করবে৷

  4. মানচিত্রে, অবস্থানের উপর ডান-ক্লিক করুন এবং আপনার ক্লিপবোর্ডে অনুলিপি করতে দ্রাঘিমাংশ/অক্ষাংশ নির্বাচন করুন।

গুগল আর্থ ব্যবহার করুন

আপনি UI-তে একটি অবস্থানে ক্লিক করে এবং স্থানচিহ্নের বিবরণ থেকে ডেটা পড়ে Google আর্থ থেকে একটি অবস্থানের অক্ষাংশ এবং দ্রাঘিমাংশ গণনা করতে পারেন।

গুগল আর্থ ব্যবহার করে একটি অবস্থানের অক্ষাংশ এবং দ্রাঘিমাংশ পেতে:

  1. আপনার ডেস্কটপ কম্পিউটারে Google Earth এ যান।

  2. হ্যামবার্গার মেনুতে নেভিগেট করুন এবং মানচিত্র শৈলী নির্বাচন করুন।

  3. 3D বিল্ডিং সুইচ বন্ধ করুন।

  4. একবার 3D বিল্ডিং সুইচ টগল অফ হয়ে গেলে, পিন আইকনে ক্লিক করুন নির্বাচিত স্থানে একটি স্থানচিহ্ন যোগ করতে।

  5. আপনার স্থানচিহ্ন ধারণ করার জন্য একটি প্রকল্প নির্দিষ্ট করুন এবং সংরক্ষণ করুন ক্লিক করুন।

  6. স্থানচিহ্নের জন্য শিরোনাম ক্ষেত্রে, স্থানচিহ্নের জন্য একটি নাম লিখুন।

  7. পিছনের তীরটিতে ক্লিক করুন প্রকল্প ফলকে এবং নির্বাচন করুন আরও অ্যাকশন মেনু।

  8. মেনু থেকে KML ফাইল হিসাবে রপ্তানি নির্বাচন করুন।

KLM ফাইলটি কমা দ্বারা পৃথক করা <coordinates> ট্যাগে একটি স্থানচিহ্নের জন্য অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা রিপোর্ট করে, নিম্নরূপ:

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

<LookAt> ট্যাগগুলি থেকে অক্ষাংশ এবং দ্রাঘিমাংশ ব্যবহার করবেন না , যা ক্যামেরা অবস্থান নির্দিষ্ট করে, অবস্থান নয়।

শারীরিক অবস্থানে যান

আপনি সেখানে শারীরিকভাবে গিয়ে এবং স্থানীয় পর্যবেক্ষণ করে একটি অবস্থানের উচ্চতা গণনা করতে পারেন।

ঘূর্ণন quaternion পান

ArGeospatialPose_getEastUpSouthQuaternion() একটি ভূ-স্থানিক ভঙ্গি থেকে ওরিয়েন্টেশন বের করে এবং একটি চতুর্ভুজ আউটপুট করে যা একটি ভেক্টরকে লক্ষ্য থেকে পূর্ব-আপ-দক্ষিণ (EUS) স্থানাঙ্ক সিস্টেমে রূপান্তরিত করে ঘূর্ণন ম্যাট্রিক্সের প্রতিনিধিত্ব করে। X+ পয়েন্ট পূর্বে, Y+ পয়েন্ট উপরে এবং Z+ পয়েন্ট দক্ষিণে। মানগুলি {x, y, z, w} ক্রমে লেখা হয়।

WGS84 অ্যাঙ্কর

একটি WGS84 অ্যাঙ্কর হল এক ধরনের অ্যাঙ্কর যা আপনাকে যেকোন অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতায় 3D সামগ্রী রাখতে দেয়। এটি বাস্তব জগতে স্থাপন করার জন্য একটি ভঙ্গি এবং অভিযোজনের উপর নির্ভর করে। অবস্থানটি একটি অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা নিয়ে গঠিত, যা WGS84 স্থানাঙ্ক সিস্টেমে নির্দিষ্ট করা হয়েছে। স্থিতিবিন্যাস একটি quaternion ঘূর্ণন গঠিত.

উচ্চতা রেফারেন্স WGS84 উপবৃত্তাকার উপরে মিটারে রিপোর্ট করা হয়েছে এমন যে স্থল স্তর শূন্য নয় । আপনার অ্যাপ প্রতিটি তৈরি অ্যাঙ্করের জন্য এই স্থানাঙ্কগুলি প্রদানের জন্য দায়ী৷

বাস্তব জগতে একটি WGS84 অ্যাঙ্কর রাখুন

একটি অবস্থানের উচ্চতা নির্ধারণ করুন

অ্যাঙ্কর স্থাপনের জন্য একটি অবস্থানের উচ্চতা নির্ধারণ করার কয়েকটি উপায় রয়েছে:

  • যদি অ্যাঙ্করের অবস্থান শারীরিকভাবে ব্যবহারকারীর কাছাকাছি থাকে, তাহলে আপনি একটি উচ্চতা ব্যবহার করতে পারেন যা ব্যবহারকারীর ডিভাইসের উচ্চতার মতো।
  • একবার আপনার অক্ষাংশ এবং দ্রাঘিমাংশ পেয়ে গেলে, EGM96 স্পেসিফিকেশনের উপর ভিত্তি করে একটি উচ্চতা পেতে Elevation API ব্যবহার করুন। ArGeospatialPose উচ্চতার সাথে তুলনা করার জন্য আপনাকে অবশ্যই Maps API EGM96 উচ্চতাকে WGS84 তে রূপান্তর করতে হবে। GeoidEval দেখুন যেটিতে একটি কমান্ড লাইন এবং একটি HTML ইন্টারফেস উভয়ই রয়েছে। মানচিত্র API বাক্সের বাইরে WGS84 স্পেসিফিকেশন অনুযায়ী অক্ষাংশ এবং দ্রাঘিমাংশ রিপোর্ট করে।
  • আপনি Google আর্থ থেকে একটি অবস্থানের অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা পেতে পারেন। এটি আপনাকে কয়েক মিটার পর্যন্ত একটি ত্রুটি মার্জিন দেবে। KML ফাইলে <coordinates> ট্যাগগুলি থেকে অক্ষাংশ, দ্রাঘিমাংশ এবং উচ্চতা ব্যবহার করুন, <LookAt> ট্যাগগুলি নয়
  • যদি একটি বিদ্যমান অ্যাঙ্কর কাছাকাছি থাকে এবং আপনি যদি খাড়া বাঁকের উপর না থাকেন, তাহলে আপনি অন্য কোনো উৎস যেমন মানচিত্র API ব্যবহার না করেই ক্যামেরার ArGeospatialPose থেকে উচ্চতা ব্যবহার করতে পারবেন।

অ্যাঙ্কর তৈরি করুন

একবার আপনার অক্ষাংশ, দ্রাঘিমাংশ, উচ্চতা, এবং ঘূর্ণন চতুর্ভুজ হয়ে গেলে, আপনার নির্দিষ্ট করা ভৌগলিক স্থানাঙ্কে বিষয়বস্তু অ্যাঙ্কর করতে ArEarth_acquireNewAnchor() ব্যবহার করুন।

float eus_quaternion_4[4] = {qx, qy, qz, qw};
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArAnchor* earth_anchor = NULL;
    ArStatus status = ArEarth_acquireNewAnchor(ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude,
        eus_quaternion_4, &earth_anchor);

    // Attach content to the anchor specified by geodetic location and
    // pose.
  }
}

ভূখণ্ড অ্যাঙ্কর

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

পছন্দসই উচ্চতা ইনপুট করার পরিবর্তে, আপনি ভূখণ্ডের উপরে উচ্চতা প্রদান করেন। যখন এটি শূন্য হয় তখন নোঙ্গরটি ভূখণ্ডের সাথে সমান হবে।

প্লেন-ফাইন্ডিং মোড সেট করুন

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

আপনার অ্যাপ কীভাবে প্লেন শনাক্ত করে তা নির্বাচন করতে ArPlaneFindingMode ব্যবহার করুন।

নতুন Async API ব্যবহার করে একটি ভূখণ্ড অ্যাঙ্কর তৈরি করুন

একটি ভূখণ্ড অ্যাঙ্কর তৈরি করতে এবং স্থাপন করতে, ArEarth_resolveAnchorOnTerrainAsync() কল করুন।

অ্যাঙ্কর এখনই প্রস্তুত হবে না এবং সমাধান করতে হবে। এটি সমাধান হয়ে গেলে এটি ArResolveAnchorOnTerrainFuture এ উপলব্ধ হবে।

ArResolveAnchorOnTerrainFuture_getResultTerrainAnchorState() ব্যবহার করে ভূখণ্ডের অ্যাঙ্কর অবস্থা পরীক্ষা করুন। ArResolveAnchorOnTerrainFuture_acquireResultAnchor() ব্যবহার করে সমাধান করা অ্যাঙ্কর পান।

float eus_quaternion_4[4] = {qx, qy, qz, qw};
void* context = NULL;
ArResolveAnchorOnTerrainCallback callback = NULL;
ArResolveAnchorOnTerrainFuture* future = NULL;
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArStatus status = ArEarth_resolveAnchorOnTerrainAsync(
        ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude_above_terrain, eus_quaternion_4,
        context, callback, &future);
  }
}

ভবিষ্যতের অবস্থা পরীক্ষা করুন

ভবিষ্যৎ এর সাথে যুক্ত ArFutureState থাকবে।

অবস্থা বর্ণনা
AR_FUTURE_STATE_PENDING অপারেশন এখনো বাকি আছে।
AR_FUTURE_STATE_DONE অপারেশন সম্পূর্ণ এবং ফলাফল পাওয়া যায়.
AR_FUTURE_STATE_CANCELLED অপারেশন বাতিল করা হয়েছে।

ভবিষ্যত ফলাফলের ভূখণ্ড অ্যাঙ্কর অবস্থা পরীক্ষা করুন

ArTerrainAnchorState অ্যাসিঙ্ক্রোনাস অপারেশনের অন্তর্গত এবং চূড়ান্ত ভবিষ্যতের ফলাফলের অংশ।

switch (terrain_anchor_state) {
  case AR_TERRAIN_ANCHOR_STATE_SUCCESS:
    // A resolving task for this anchor has been successfully resolved.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the
    // Geospatial API.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided
    // for troubleshooting steps.
    break;
  case AR_TERRAIN_ANCHOR_STATE_ERROR_INTERNAL:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

ছাদ নোঙ্গর

ছাদ নোঙর হিরো

ছাদের নোঙ্গরগুলি হল এক ধরণের নোঙ্গর এবং উপরের ভূখণ্ডের অ্যাঙ্করগুলির সাথে খুব মিল। পার্থক্য হল আপনি ভূখণ্ডের উপরে উচ্চতার পরিবর্তে ছাদের উপরে উচ্চতা প্রদান করবেন।

নতুন Async API ব্যবহার করে একটি রুফটপ অ্যাঙ্কর তৈরি করুন

অ্যাঙ্কর এখনই প্রস্তুত হবে না এবং সমাধান করতে হবে।

একটি রুফটপ অ্যাঙ্কর তৈরি করতে এবং স্থাপন করতে, ArEarth_resolveAnchorOnRooftopAsync() কল করুন। একইভাবে টেরেন অ্যাঙ্করগুলির মতো, আপনি ভবিষ্যতের ArFutureState অ্যাক্সেস করতে পারবেন। তারপর আপনি ArRooftopAnchorState অ্যাক্সেস করতে ভবিষ্যতের ফলাফল পরীক্ষা করতে পারেন।

একটি ArResolveAnchorOnRooftopFuture তৈরি করতে ArEarth_resolveAnchorOnRooftopAsync() ব্যবহার করুন।

ArResolveAnchorOnRooftopFuture_getResultRooftopAnchorState() ব্যবহার করে ছাদের নোঙ্গর অবস্থা পরীক্ষা করুন।

ArResolveAnchorOnRooftopFuture_acquireResultAnchor() ব্যবহার করে সমাধান করা অ্যাঙ্কর পান।

float eus_quaternion_4[4] = {qx, qy, qz, qw};
void* context = NULL;
ArResolveAnchorOnRooftopCallback callback = NULL;
ArResolveAnchorOnRooftopFuture* future = NULL;
if (ar_earth != NULL) {
  ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED;
  ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth,
                               &earth_tracking_state);
  if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) {
    ArStatus status = ArEarth_resolveAnchorOnRooftopAsync(
        ar_session, ar_earth,
        /* location values */
        latitude, longitude, altitude_above_rooftop, eus_quaternion_4,
        context, callback, &future);
  }
}

ভবিষ্যতের অবস্থা পরীক্ষা করুন

ভবিষ্যতের একটি যুক্ত ArFutureState থাকবে, উপরের টেবিলটি দেখুন।

ভবিষ্যতের ফলাফলের ছাদের নোঙ্গর অবস্থা পরীক্ষা করুন

ArRooftopAnchorState অ্যাসিঙ্ক্রোনাস অপারেশনের অন্তর্গত এবং চূড়ান্ত ভবিষ্যতের ফলাফলের অংশ।

switch (rooftop_anchor_state) {
  case AR_ROOFTOP_ANCHOR_STATE_SUCCESS:
    // A resolving task for this anchor has been successfully resolved.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the
    // Geospatial API.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided
    // for troubleshooting steps.
    break;
  case AR_ROOFTOP_ANCHOR_STATE_ERROR_INTERNAL:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

এরপর কি