Derinlik API'si, cihazın kamerasının bir sahnedeki gerçek nesnelerin boyutunu ve şeklini anlamasına yardımcı olur. Derinlik görüntüleri veya derinlik haritaları oluşturmak için kamerayı kullanır ve böylece uygulamalarınıza AR gerçekçiliği katmanı ekler. Sanal nesnelerin gerçek dünyadaki nesnelerin önünde veya arkasında doğru şekilde görünmesini sağlamak için derinlik resminin sağladığı bilgileri kullanarak sürükleyici ve gerçekçi kullanıcı deneyimleri sunabilirsiniz.
Derinlik bilgileri hareketten 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, Derinlik API'sini desteklemek için ToF sensörüne ihtiyacı yoktur.
Ön koşullar
Devam etmeden önce temel AR kavramlarını ve ARCore oturumunu nasıl yapılandıracağınızı anladığınızdan emin olun.
Uygulamanızı Depth Required veya Depth Optional olarak yapılandırın (yalnızca Android)
Uygulamanız, AR deneyiminin temel bir parçası derinliğe dayandığı veya uygulamanın derinlik kullanan bölümleri için sorunsuz bir yedek olmadığı için Depth API desteği gerektiriyorsa uygulamanızın Google Play Store'daki dağıtımını Depth API'yi destekleyen cihazlarla sınırlayabilirsiniz.
Uygulamanızı Depth Required
Edit > Project Settings > XR Plug-in Management > ARCore adresine gidin.
Depth varsayılan olarak Required değerine ayarlanır.
Uygulamanızı Depth Optional
Edit > Project Settings > XR Plug-in Management > ARCore adresine gidin.
Bir uygulamayı Derinlik için isteğe bağlı olarak ayarlamak üzere Depth açılır menüsünden Optional'i seçin.
Derinliği etkinleştirme
ARCore, kaynakları korumak için Depth API'yi varsayılan olarak etkinleştirmez. Desteklenen cihazlarda derinlikten yararlanmak için AROcclusionManager
bileşenini Camera
ve ARCameraBackground
bileşeniyle birlikte AR Kamera oyun nesnesine manuel olarak eklemeniz gerekir. Daha fazla bilgi için Unity belgelerinin Otomatik gizleme bölümüne bakın.
Yeni bir ARCore oturumunda, kullanıcının cihazının derinliği ve Depth API'yi destekleyip desteklemediğini aşağıdaki gibi kontrol edin:
// 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.
}
Derinlik görüntüleri elde etme
AROcclusionManager
öğesinden en son ortam derinlik resmini alın.
// 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.
}
}
Daha fazla esneklik için ham CPU görüntüsünü RawImage
biçimine dönüştürebilirsiniz. Bunun nasıl yapılacağına dair bir örneği Unity'nin ARFoundation örneklerinde bulabilirsiniz.
Derinlik değerlerini anlama
Gözlemlenen gerçek dünya geometrisindeki A
noktası ve derinlik resmindeki aynı noktayı temsil eden 2D bir nokta a
verildiğinde, Depth API'nin a
noktasında verdiği değer, ana eksene yansıtılan CA
uzunluğuna eşittir.
Bu, kamera orijini C
'ye göre A
'nin z koordinatı olarak da adlandırılabilir. Derinlik API'siyle çalışırken derinlik değerlerinin CA
ışınının uzunluğu değil, projeksiyonu olduğunu anlamanız önemlidir.
Sanal nesneleri gizleme ve derinlik verilerini görselleştirme
Derinlik verilerine ve sanal görüntüleri gizlemek için nasıl kullanılabileceğine genel bir bakış için Unity'nin blog yayınına göz atın. Ayrıca Unity'nin ARFoundation örnekleri, sanal görüntülerin gizlenmesini ve derinlik verilerinin görselleştirilmesini gösterir.
İki geçişli oluşturma veya nesne başına ileri geçişli oluşturma kullanarak gölgelendirmeyi 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 ileri geçiş oluşturma
Nesne başına ileri geçiş oluşturma, nesnenin her bir pikseli için malzeme gölgelendiricisinde örtmeyi belirler. Görünmeyen pikseller genellikle alfa harmanlama yoluyla kırpılır ve böylece kullanıcının cihazında örtme işlemi simüle edilir.
İki geçişli oluşturma
İki geçişli oluşturma işleminde, ilk geçiş tüm sanal içeriği bir ara arabelleğe oluşturur. İkinci geçiş, sanal sahneyi arka planla harmanlamak için gerçek dünya derinliği ile sanal sahne derinliği arasındaki farkı kullanır. Bu yaklaşım, nesneye özel ek gölgelendirici çalışması gerektirmez ve genellikle ileri geçiş yöntemine kıyasla daha tekdüze görünen sonuçlar verir.
Derinlik görüntüsünden mesafeyi ayıklama
Derinlik API'yi sanal nesneleri gizlemek veya derinlik verilerini görselleştirmek dışındaki amaçlar için kullanmak istiyorsanız derinlik görüntüsünden bilgi ayıklamanız gerekir.
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 elde edin.
- Derinlik verilerine erişmenin farklı yollarını gösteren ARCore Derinlik Laboratuvarı'na göz atın.