Depth API membantu kamera perangkat memahami ukuran dan bentuk objek nyata dalam adegan. Mode ini menggunakan kamera untuk membuat gambar kedalaman, atau peta kedalaman, sehingga menambahkan lapisan realisme AR ke aplikasi Anda. Anda dapat menggunakan informasi yang diberikan oleh gambar kedalaman untuk membuat objek virtual muncul secara akurat di depan atau di belakang objek dunia nyata, sehingga memungkinkan pengalaman pengguna yang imersif dan realistis.
Informasi kedalaman dihitung dari gerakan dan dapat digabungkan dengan informasi dari sensor kedalaman hardware, seperti sensor waktu terbang (ToF), jika tersedia. Perangkat tidak memerlukan sensor ToF untuk mendukung Depth API.
Prasyarat
Pastikan Anda memahami konsep dasar AR dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.
Mengonfigurasi aplikasi menjadi Depth Required atau Depth Optional (khusus Android)
Jika aplikasi Anda memerlukan dukungan Depth API, baik karena bagian inti pengalaman AR mengandalkan kedalaman (depth), atau tidak ada penggantian halus untuk bagian aplikasi yang menggunakan kedalaman, Anda dapat memilih untuk membatasi distribusi aplikasi Anda di Google Play Store untuk perangkat yang mendukung Depth API.
Jadikan aplikasi Anda Depth Required
Buka Edit > Project Settings > XR Plug-in Management > ARCore
Depth ditetapkan ke Required secara default.
Jadikan aplikasi Anda Depth Optional
Buka Edit > Project Settings > XR Plug-in Management > ARCore
Dari menu drop-down Depth, pilih Optional untuk menyetel aplikasi ke Depth opsional.
Aktifkan Kedalaman
Untuk menghemat resource, ARCore tidak mengaktifkan Depth API secara default. Untuk mengambil
memanfaatkan kedalaman di perangkat yang didukung, Anda harus menambahkan
AROcclusionManager
ke objek game AR Camera dengan Camera
dan
Komponen ARCameraBackground
. Lihat
Oklusi otomatis
dalam dokumentasi Unity untuk informasi selengkapnya.
Dalam sesi ARCore baru, periksa apakah perangkat pengguna mendukung kedalaman dan Depth API, sebagai berikut:
// 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.
}
Mendapatkan gambar kedalaman
Dapatkan gambar kedalaman lingkungan terbaru dari
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.
}
}
Anda dapat mengonversi image CPU mentah menjadi RawImage
untuk fleksibilitas yang lebih besar. Channel
Contoh cara melakukannya dapat ditemukan di contoh ARFoundation Unity.
Memahami nilai kedalaman
Titik yang diberikan A
pada geometri dunia nyata yang diamati dan titik 2D a
merepresentasikan titik yang sama pada gambar depth, nilai yang diberikan oleh Depth
API pada a
sama dengan panjang CA
yang diproyeksikan pada sumbu utama.
Ini juga dapat disebut sebagai koordinat z dari A
relatif terhadap kamera
C
asal. Saat menggunakan Depth API, penting untuk memahami bahwa
nilai kedalaman bukanlah panjang sinar CA
itu sendiri, melainkan proyeksi
data tersebut.
Menghalangi objek virtual dan memvisualisasikan data kedalaman
Lihat postingan blog Unity untuk gambaran tingkat tinggi tentang data kedalaman dan bagaimana hal itu dapat digunakan untuk menutupi gambar virtual. Selain itu, antarmuka pengguna Contoh ARFoundation menunjukkan gambar virtual yang menutupi dan memvisualisasikan data kedalaman.
Anda bisa merender oklusi menggunakan rendering dua-pass atau rendering maju-pass per-objek. Efisiensi setiap pendekatan bergantung pada kompleksitas adegan dan pertimbangan khusus aplikasi lainnya.
Per-objek, {i>forward-pass rendering<i}
Per-objek, rendering pass-pass menentukan oklusi setiap piksel objek dalam shader materialnya. Jika piksel tidak terlihat, piksel tersebut akan dipotong, biasanya melalui pencampuran alfa, sehingga menyimulasikan oklusi di perangkat pengguna.
Rendering dua tahap
Dengan rendering dua tahap, penerusan pertama merender semua konten virtual ke dalam buffer perantara. Pass kedua menggabungkan adegan virtual ke latar belakang berdasarkan perbedaan antara kedalaman dunia nyata dengan kedalaman adegan virtual. Pendekatan ini tidak memerlukan pekerjaan shader spesifik per objek tambahan dan umumnya memberikan hasil yang terlihat lebih seragam dibandingkan metode {i>forward-pass<i}.
Mengekstrak jarak dari gambar kedalaman
Agar dapat menggunakan Depth API untuk tujuan selain menutupi objek virtual atau memvisualisasikan data kedalaman, ekstrak informasi dari gambar kedalaman.
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;
}
Langkah selanjutnya
- Aktifkan deteksi yang lebih akurat dengan Raw Depth API.
- Lihat ARCore Depth Lab, yang menunjukkan berbagai cara untuk mengakses data kedalaman.