আপনার এআর ফাউন্ডেশন অ্যান্ড্রয়েড অ্যাপে গভীরতা ব্যবহার করুন

Depth API একটি দৃশ্যের বাস্তব বস্তুর আকার এবং আকৃতি বুঝতে একটি ডিভাইসের ক্যামেরাকে সাহায্য করে। এটি গভীরতার চিত্র বা গভীরতার মানচিত্র তৈরি করতে ক্যামেরা ব্যবহার করে, যার ফলে আপনার অ্যাপগুলিতে এআর বাস্তবতার একটি স্তর যুক্ত করা হয়। ভার্চুয়াল অবজেক্টগুলিকে বাস্তব জগতের বস্তুর সামনে বা পিছনে সঠিকভাবে দেখানোর জন্য আপনি গভীরতার চিত্র দ্বারা প্রদত্ত তথ্য ব্যবহার করতে পারেন, নিমজ্জনশীল এবং বাস্তবসম্মত ব্যবহারকারীর অভিজ্ঞতা সক্ষম করে৷

গভীরতার তথ্য গতি থেকে গণনা করা হয় এবং একটি হার্ডওয়্যার গভীরতা সেন্সর থেকে তথ্যের সাথে মিলিত হতে পারে, যেমন একটি টাইম-অফ-ফ্লাইট (ToF) সেন্সর, যদি উপলব্ধ থাকে। Depth API সমর্থন করার জন্য একটি ডিভাইসের একটি ToF সেন্সর প্রয়োজন হয় না

পূর্বশর্ত

এগিয়ে যাওয়ার আগে নিশ্চিত করুন যে আপনি মৌলিক AR ধারণা এবং কীভাবে একটি ARCore সেশন কনফিগার করবেন তা বুঝতে পেরেছেন।

আপনার অ্যাপটিকে Depth Required বা Depth Optional হিসাবে কনফিগার করুন (কেবলমাত্র অ্যান্ড্রয়েড)

যদি আপনার অ্যাপের ডেপথ এপিআই সমর্থনের প্রয়োজন হয়, কারণ হয় AR অভিজ্ঞতার একটি মূল অংশ গভীরতার উপর নির্ভর করে বা গভীরতা ব্যবহার করে এমন অ্যাপের অংশগুলির জন্য কোনও আকর্ষণীয় ফলব্যাক না থাকায়, আপনি Google Play-তে আপনার অ্যাপের বিতরণ সীমাবদ্ধ করতে বেছে নিতে পারেন Depth API সমর্থন করে এমন ডিভাইসগুলিতে সঞ্চয় করুন।

আপনার অ্যাপের Depth Required

Edit > Project Settings > XR Plug-in Management > ARCore নেভিগেট করুন।

Depth ডিফল্টরূপে Required হিসাবে সেট করা আছে।

আপনার অ্যাপ্লিকেশন Depth Optional করুন

  1. Edit > Project Settings > XR Plug-in Management > ARCore নেভিগেট করুন।

  2. Depth ড্রপ-ডাউন মেনু থেকে, একটি অ্যাপকে Depth ঐচ্ছিক তে সেট করতে Optional নির্বাচন করুন।

গভীরতা সক্ষম করুন

সম্পদ সংরক্ষণ করতে, ARCore ডিফল্টরূপে Depth API সক্ষম করে না। সমর্থিত ডিভাইসগুলিতে গভীরতার সুবিধা নিতে, আপনাকে অবশ্যই Camera এবং ARCameraBackground উপাদান সহ AR ক্যামেরা গেম অবজেক্টে AROcclusionManager উপাদানটি ম্যানুয়ালি যোগ করতে হবে। আরও তথ্যের জন্য ইউনিটি ডকুমেন্টেশনে স্বয়ংক্রিয় অক্লুশন দেখুন।

একটি নতুন ARCore সেশনে , ব্যবহারকারীর ডিভাইস গভীরতা এবং গভীরতা API সমর্থন করে কিনা তা পরীক্ষা করুন, নিম্নরূপ:

// Reference to AROcclusionManager that should be added to the AR Camera
// game object that contains the Camera and ARCameraBackground components.
var occlusionManager = …

// Check whether the user's device supports the Depth API.
if (occlusionManager.descriptor?.supportsEnvironmentDepthImage)
{
    // If depth mode is available on the user's device, perform
    // the steps you want here.
}

গভীরতা ছবি অর্জন

AROcclusionManager থেকে সর্বশেষ পরিবেশের গভীরতার চিত্র পান।

// Reference to AROcclusionManager that should be added to the AR Camera
// game object that contains the Camera and ARCameraBackground components.
var occlusionManager = …

if (occlusionManager.TryAcquireEnvironmentDepthCpuImage(out XRCpuImage image))
{
    using (image)
    {
        // Use the texture.
    }
}

আপনি বৃহত্তর নমনীয়তার জন্য কাঁচা CPU ইমেজকে একটি RawImage এ রূপান্তর করতে পারেন। এটি কীভাবে করা যায় তার একটি উদাহরণ ইউনিটির এআরফাউন্ডেশন নমুনাগুলিতে পাওয়া যেতে পারে।

গভীরতার মান বুঝুন

পর্যবেক্ষণ করা বাস্তব-বিশ্ব জ্যামিতিতে বিন্দু A দেওয়া হয়েছে এবং একটি 2D বিন্দু a গভীরতার চিত্রে একই বিন্দুকে প্রতিনিধিত্ব করে, a তে Depth API দ্বারা প্রদত্ত মানটি প্রধান অক্ষের উপর প্রক্ষিপ্ত CA এর দৈর্ঘ্যের সমান। এটিকে ক্যামেরার উৎপত্তি C এর সাথে A এর z-অর্ডিনেট হিসাবেও উল্লেখ করা যেতে পারে। Depth API এর সাথে কাজ করার সময়, এটা বোঝা গুরুত্বপূর্ণ যে গভীরতার মানগুলি রশ্মির CA এর দৈর্ঘ্য নয়, বরং এটির অভিক্ষেপ

ভার্চুয়াল অবজেক্ট বন্ধ করুন এবং গভীরতার ডেটা কল্পনা করুন

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

আপনি টু-পাস রেন্ডারিং বা প্রতি-অবজেক্ট, ফরওয়ার্ড-পাস রেন্ডারিং ব্যবহার করে অক্লুশন রেন্ডার করতে পারেন। প্রতিটি পদ্ধতির কার্যকারিতা দৃশ্যের জটিলতা এবং অন্যান্য অ্যাপ-নির্দিষ্ট বিবেচনার উপর নির্ভর করে।

প্রতি-অবজেক্ট, ফরোয়ার্ড-পাস রেন্ডারিং

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

দুই-পাস রেন্ডারিং

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

গভীরতার ছবি থেকে দূরত্ব বের করুন

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

Texture2D _depthTexture;
short[] _depthArray;

void UpdateEnvironmentDepthImage()
{
  if (_occlusionManager &&
        _occlusionManager.TryAcquireEnvironmentDepthCpuImage(out XRCpuImage image))
    {
        using (image)
        {
            UpdateRawImage(ref _depthTexture, image, TextureFormat.R16);
            _depthWidth = image.width;
            _depthHeight = image.height;
        }
    }
  var byteBuffer = _depthTexture.GetRawTextureData();
  Buffer.BlockCopy(byteBuffer, 0, _depthArray, 0, byteBuffer.Length);
}

// Obtain the depth value in meters at a normalized screen point.
public static float GetDepthFromUV(Vector2 uv, short[] depthArray)
{
    int depthX = (int)(uv.x * (DepthWidth - 1));
    int depthY = (int)(uv.y * (DepthHeight - 1));

    return GetDepthFromXY(depthX, depthY, depthArray);
}

// Obtain the depth value in meters at the specified x, y location.
public static float GetDepthFromXY(int x, int y, short[] depthArray)
{
    if (!Initialized)
    {
        return InvalidDepthValue;
    }

    if (x >= DepthWidth || x < 0 || y >= DepthHeight || y < 0)
    {
        return InvalidDepthValue;
    }

    var depthIndex = (y * DepthWidth) + x;
    var depthInShort = depthArray[depthIndex];
    var depthInMeters = depthInShort * MillimeterToMeter;
    return depthInMeters;
}

এরপর কি

  • Raw Depth API দিয়ে আরও সঠিক সেন্সিং সক্ষম করুন৷
  • ARCore Depth Lab দেখুন, যা গভীরতার ডেটা অ্যাক্সেস করার বিভিন্ন উপায় দেখায়।