AR Foundation Android uygulamanızda Derinliği kullanma

Depth API, cihaz kamerasının sahnedeki gerçek nesnelerin boyutunu ve şeklini anlamasına yardımcı olur. Kamerayı kullanarak derinlik görüntüleri veya derinlik haritaları oluşturur, böylece uygulamalarınıza bir artırılmış gerçeklik (AR) katmanı ekler. Derinlik resminin sağladığı bilgileri kullanarak sanal nesnelerin gerçek dünyadaki nesnelerin önünde veya arkasında doğru şekilde görünmesini sağlayabilir, böylece sürükleyici ve gerçekçi bir kullanıcı deneyimi sağlayabilirsiniz.

Derinlik bilgileri harekete göre hesaplanır ve varsa uçuş süresi (ToF) sensörü gibi bir donanım derinlik sensöründen alınan bilgilerle birleştirilebilir. Cihazların Depth API'yi desteklemek için ToF sensörü olması gerekmez.

Ön koşullar

Temel artırılmış gerçeklik kavramlarını anladığınızdan emin olun ve devam etmeden önce ARCore oturumunun nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.

Uygulamanızı Depth Required veya Depth Optional olacak şekilde yapılandırın (yalnızca Android)

Uygulamanız için Depth API desteği gerekiyorsa Bunun nedeni AR deneyiminin temelinin derinliğe dayalı olması ya da uygulamanın derinlik kullanan kısımları için etkili bir yedek bulunmuyorsa uygulamanızın Google Play Store'da dağıtımını Depth API'yi destekleyen cihazlar.

Uygulamanızı Depth Required yapın

Edit > Project Settings > XR Plug-in Management > ARCore adresine gidiş rotasını izle.

Depth, varsayılan olarak Required değerine ayarlıdır.

Uygulamanızı Depth Optional yapın

  1. Edit > Project Settings > XR Plug-in Management > ARCore adresine gidiş rotasını izle.

  2. Depth açılır menüsünden Optional öğesini seçin simgesini tıklayın.

Derinliği etkinleştir

ARCore, kaynakları kaydetmek için Depth API'yi varsayılan olarak etkinleştirmez. Şu atılacak: derinliğinden yararlanmak için desteklenen cihazlarda AROcclusionManager bileşenini AR Kamera oyun nesnesine ekleyin. Bu işlem, Camera ve ARCameraBackground bileşeni. Görüntüleyin Otomatik kapama Unity belgelerine göz atın.

Yeni bir ARCore oturumunda, Kullanıcının cihazı, aşağıdaki şekilde derinliği ve Depth API'yi destekler:

// 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.
}

Derinlikli görüntüler edinme

Şu konumdan en yeni ortam derinliği görüntüsünü alın: 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.
    }
}

Ham CPU görüntüsünü bir RawImage simgesine dönüştürebilirsiniz. kullanabilirsiniz. bunun nasıl yapılacağına dair örneği Unity'nin ARFoundation örneklerinde bulabilirsiniz.

Derinlik değerlerini anlama

Gözlemlenen gerçek dünya geometrisinde A noktası ve 2D a noktası verilir. derinlik resminde aynı noktayı temsil eden, Derinlik a konumundaki API, ana eksene tahmin edilen CA uzunluğuna eşit. Bu, kameraya göre A işlevinin z koordinatı olarak da adlandırılabilir kaynak: C. Depth API ile çalışırken, makine öğreniminin derinlik değerleri ışınının CA uzunluğu değil, projeksiyon öğreneceğiz.

Sanal nesneleri bir araya getirme ve derinlik verilerini görselleştirme

Unity'nin blog yayınına göz atın üst düzey bir genel bakış sunan ve böylece derinlikli verileri gizlemek için sanal görüntülerdir. Ayrıca Unity'nin AR Foundation örnekleri sanal görüntüleri örtmeyi ve derinlik verilerini görselleştirmeyi gösteriyor.

Kapatmayı iki geçişli oluşturmayı veya nesne başına, ileri geçişli oluşturmayı kullanarak oluşturabilirsiniz. Her yaklaşımın verimliliği, sahnenin karmaşıklığına ve uygulamaya özgü diğer hususlara bağlıdır.

Nesne başına, ileriye dönük oluşturma

Nesne başına ileri geçiş oluşturma, malzeme gölgelendiricisinde nesnenin her pikselinin kapsanmasını belirler. Pikseller görünmüyorsa genellikle alfa karıştırma ile kırpılır ve böylece kullanıcının cihazında tıkanma simülasyonu yapılır.

İki geçişli oluşturma

İki geçişli oluşturmada, ilk geçiş, sanal içeriğin tamamını ara arabelleğe alır. İkinci geçişte, gerçek dünya derinliği ile sanal sahne derinliği arasındaki fark temel alınarak sanal sahneyi arka planla birleştiriyor. Bu yaklaşım, nesneye özel ek gölgelendirici çalışması gerektirmez ve genellikle ileri geçiş yönteminden daha tek tip görünümlü sonuçlar üretir.

Derinlik görüntüsünden mesafeyi ayıkla

Depth API'yi sanal nesneleri kapatma veya derinlik verilerini görselleştirme dışında başka amaçlarla kullanmak için derinlik görüntüsündeki bilgileri ayıklayın.

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;
}

Sırada ne var?

  • Raw Depth API ile daha doğru algılama sağlayın.
  • Derinlik verilerine erişmenin farklı yollarını gösteren ARCore Depth Lab'e göz atın.