অ্যান্ড্রয়েড এসডিকে (কোটলিন/জাভা) এ বাস্তব-বিশ্বের সামগ্রীর অবস্থানের জন্য জিওস্পেশিয়াল অ্যাঙ্কর ব্যবহার করুন

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

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

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

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

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

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

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

পূর্বশর্ত

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

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

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

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

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

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

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

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

Earth.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 পান

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

WGS84 অ্যাঙ্কর

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

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

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

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

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

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

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

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

জাভা

if (earth != null && earth.getTrackingState() == TrackingState.TRACKING) {
  Anchor anchor =
    earth.createAnchor(
      /* Location values */
      latitude,
      longitude,
      altitude,
      /* Rotational pose values */
      qx,
      qy,
      qz,
      qw);

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

কোটলিন

if (earth.trackingState == TrackingState.TRACKING) {
  val anchor =
    earth.createAnchor(
      /* Location values */
      latitude,
      longitude,
      altitude,
      /* Rotational pose values */
      qx,
      qy,
      qz,
      qw
    )

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

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

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

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

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

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

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

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

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

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

জাভা

final ResolveAnchorOnTerrainFuture future =
  earth.resolveAnchorOnTerrainAsync(
    latitude,
    longitude,
    /* altitudeAboveTerrain= */ 0.0f,
    qx,
    qy,
    qz,
    qw,
    (anchor, state) -> {
      if (state == TerrainAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    });

কোটলিন

var future =
  earth.resolveAnchorOnTerrainAsync(
    latitude,
    longitude,
    altitudeAboveTerrain,
    qx,
    qy,
    qz,
    qw,
    { anchor, state ->
      if (state == TerrainAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    }
  )

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

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

রাজ্য বর্ণনা
FutureState.PENDING অপারেশন এখনো বাকি আছে।
FutureState.DONE অপারেশন সম্পূর্ণ এবং ফলাফল পাওয়া যায়.
FutureState.CANCELLED অপারেশন বাতিল করা হয়েছে।

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

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

জাভা

switch (terrainAnchorState) {
  case SUCCESS:
    // A resolving task for this Terrain anchor has finished successfully.
    break;
  case ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized
    // for troubleshooting steps.
    break;
  case ERROR_INTERNAL:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    // not reachable
    break;
}

কোটলিন

when (state) {
  TerrainAnchorState.SUCCESS -> {
    // A resolving task for this Terrain anchor has finished successfully.
  }
  TerrainAnchorState.ERROR_UNSUPPORTED_LOCATION -> {
    // The requested anchor is in a location that isn't supported by the Geospatial API.
  }
  TerrainAnchorState.ERROR_NOT_AUTHORIZED -> {
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized
    // for troubleshooting steps.
  }
  TerrainAnchorState.ERROR_INTERNAL -> {
    // The Terrain anchor could not be resolved due to an internal error.
  }
  else -> {
    // Default.
  }
}

ছাদ নোঙ্গর

ছাদ নোঙর হিরো

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

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

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

একটি রুফটপ অ্যাঙ্কর তৈরি করতে এবং স্থাপন করতে, Earth.resolveAnchorOnRooftopAsync() কল করুন। একইভাবে ভূখণ্ডের অ্যাঙ্করগুলির জন্য, আপনি ভবিষ্যতের FutureState অ্যাক্সেস করতে পারবেন। তারপর আপনি Anchor.RooftopAnchorState অ্যাক্সেস করতে ভবিষ্যতের ফলাফল পরীক্ষা করতে পারেন।

জাভা

final ResolveAnchorOnRooftopFuture future =
  earth.resolveAnchorOnRooftopAsync(
    latitude,
    longitude,
    /* altitudeAboveRooftop= */ 0.0f,
    qx,
    qy,
    qz,
    qw,
    (anchor, state) -> {
      if (state == RooftopAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    });

কোটলিন

var future =
  earth.resolveAnchorOnRooftopAsync(
    latitude,
    longitude,
    altitudeAboveRooftop,
    qx,
    qy,
    qz,
    qw,
    { anchor, state ->
      if (state == RooftopAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    }
  )

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

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

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

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

জাভা

switch (rooftopAnchorState) {
  case SUCCESS:
    // A resolving task for this Rooftop anchor has finished successfully.
    break;
  case ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API.
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized
    // for troubleshooting steps.
    break;
  case ERROR_INTERNAL:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    // not reachable
    break;
}

কোটলিন

when (state) {
  RooftopAnchorState.SUCCESS -> {
    // A resolving task for this Rooftop anchor has finished successfully.
  }
  RooftopAnchorState.ERROR_UNSUPPORTED_LOCATION -> {
    // The requested anchor is in a location that isn't supported by the Geospatial API.
  }
  RooftopAnchorState.ERROR_NOT_AUTHORIZED -> {
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized
    // for troubleshooting steps.
  }
  RooftopAnchorState.ERROR_INTERNAL -> {
    // The Rooftop anchor could not be resolved due to an internal error.
  }
  else -> {
    // Default.
  }
}

এরপর কি