Table of Contents

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

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:

  1. 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.
  2. Dalam event PostSessionUpdate, catat transform objek yang ingin Anda kustomisasi pembaruannya.
  3. 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