ARCore অগমেন্টেড ছবি

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

ARCore হলো অ্যান্ড্রয়েডে অগমেন্টেড রিয়েলিটি অ্যাপ তৈরির একটি প্ল্যাটফর্ম। অগমেন্টেড ইমেজ আপনাকে এমন AR অ্যাপ তৈরি করার ক্ষমতা দেয় যা বাস্তব জগতের পূর্ব-নিবন্ধিত 2D ছবি শনাক্ত করতে পারে এবং সেগুলোর উপরে ভার্চুয়াল কন্টেন্ট স্থাপন করতে পারে।

এই কোডল্যাবটি আপনাকে একটি বিদ্যমান ARCore স্যাম্পল অ্যাপ পরিবর্তন করে তাতে চলমান বা স্থির অগমেন্টেড ইমেজ অন্তর্ভুক্ত করার পদ্ধতি ধাপে ধাপে দেখাবে।

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

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

  • একটি চিত্র লক্ষ্যবস্তু শনাক্ত করুন এবং লক্ষ্যবস্তুটির উপর একটি ভার্চুয়াল গোলকধাঁধা সংযুক্ত করুন।
  • চলমান লক্ষ্যবস্তুটি যতক্ষণ ক্যামেরার দৃষ্টিসীমার মধ্যে থাকবে, ততক্ষণ সেটিকে অনুসরণ করুন।

6bc6605df89de525.gif

আপনি কি প্রথমবারের মতো ARCore অ্যাপ তৈরি করছেন?

হ্যাঁ না

আপনি কি এই কোডল্যাবে নমুনা কোড লেখার পরিকল্পনা করছেন, নাকি শুধু এই পৃষ্ঠাগুলো পড়তে চান?

নমুনা কোড লিখুন শুধু এই পৃষ্ঠাগুলো পড়ুন।

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

  • জাভার ARCore-এ অগমেন্টেড ইমেজ কীভাবে ব্যবহার করবেন
  • ARCore দ্বারা একটি ছবির শনাক্ত হওয়ার ক্ষমতা কীভাবে পরিমাপ করা যায়
  • কীভাবে একটি ছবিতে ভার্চুয়াল কন্টেন্ট সংযুক্ত করে তার গতিবিধি ট্র্যাক করা যায়

পূর্বশর্ত

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

হার্ডওয়্যারের প্রয়োজনীয়তা

সফটওয়্যার প্রয়োজনীয়তা

  • ARCore APK 1.9.0 বা তার পরবর্তী সংস্করণ। এই APK-টি সাধারণত প্লে স্টোরের মাধ্যমে ডিভাইসে স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যায়।
  • অ্যান্ড্রয়েড স্টুডিও (সংস্করণ ৩.১ বা তার পরবর্তী সংস্করণ) সহ একটি ডেভেলপমেন্ট মেশিন।
  • ইন্টারনেট সংযোগ প্রয়োজন, কারণ ডেভেলপমেন্টের সময় লাইব্রেরি ডাউনলোড করতে হবে।

এখন যেহেতু আপনি সবকিছু প্রস্তুত করে ফেলেছেন, চলুন শুরু করা যাক!

২. উন্নয়ন পরিবেশ সেট আপ করুন

SDK ডাউনলোড করুন

আমরা GitHub থেকে সর্বশেষ ARCore Android SDK ডাউনলোড করার মাধ্যমে শুরু করব। এটিকে আপনার পছন্দের জায়গায় আনজিপ করুন। এই কোডল্যাবের জন্য, সবচেয়ে পুরোনো SDK সংস্করণটি হলো 1.18.1। ফোল্ডারটিকে arcore-android-sdk-x.xx.x হিসাবে উল্লেখ করা হবে, এর সঠিক মান হবে আপনার ব্যবহৃত SDK-এর সংস্করণ।

অ্যান্ড্রয়েড স্টুডিও চালু করুন এবং 'Open an existing Android Studio project'-এ ক্লিক করুন।

5fbf2b21609187cc.png

এই আনজিপ করা ফোল্ডারটিতে যান:

arcore-android-sdk-x.xx.x/samples/augmented_image_java

খুলুন- এ ক্লিক করুন।

অ্যান্ড্রয়েড স্টুডিওর প্রজেক্ট সিঙ্ক করা শেষ হওয়া পর্যন্ত অপেক্ষা করুন। যদি আপনার অ্যান্ড্রয়েড স্টুডিওতে প্রয়োজনীয় কম্পোনেন্টগুলো না থাকে, তাহলে এটি Install missing platform and sync project মেসেজটি দেখিয়ে ব্যর্থ হতে পারে। সমস্যাটি সমাধান করার জন্য নির্দেশাবলী অনুসরণ করুন।

নমুনা অ্যাপটি চালান

এখন যেহেতু আপনার একটি কার্যকর ARCore অ্যাপ প্রজেক্ট আছে, চলুন এটি পরীক্ষা করে দেখা যাক।

আপনার ARCore ডিভাইসটিকে ডেভেলপমেন্ট মেশিনের সাথে সংযুক্ত করুন এবং ডিভাইসে ডিবাগ সংস্করণটি চালানোর জন্য মেনু Run > Run 'app' ব্যবহার করুন। কোন ডিভাইস থেকে চালাবেন তা বেছে নেওয়ার জন্য আসা ডায়ালগ বক্সে, সংযুক্ত ডিভাইসটি নির্বাচন করুন এবং OK-তে ক্লিক করুন।

1aa2c6faa7ecdbd0.png

92e4c144a632b4ca.png

এই নমুনা প্রজেক্টটিতে targetSdkVersion 28 ব্যবহার করা হয়েছে। যদি আপনার Failed to find Build Tools revision 28.0.3 -এর মতো কোনো বিল্ড এরর আসে, তাহলে প্রয়োজনীয় অ্যান্ড্রয়েড বিল্ড টুলস ভার্সনটি ডাউনলোড ও ইনস্টল করার জন্য অ্যান্ড্রয়েড স্টুডিওতে বর্ণিত নির্দেশাবলী অনুসরণ করুন।

সবকিছু সফল হলে, নমুনা অ্যাপটি ডিভাইসে চালু হবে এবং অগমেন্টেড ইমেজকে ছবি ও ভিডিও তোলার অনুমতি দেওয়ার জন্য আপনার কাছে অনুমতি চাইবে। অনুমতি দিতে ALLOW- এ ট্যাপ করুন।

একটি নমুনা ছবি দিয়ে পরীক্ষা করুন

এখন যেহেতু আপনি আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করে ফেলেছেন, আপনি অ্যাপটিকে একটি ছবি দেখিয়ে পরীক্ষা করতে পারেন।

অ্যান্ড্রয়েড স্টুডিওতে ফিরে এসে, প্রজেক্ট উইন্ডোতে app > assets- এ যান এবং default.jpg ফাইলটি খুলতে সেটিতে ডাবল-ক্লিক করুন।

9b333680e7b9f247.jpeg

স্ক্রিনে থাকা পৃথিবীর ছবির দিকে আপনার ডিভাইসের ক্যামেরা তাক করুন এবং স্ক্যান করা ছবিটি ক্রসহেয়ারের মধ্যে ঠিকভাবে বসানোর জন্য নির্দেশাবলী অনুসরণ করুন।

ছবিটির উপরে একটি ইমেজ ফ্রেম এভাবে যুক্ত হবে:

999e05ed35964f6e.png

এরপরে, আমরা নমুনা অ্যাপটিতে ছোটখাটো কিছু উন্নতি করব।

৩. দ্বি-মাত্রিক চিত্রে একটি গোলকধাঁধার মডেল প্রদর্শন করুন।

এর উপরে একটি 3D মডেল প্রদর্শন করে আপনি অগমেন্টেড ইমেজ নিয়ে কাজ শুরু করতে পারেন।

একটি 3D মডেল ডাউনলোড করুন

এই কোডল্যাবের জন্য আমরা Evol-এর তৈরি এবং CC-BY 3.0 লাইসেন্সের অধীনে থাকা " Circle Maze - Green " মডেলটি ব্যবহার করব। আমি এই ৩ডি মডেলটির একটি কপি এই কোডল্যাবের গিটহাব রিপোজিটরিতে সংরক্ষণ করেছি, যা আপনি এখানে খুঁজে পাবেন।

মডেলটি ডাউনলোড করতে এবং অ্যান্ড্রয়েড স্টুডিওতে অন্তর্ভুক্ত করতে এই ধাপগুলো অনুসরণ করুন।

  1. এই কোডল্যাবের গিটহাব রিপোজিটরির third_party ডিরেক্টরিতে যান।
  2. GreenMaze_obj.zip- এ ক্লিক করুন এবং ডাউনলোড বোতামে ক্লিক করুন।

এটি GreenMaze_obj.zip নামের একটি ফাইল ডাউনলোড করবে।

  1. অ্যান্ড্রয়েড স্টুডিওতে, app > assets > models এর অধীনে green-maze ডিরেক্টরি তৈরি করুন।
  2. GreenMaze_obj.zip আনজিপ করুন এবং এর ভেতরের ফাইলগুলো এই লোকেশনে কপি করুন: arcore-android-sdk-x.xx.x/samples/augmented_image_java/app/src/main/assets/models/green-maze
  3. অ্যান্ড্রয়েড স্টুডিওতে, app > assets > models > green-maze -এ যান।

এই ফোল্ডারে GreenMaze.obj এবং GreenMaze.mtl নামে দুটি ফাইল থাকার কথা।

a1f33a2d2d407e03.png

গোলকধাঁধার মডেলটি রেন্ডার করুন

বিদ্যমান 2D ছবির উপরে GreenMaze.obj 3D মডেলটি প্রদর্শন করতে এই ধাপগুলো অনুসরণ করুন।

AugmentedImageRenderer.java ফাইলে, মেজ মডেলটি রেন্ডার করার জন্য mazeRenderer নামে একটি মেম্বার ভ্যারিয়েবল যোগ করুন। যেহেতু মেজটি ইমেজের সাথে সংযুক্ত হবে, তাই mazeRenderer AugmentedImageRenderer ক্লাসের ভেতরে রাখাই যুক্তিযুক্ত।

AugmentedImageRenderer.java

  // Add a member variable to hold the maze model.
  private final ObjectRenderer mazeRenderer = new ObjectRenderer();

createOnGlThread() ` ফাংশনে ` GreenMaze.obj ফাইলটি লোড করুন। সরলতার জন্য, এর টেক্সচার হিসেবে ফ্রেমের টেক্সচারটিই ব্যবহার করুন।

AugmentedImageRenderer.java

  // Replace the definition of the createOnGlThread() function with the
  // following code, which loads GreenMaze.obj.
  public void createOnGlThread(Context context) throws IOException {

    mazeRenderer.createOnGlThread(
        context, "models/green-maze/GreenMaze.obj", "models/frame_base.png");
    mazeRenderer.setMaterialProperties(0.0f, 3.5f, 1.0f, 6.0f);

  }

draw() ` ফাংশনের সংজ্ঞাটি নিম্নলিখিতটি দিয়ে প্রতিস্থাপন করুন। এটি সনাক্ত করা ছবির আকারের সাথে মেজের আকারকে সামঞ্জস্য করে এবং এটিকে স্ক্রিনে রেন্ডার করে।

AugmentedImageRenderer.java

  // Adjust size of detected image and render it on-screen
  public void draw(
      float[] viewMatrix,
      float[] projectionMatrix,
      AugmentedImage augmentedImage,
      Anchor centerAnchor,
      float[] colorCorrectionRgba) {
    float[] tintColor =
        convertHexToColor(TINT_COLORS_HEX[augmentedImage.getIndex() % TINT_COLORS_HEX.length]);

    final float mazeEdgeSize = 492.65f; // Magic number of maze size
    final float maxImageEdgeSize = Math.max(augmentedImage.getExtentX(), augmentedImage.getExtentZ()); // Get largest detected image edge size

    Pose anchorPose = centerAnchor.getPose();

    float mazeScaleFactor = maxImageEdgeSize / mazeEdgeSize; // scale to set Maze to image size
    float[] modelMatrix = new float[16];

    // OpenGL Matrix operation is in the order: Scale, rotation and Translation
    // So the manual adjustment is after scale
    // The 251.3f and 129.0f is magic number from the maze obj file
    // You mustWe need to do this adjustment because the maze obj file
    // is not centered around origin. Normally when you
    // work with your own model, you don't have this problem.
    Pose mazeModelLocalOffset = Pose.makeTranslation(
                                -251.3f * mazeScaleFactor,
                                0.0f,
                                129.0f * mazeScaleFactor);
    anchorPose.compose(mazeModelLocalOffset).toMatrix(modelMatrix, 0);
    mazeRenderer.updateModelMatrix(modelMatrix, mazeScaleFactor, mazeScaleFactor/10.0f, mazeScaleFactor); // This line relies on a change in ObjectRenderer.updateModelMatrix later in this codelab.
    mazeRenderer.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColor);
  }

এখন, গোলকধাঁধাটি পৃথিবীর default.jpg ছবিটির উপরে প্রদর্শিত হবে।

দ্রষ্টব্য: যেহেতু এই নমুনা 3D মডেলটির উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ নেই, তাই উপরের কোডটিতে কয়েকটি "ম্যাজিক" সংখ্যা ব্যবহার করা হয়েছে। মেজ মডেলটির মাত্রা হলো 492.65 x 120 x 492.65, এবং এর কেন্দ্র (251.3, 60, -129.0) এ অবস্থিত। এর শীর্ষবিন্দুগুলোর X, Y, এবং Z স্থানাঙ্কের পরিসর হলো যথাক্রমে [5.02, 497.67], [0, 120], এবং [-375.17, 117.25]। সুতরাং, মেজ মডেলটির স্কেল image_size / 492.65 হতে হবে। mazeModelLocalOffset ব্যবহার করা হয়েছে কারণ মেজের 3D মডেলটি মূলবিন্দু (0, 0, 0) কে কেন্দ্র করে অবস্থিত নয়।

গোলকধাঁধার দেয়ালটি ছবির উপরে আঁটার জন্য এখনও কিছুটা বেশি উঁচু। একটি হেল্পার ফাংশন updateModelMatrix() তৈরি করুন যা গোলকধাঁধার উচ্চতাকে ০.১ করে স্কেল করার জন্য X, Y, Z অক্ষকে অসমভাবে স্কেল করতে পারে। উল্লেখ্য, আপনাকে বিদ্যমান updateModelMatrix(float[] modelMatrix, float scaleFactor) ফাংশনটি রাখতে হবে এবং updateModelMatrix(float[] modelMatrix, float scaleFactorX, float scaleFactorY, float scaleFactorZ) ফাংশন ওভারলোডটিকে একটি নতুন ফাংশন হিসেবে যোগ করতে হবে।

common/rendering/ObjectRenderer.java

// Scale X, Y, Z coordinates unevenly
public void updateModelMatrix(float[] modelMatrix, float scaleFactorX, float scaleFactorY, float scaleFactorZ) {
    float[] scaleMatrix = new float[16];
    Matrix.setIdentityM(scaleMatrix, 0);
    scaleMatrix[0] = scaleFactorX;
    scaleMatrix[5] = scaleFactorY;
    scaleMatrix[10] = scaleFactorZ;
    Matrix.multiplyMM(this.modelMatrix, 0, modelMatrix, 0, scaleMatrix, 0);
}

কোডটি চালান। গোলকধাঁধাটি এখন ছবিটির উপরে নিখুঁতভাবে বসে যাবে।

772cbe2a8baef3ba.png

৪. অ্যান্ডিকে গোলকধাঁধায় যুক্ত করুন

এখন যেহেতু আপনার কাছে একটি গোলকধাঁধা আছে, এর ভিতরে ঘোরাফেরা করার জন্য একটি চরিত্র যোগ করুন। ARCore Android SDK-তে অন্তর্ভুক্ত andy.obj ফাইলটি ব্যবহার করুন। এর টেক্সচার হিসেবে ইমেজ ফ্রেম টেক্সচারটিই রাখুন, কারণ এটি ইমেজের উপরে রেন্ডার করা সবুজ গোলকধাঁধা থেকে দেখতে আলাদা।

AugmentedImageRenderer.java তে অ্যান্ডিকে রেন্ডার করার জন্য একটি private ObjectRenderer যোগ করুন।

AugmentedImageRenderer.java

// Render for Andy
  private final ObjectRenderer andyRenderer = new ObjectRenderer();

এরপরে, createOnGlThread() এর শেষে andyRenderer ইনিশিয়ালাইজ করুন।

AugmentedImageRenderer.java

public void createOnGlThread(Context context) throws IOException {

    // Initialize andyRenderer
    andyRenderer.createOnGlThread(
        context, "models/andy.obj", "models/andy.png");
    andyRenderer.setMaterialProperties(0.0f, 3.5f, 1.0f, 6.0f);
  }

সবশেষে, draw() ফাংশনের শেষে অ্যান্ডিকে গোলকধাঁধার উপরে দাঁড়িয়ে থাকা অবস্থায় রেন্ডার করুন।

AugmentedImageRenderer.java

public void draw(
      float[] viewMatrix,
      float[] projectionMatrix,
      AugmentedImage augmentedImage,
      Anchor centerAnchor,
      float[] colorCorrectionRgba) {


    // Render Andy, standing on top of the maze
    Pose andyModelLocalOffset = Pose.makeTranslation(
        0.0f,
        0.1f,
        0.0f);
    anchorPose.compose(andyModelLocalOffset).toMatrix(modelMatrix, 0);
    andyRenderer.updateModelMatrix(modelMatrix, 0.05f); // 0.05f is a Magic number to scale
    andyRenderer.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColor);

  }

আপনার কোডটি চালান। আপনি দেখবেন অ্যান্ডি গোলকধাঁধার চূড়ায় দাঁড়িয়ে আছে।

cb1e74569d7ace69.png

লক্ষ্য ছবির গুণমান নির্ধারণ করুন

ARCore ছবি শনাক্ত করতে ভিজ্যুয়াল ফিচারের উপর নির্ভর করে। গুণগত পার্থক্যের কারণে সব ছবি সহজে শনাক্ত করা যায় না।

arcoreimg হলো একটি কমান্ড-লাইন টুল, যার মাধ্যমে আপনি নির্ধারণ করতে পারেন যে ARCore-এর কাছে একটি ছবি কতটা শনাক্তযোগ্য হবে। এটি ০ থেকে ১০০-এর মধ্যে একটি সংখ্যা আউটপুট করে, যেখানে ১০০ হলো সবচেয়ে সহজে শনাক্তযোগ্য মান।

এখানে একটি উদাহরণ দেওয়া হলো:

arcore-android-sdk-x.xx.x/tools/arcoreimg/macos$
$ ./arcoreimg  eval-img --input_image_path=/Users/username/maze.jpg
100

maze.jpg এর মান ১০০ হওয়ায়, ARCore এটিকে সহজেই শনাক্ত করতে পারে।

৫. ঐচ্ছিক: গোলকধাঁধায় অ্যান্ডির চালটি দিন।

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

PhysicsController.java ডাউনলোড করে আপনার প্রজেক্টের ডিরেক্টরিতে যোগ করুন।

arcore-android-sdk-x.xx.x/samples/augmented_image_java/app/src/main/java/com/google/ar/core/examples/java/augmentedimage/

অ্যান্ড্রয়েড স্টুডিওতে, GreenMaze.obj ফাইলটি প্রজেক্টের অ্যাসেটস ডিরেক্টরিতে যোগ করুন, যাতে এটি রানটাইমে লোড করা যায়। App > assets > models > green-maze থেকে GreenMaze.obj ফাইলটি App > assets- এ কপি করুন।

অ্যাপের build.gradle ফাইলে নিম্নলিখিত ডিপেন্ডেন্সিগুলো যোগ করুন।

অ্যাপ/বিল্ড.গ্রেডল

    // jbullet library
    implementation 'cz.advel.jbullet:jbullet:20101010-1'

অ্যান্ডির বর্তমান পোজের অবস্থান সংরক্ষণ করার জন্য andyPose নামে একটি ভেরিয়েবল নির্ধারণ করুন।

AugmentedImageRenderer.java

  // Create a new pose for the Andy
  private Pose andyPose = Pose.IDENTITY;

নতুন andyPose ভেরিয়েবল ব্যবহার করে অ্যান্ডিকে রেন্ডার করার জন্য AugmentedImageRenderer.java পরিবর্তন করুন।

AugmentedImageRenderer.java

public void draw(
      float[] viewMatrix,
      float[] projectionMatrix,
      AugmentedImage augmentedImage,
      Anchor centerAnchor,
      float[] colorCorrectionRgba) {

    // Use these code to replace previous code for rendering the Andy object
    // 
    // Adjust the Andy's rendering position
    // The Andy's pose is at the maze's vertex's coordinate
    Pose andyPoseInImageSpace = Pose.makeTranslation(
        andyPose.tx() * mazeScaleFactor,
        andyPose.ty() * mazeScaleFactor,
        andyPose.tz() * mazeScaleFactor);

    anchorPose.compose(andyPoseInImageSpace).toMatrix(modelMatrix, 0);
    andyRenderer.updateModelMatrix(modelMatrix, 0.05f);
    andyRenderer.draw(viewMatrix, projectionMatrix, colorCorrectionRgba, tintColor);
  }

অ্যান্ডির পোজ আপডেট গ্রহণ করার জন্য ` updateAndyPose() নামে একটি নতুন ইউটিলিটি ফাংশন যোগ করুন।

AugmentedImageRenderer.java

  // Receive Andy pose updates
  public void updateAndyPose(Pose pose) {
    andyPose = pose;
  }

AugmentedImageActivity.java তে একটি PhysicsController অবজেক্ট তৈরি করুন, যা JBullet ফিজিক্স ইঞ্জিন ব্যবহার করে পদার্থবিদ্যা-সম্পর্কিত সমস্ত ফাংশন পরিচালনা করে।

AugmentedImageActivity.java

import com.google.ar.core.Pose;

  // Declare the PhysicsController object
  private PhysicsController physicsController;

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

AugmentedImageActivity.java

// Update the case clause for TRACKING to call PhysicsController
// whenever the app recognizes an image
  private void drawAugmentedImages(

    ...

        case TRACKING:
          // Switch to UI Thread to update View
          this.runOnUiThread(
              new Runnable() {
                @Override
                public void run() {
                  fitToScanView.setVisibility(View.GONE);
                }
              });

          // Create a new anchor for newly found images
          if (!augmentedImageMap.containsKey(augmentedImage.getIndex())) {
            Anchor centerPoseAnchor = augmentedImage.createAnchor(augmentedImage.getCenterPose());
            augmentedImageMap.put(
                augmentedImage.getIndex(), Pair.create(augmentedImage, centerPoseAnchor));

            physicsController = new PhysicsController(this);
          } else {
            Pose ballPose = physicsController.getBallPose();
            augmentedImageRenderer.updateAndyPose(ballPose);


            // Use real world gravity, (0, -10, 0), as gravity
            // Convert to Physics world coordinate(maze mesh has to be static)
            // Use the converted coordinate as a force to move the ball
            Pose worldGravityPose = Pose.makeTranslation(0, -10f, 0);
            Pose mazeGravityPose = augmentedImage.getCenterPose().inverse().compose(worldGravityPose);
            float mazeGravity[] = mazeGravityPose.getTranslation();
            physicsController.applyGravityToBall(mazeGravity);

            physicsController.updatePhysics();
          }
          break;

অ্যাপটি চালান। এখন ছবিটি কাত করলে অ্যান্ডিকে বাস্তবসম্মতভাবে নড়াচড়া করতে দেখা যাবে।

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

2f0df284705d3704.gif

এই তো! অ্যান্ডিকে গোলকধাঁধা পার করানোর চেষ্টা করে মজা নিন। ইঙ্গিত: লক্ষ্যবস্তুর ছবিটি উল্টো করে ধরলে বেরোনোর ​​পথ খুঁজে পাওয়া সহজ হয়।

৬. অভিনন্দন

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

  • একটি ARCore AugmentedImage জাভা স্যাম্পল তৈরি ও রান করা হয়েছে।
  • ছবিতে সঠিক স্কেলে একটি গোলকধাঁধার মডেল প্রদর্শনের জন্য নমুনাটি হালনাগাদ করা হয়েছে।
  • ছবিটির ভঙ্গি ব্যবহার করে মজার কিছু করা হয়েছে।

আপনি যদি সম্পূর্ণ কোডটি দেখতে চান, তবে এখান থেকে ডাউনলোড করতে পারেন।

এই কোডল্যাবটি করতে তোমার কি মজা লেগেছে?

হ্যাঁ না

এই কোডল্যাবটি করতে গিয়ে আপনি কি কোনো দরকারি কিছু শিখেছেন?

হ্যাঁ না

আপনি কি এই কোডল্যাবে অ্যাপটি তৈরি করা সম্পন্ন করেছেন?

হ্যাঁ না

আপনি কি আগামী ৬ মাসের মধ্যে একটি ARCore অ্যাপ তৈরি করার পরিকল্পনা করছেন?

হ্যাঁ হয়তো না