استخدام ميزة "العمق" في تطبيق AR Foundation المتوافق مع Android

تساعد واجهة Depth API كاميرا الجهاز على فهم حجم وشكل العناصر الحقيقية في المشهد. فهو يستخدم الكاميرا لإنشاء صور بعمق أو خرائط العمق، مما يضيف طبقة من الواقع المعزّز إلى تطبيقاتك. يمكنك استخدام المعلومات التي تقدّمها صورة العمق لعرض العناصر الافتراضية بدقة أمام أجسام في العالم الحقيقي أو خلفها، ما يوفّر تجربة مستخدم غامرة وواقعية.

يتم احتساب معلومات العمق من الحركة، وقد يتم دمجها مع معلومات من جهاز استشعار عمق الجهاز، مثل أداة استشعار مدة الرحلة (ToF)، في حال توفّرها. لا يحتاج الجهاز إلى أداة استشعار ToF ليتوافق مع Depth API.

المتطلبات الأساسية

احرص على فهم مفاهيم الواقع المعزّز الأساسية. وكيفية ضبط جلسة ARCore قبل المتابعة.

ضبط تطبيقك على Depth Required أو Depth Optional (Android فقط)

إذا كان تطبيقك يتطلب دعم Depth API، إمّا لأنّ جزءًا أساسيًا من تجربة الواقع المعزّز يعتمد على العمق، أو لأنّ لا يوجد احتياطي سلس لأجزاء التطبيق التي تستخدم العمق، يمكنك اختيار تقييد توزيع تطبيقك في متجر 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 المنسدلة، حدد Optional لضبط تطبيق على "العمق" اختياري.

تفعيل العمق

لتوفير الموارد، لا يفعِّل ARCore واجهة برمجة التطبيقات Depth API تلقائيًا. لاتخاذ من العمق على الأجهزة المعتمدة، يجب عليك إضافة AROcclusionManager إلى كائن اللعبة كاميرا الواقع المعزّز باستخدام Camera المكوِّن ARCameraBackground. عرض التظليل التلقائي في مستندات Unity لمزيد من المعلومات

في جلسة ARCore جديدة، تحقق مما إذا كان يتوافق جهاز المستخدم مع واجهة برمجة التطبيقات Depth 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.
    }
}

يمكنك تحويل الصورة الأولية لوحدة المعالجة المركزية إلى RawImage. لمزيد من المرونة إنّ يمكن العثور على مثال حول كيفية إجراء ذلك في عيّنات ARFoundation من Unity.

فهم قيم العمق

تحديد النقطة A على الهندسة الفعلية المرصودة ونقطة ثنائية الأبعاد a تمثل النقطة نفسها في صورة العمق، وهي القيمة المحددة من خلال تساوي واجهة برمجة التطبيقات في a طول CA المتوقع على المحور الرئيسي. ويمكن أيضًا الإشارة إلى ذلك بالإحداثي z الذي يبلغ A بالنسبة إلى الكاميرا. الأصل C. عند العمل باستخدام واجهة برمجة التطبيقات Depth API، من المهم معرفة أن قيم العمق ليست طول الشعاع CA نفسه، بل هي قيمة الإسقاط منه.

حجب الكائنات الافتراضية وعرض بيانات العمق

يمكنك الاطّلاع على مشاركة مدونة Unity. للحصول على نظرة عامة عالية المستوى على البيانات المتعمقة وكيف يمكن استخدامها لإخفاء الصور الافتراضية. بالإضافة إلى ذلك، تقدم Unity عيّنات من ARFoundation إظهار إطباق الصور الافتراضية وتصور بيانات العمق.

يمكنك عرض التظليل باستخدام العرض بمرتين أو العرض لكل كائن أو تمرير الأمام. وتعتمد فعالية كل أسلوب على مدى تعقيد المشهد واعتبارات أخرى خاصة بالتطبيق.

عرض التمرير الأمامي لكل كائن

يحدد عرض التمرير الأمامي لكل كائن، ما إذا تم حجب كل وحدة بكسل من العنصر في أداة تظليل المواد. إذا لم تكن وحدات البكسل مرئية، يتم اقتصاصها، عادةً من خلال مزج ألفا، وبالتالي محاكاة التظليل على جهاز المستخدم.

العرض بمرّتين

مع العرض بتمريرتين، تعرض البطاقة الأولى كل المحتوى الافتراضي في مخزن وسيط مؤقتًا. تدمج الشريحة الثانية المشهد الافتراضي في الخلفية بناءً على الفرق بين العمق الواقعي والعمق الافتراضي للمشهد. لا يتطلب هذا الأسلوب عمل أداة تظليل إضافية خاصة بالكائن، وتنتج بشكل عام نتائج ذات مظهر موحد أكثر من طريقة التمرير الأمامي.

استخراج المسافة من صورة بعمق

لاستخدام Depth API لأغراض أخرى غير حجب الأجسام الافتراضية أو عرض بيانات العمق، يمكنك استخراج المعلومات من صورة العمق.

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 الذي يعرض طرقًا مختلفة للوصول إلى البيانات المتعمّقة.