Render papan reklame tanpa distorsi?

8

Saya menggunakan pendekatan standar untuk billboarding dalam Unity yang OK, tapi tidak ideal:

transform.LookAt(camera)

Masalahnya adalah ini menyebabkan distorsi ke tepi viewport, terutama saat bidang sudut pandang bertambah besar. Ini tidak seperti papan iklan sempurna yang akan Anda lihat di misalnya. Doom ketika melihat musuh dari sudut manapun dan terlepas dari di mana mereka berada di ruang layar.

Jelas, ada cara untuk mencitrakan gambar langsung ke viewport, berpusat di sekitar satu titik, tapi saya tidak suka pada shader.

Adakah yang punya sampel dari pendekatan ini (GLSL jika memungkinkan), atau saran mengapa tidak biasanya dilakukan dengan cara ini (vs. metode transformasi quad yang disebutkan di atas)?

EDIT: Saya bingung, terima kasih Nathan untuk kepala. Tentu saja, menyebabkan paha depan untuk melihat kamera tidak menyebabkan mereka sejajar dengan bidang tampilan - yang saya butuhkan.

Insinyur
sumber

Jawaban:

4

Saya bingung dengan pertanyaan Anda karena dalam proyeksi perspektif standar, menggambar papan iklan sejajar dengan bidang tampilan tidak menimbulkan distorsi. Ini sama dengan memoles gambar ke viewport dengan penskalaan, di mana penskalaan tergantung pada kedalaman (jarak tegak lurus dari bidang tampilan).

"Distorsi" yang Anda lihat mungkin terjadi jika sistem sebenarnya mengorientasikan partikel untuk menghadap kamera daripada bidang tampilan; yang menyebabkan kemiringan di dekat tepi layar. Atau, Anda mungkin melihat bahwa skala sprite berubah saat Anda memutar kamera, karena ketika jarak diukur ke bidang tampilan daripada ke kamera, sprite menjadi "lebih dekat" dan karenanya lebih besar saat keluar layar.

Nathan Reed
sumber
1
@NickWiggill Saya tidak akrab dengan Unity secara khusus, tetapi jika Anda ingin agar paha depan menghadap pesawat daripada menghadap kamera, Anda pada dasarnya mengatur matriks rotasi quad sama dengan matriks rotasi kamera. Anda mungkin memerlukan rotasi 180 derajat tambahan di sana tergantung pada bagaimana paha depan dibangun.
Nathan Reed
1

Saya percaya Anda dapat mengatur matriks 3x3 teratas (dalam kolom-utama berbicara) ke identitas untuk melakukan ini. Saya tidak melihat alasan mengapa Anda tidak bisa melakukan ini di shader, tetapi Anda mungkin melakukan lebih banyak pekerjaan dengan cara itu. Anda akan kehilangan skala (dalam matriks xformation Anda) dengan cara ini.

Sunting: artikel ini bermanfaat bagi saya untuk membuat papan iklan dan meniru:

http://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml

Saya tidak tahu seberapa konvensional hal ini, tetapi saya menyebutnya "peniruan" ketika perspektif dipertahankan dan "papan iklan" ketika tidak.

notlesh
sumber
Saya menyadari sesuatu. Saya menggunakan Unity iOS / Android, dan beberapa perangkat yang lebih lama adalah OpenGL ES 1.1 - dengan demikian saluran pipa tetap. Jadi melakukannya tanpa shader adalah kuncinya di sini. Bagaimana saya bisa melakukan ini tanpa melakukannya di shader?
Insinyur
1
Itu mungkin cara yang lebih murah untuk melakukannya. Dalam kode saya, saya memiliki bendera di sprite saya yang menentukan apakah akan memasang billboard atau penipu sebelum melakukan panggilan draw. Ketika hal ini terjadi, saya cukup mengambil matriks saat ini, mengatur 3x3 atas ke identitas, dan kemudian memperbarui matriks saat ini.
notlesh
Ah ... menghargai detail ekstra tetapi karena saya tidak memiliki akses ke panggilan GL (Unity abstrak sejauh itu), saya pikir saya cukup kacau dengan pendekatan ini.
Insinyur
Anda tidak bisa mendapatkan atau mengatur matriks saat ini? Saya tidak pernah menggunakan unity ... Jika tidak, mungkin coba cari "unity billboarding" atau "unity impostering"
notlesh