Mendapatkan hasil operasi session
Selama operasi session, transform dari beberapa objek di scene akan dimodifikasi, dan gambar kamera juga akan diubah. Terkadang, modifikasi ini belum memenuhi kebutuhan aplikasi, dan mungkin diperlukan untuk mendapatkan hasil operasi session setiap frame untuk pemrosesan sekunder. Artikel ini memperkenalkan cara mendapatkan dan menggunakan data hasil tersebut.
Sebelum memulai
- Pahami konsep dasar, komponen, dan alur kerja session melalui Pengantar ARSession
- Pelajari cara membuat session
- Pelajari cara mengakses komponen fungsionalitas AR
Mendapatkan pembaruan InputFrame
Anda dapat menggunakan event InputFrameUpdate untuk mendapatkan pembaruan InputFrame. Event ini hanya dipicu ketika InputFrame berubah dalam output data session setiap frame.
Catatan
InputFrameUpdate hanya valid dalam session di mana rendering dilakukan oleh EasyAR. Secara umum, ini tidak valid saat menggunakan AR Foundation atau headset, dan Anda perlu menggunakan metode yang disediakan oleh library pihak ketiga tersebut untuk mendapatkan pembaruan data.
Dengan InputFrame, Anda bisa mendapatkan gambar kamera fisik, parameter kamera, timestamp, transform kamera fisik relatif terhadap sistem koordinat dunia, dan status pelacakan. Namun karena transform kamera telah diterapkan oleh session ke kamera virtual dan objek lainnya, biasanya tidak perlu mendapatkan transform kamera melalui InputFrame.
Mendapatkan gambar kamera fisik untuk frame saat ini
Anda dapat menggunakan metode InputFrame.image() untuk mendapatkan data gambar kamera fisik bertipe Image.
Misalnya, kode berikut dapat mendapatkan gambar kamera fisik saat InputFrame diperbarui:
Session.InputFrameUpdate += (inputFrame) => {
using (var image = inputFrame.image())
{
}
};
Hati-Hati
Saat menggunakan data bertipe Image dan data class lainnya yang diperoleh darinya, Anda harus memastikan bahwa Dispose() dipanggil dengan benar (pernyataan using dalam kode di atas menjamin hal ini). Jika tidak, dapat terjadi kebocoran memori atau bahkan masalah seperti penghentian pembaruan gambar.
Jika Anda perlu menyimpan InputFrame atau Image untuk digunakan di frame berikutnya, Anda perlu menambah nilai ARAssembly.ExtraBufferCapacity sesuai dengan jumlah data yang disimpan. Jika tidak, pengambilan data dapat gagal karena buffer tidak mencukupi.
Jika Anda perlu menyimpan InputFrame, Anda juga perlu memanggil metode Clone() untuk membuat salinan referensi, lalu memanggil Dispose() pada salinan tersebut saat sudah tidak diperlukan.
Karena frame rate kamera fisik biasanya lebih rendah dari frame rate rendering, event InputFrameUpdate tidak akan diterima setiap frame rendering. Namun demikian, gambar kamera fisik juga tidak diperbarui setiap frame rendering. Konten gambar untuk semua frame rendering hingga event InputFrameUpdate berikutnya akan sama dengan gambar InputFrame saat ini.
Catatan
Gambar dalam InputFrame pasti konsisten dengan gambar latar kamera virtual pada frame saat ini. Namun karena gambar latar mungkin diskalakan atau dipotong saat rendering, perbedaan ukuran atau rasio dengan yang ditampilkan di layar adalah normal.
Perlu juga diperhatikan bahwa data gambar yang dikembalikan oleh InputFrame.image() dapat dibaca oleh CPU, bukan texture GPU. Jika Anda perlu menggunakan data gambar di GPU, Anda perlu mengunggah data gambar ke texture GPU, atau mendapatkan texture GPU langsung melalui antarmuka CameraImageRenderer.RequestTargetTexture(Action<Camera, RenderTexture>).
[Opsional] Mencegat rendering gambar kamera fisik
Anda dapat menggunakan ARAssembly.CameraImageRenderer untuk mengontrol penggambaran gambar kamera fisik.
Kode berikut dapat menghentikan penggambaran gambar kamera fisik:
if (Session.Assembly != null && Session.Assembly.CameraImageRenderer.OnSome)
{
Session.Assembly.CameraImageRenderer.Value.enabled = false;
}
Perlu diperhatikan bahwa Anda perlu memeriksa keberadaan ARAssembly.CameraImageRenderer terlebih dahulu.
Catatan
Hanya dalam session di mana rendering dilakukan oleh EasyAR, metode di atas dapat menghentikan pembaruan gambar. Secara umum, ini tidak valid saat menggunakan AR Foundation atau headset, dan Anda perlu menggunakan metode yang disediakan oleh library pihak ketiga tersebut untuk mengimplementasikan fungsionalitas yang sesuai.
Setelah menghentikan penggambaran gambar kamera fisik, aplikasi dapat memperoleh data gambar kamera fisik melalui InputFrame dan menggunakan data tersebut untuk penggambaran kustom.
Mendapatkan pembaruan transform
Anda dapat mendapatkan data transform objek di scene setelah pembaruan session setiap frame melalui event PostSessionUpdate.
Catatan
Untuk beberapa fungsionalitas (seperti Mega), perhitungan AR tetap berjalan setiap frame rendering meskipun gambar tidak berubah dan tidak ada permintaan pembaruan layanan eksplisit. Oleh karena itu, jika Anda perlu mendapatkan semua perubahan transform, Anda harus mendapatkan data transform setiap frame, bukan hanya pada frame tertentu.
Mendapatkan transform kamera virtual
Anda bisa mendapatkan transform kamera di scene melalui ARAssembly.Camera.
Session.PostSessionUpdate += () =>
{
var position = Session.Assembly.Camera.transform.position;
var rotation = Session.Assembly.Camera.transform.rotation;
};
Mendapatkan transform target
Anda bisa mendapatkan transform target di scene melalui objek target spesifik yang digunakan. Misalnya, untuk pelacakan gambar, target ini adalah objek tempat komponen ImageTargetController berada.
Session.PostSessionUpdate += () =>
{
var position = target.transform.position;
var rotation = target.transform.rotation;
};
[Opsional] Mendapatkan pose
Pose adalah struktur data yang menggambarkan posisi dan orientasi objek, biasanya terdiri dari bagian position dan rotation. Dalam aplikasi AR, pose biasanya digunakan untuk menggambarkan posisi dan orientasi kamera fisik atau target pelacakan relatif terhadap sistem referensi tertentu.
Unity tidak menyediakan data pose mentah karena pose umumnya digunakan untuk menggerakkan objek di scene, yang merupakan tugas yang secara otomatis dilakukan oleh session. Untuk perhitungan konten dan rendering, transform sudah cukup.
Penting
Sebelum membaca metode di bawah ini, pertimbangkan kembali apakah data transform objek seperti kamera dan target pelacakan di scene sudah memenuhi kebutuhan Anda. Biasanya, data pose tambahan tidak diperlukan.
Jika Anda benar-benar memerlukan data pose karena alasan tertentu, Anda dapat menghitung nilai pose yang diperlukan melalui transform dalam event PostSessionUpdate. Secara umum, transform relatif target dan camera yang diperoleh dalam PostSessionUpdate adalah pose.
Kode berikut menunjukkan cara mendapatkan transform camera dan target, lalu menghitung pose relatif di antara keduanya:
Session.PostSessionUpdate += () =>
{
Pose cameraToWorld = new(Session.Assembly.Camera.transform.position, Session.Assembly.Camera.transform.rotation);
Pose targetToWorld = new(target.transform.position, target.transform.rotation);
Pose worldToTarget = new()
{
position = Quaternion.Inverse(targetToWorld.rotation) * (-targetToWorld.position),
rotation = Quaternion.Inverse(targetToWorld.rotation)
};
Pose cameraToTarget = cameraToWorld.GetTransformedBy(worldToTarget);
};
Hati-Hati
Jika Anda juga menggunakan AR Foundation, headset, atau library pihak ketiga lain yang sedang berjalan, library ini mungkin juga memodifikasi transform kamera di scene. Anda perlu memastikan bahwa logika pembaruan library ini selesai sebelum melakukan perhitungan pose terkait. Jika tidak, hasil perhitungan mungkin tidak akurat. Dalam skenario seperti ini, pose relatif target dan origin dalam PostSessionUpdate masih akurat.
[Opsional] Mencegat pembaruan transform
Saat fungsionalitas AR berjalan, transform objek seperti kamera dan target pelacakan di Unity biasanya diperbarui secara otomatis oleh session. Proses pembaruan ini menjamin kebenaran dan konsistensi rendering AR, sehingga tidak ada metode yang dapat digunakan untuk mencegat pembaruan ini.
Namun jika Anda perlu mengkustomisasi logika pembaruan transform objek, Anda dapat melakukannya dengan memantau event PostSessionUpdate. Di sini diperlukan metode yang cukup rumit:
- Meskipun biasanya konten rendering harus dipasang sebagai child node atau komponen tambahan di bawah objek yang dikendalikan session, jika Anda perlu mengkustomisasi pembaruan transform objek, Anda perlu memindahkan objek ini dari hierarki objek yang dikendalikan session. Artinya, objek ini seharusnya bukan child node dari objek yang dikendalikan session.
- Dalam event PostSessionUpdate, catat transform objek yang ingin Anda kustomisasi pembaruannya.
- Terakhir, dalam event PostSessionUpdate, gunakan logika kustom untuk memperbarui transform objek ini berdasarkan data yang disediakan oleh session.
Catatan
Penggunaan event PostSessionUpdate diperlukan karena hanya setelah waktu inilah session tidak akan lagi mengoperasikan objek di scene.
Perhatikan bahwa metode ini tidak dapat digunakan untuk memodifikasi camera, dan diperlukan logika yang lebih kompleks untuk menangani pembaruan kustom kamera.
Selain itu, metode ini hanya dapat digunakan untuk mengkustomisasi pembaruan transform objek, bukan untuk memodifikasi transform objek yang dikendalikan session. Jika transform objek yang dikendalikan session dimodifikasi secara eksternal, session masih akan menimpa modifikasi ini pada pembaruan frame berikutnya, yang dapat memengaruhi kebenaran beberapa perhitungan.
Hati-Hati
Penggunaan metode ini mengharuskan Anda menjamin kebenaran transform objek, jika tidak dapat menyebabkan kesalahan rendering AR.
Jika Anda juga menggunakan AR Foundation, headset, atau library pihak ketiga lainnya, library ini mungkin juga memodifikasi transform objek di scene. Pastikan logika pembaruan library ini tidak bertentangan dengan logika kustom Anda, jika tidak dapat menyebabkan hasil yang tidak terduga.
Topik terkait
- Mode pusat membatasi transform objek mana yang akan dimodifikasi oleh session
- Pengantar komponen dasar AR