Cara memadukan dua kamera saat bepergian melalui portal di Unity3D

18

Sebelum saya sampai ke pertanyaan saya, saya tahu solusi yang paling jelas adalah dengan menggunakan tampilan port rect dinormalisasi, namun saya membutuhkan bentuk yang lebih kompleks daripada persegi panjang, dan saya sudah mencari menggunakan port tampilan rect dan sepertinya tidak menjadi solusi saya.

EDIT: Beberapa orang bingung dengan pertanyaan saya, biarkan saya masuk ke sedikit lebih detail. masukkan deskripsi gambar di sini Apa yang terjadi adalah ketika pemain bergerak ke satu portal, saya membuat kontroler FPS klon dan memindahkannya dari yang lain. Ini memberi saya dua kamera, dan tampilan yang Anda lihat di kanan atas. Itu hanya menunjukkan satu kamera, dan memotong melalui portal. Yang saya inginkan adalah sesuatu yang mirip dengan inidi mana kamera berbaur untuk menciptakan ilusi transisi yang mulus. Yang ingin saya lakukan adalah menghapus semuanya dari gambar pemeriksa hijau ke kiri pada gambar di bawah, dan menggantinya dengan kamera lain. Dengan begitu Anda mendapatkan bagian dari tampilan kamera A yang memuncak dari portal, dicampur dengan bagian dari tampilan kamera B yang memuncak dari portal lain, untuk mendapatkan satu gambar lengkap. Dan saat Anda bergerak melalui portal, perubahannya tepat.

Saya telah merancang sistem portal, saya memiliki segalanya, termasuk membuat pemain bergerak dengan lancar melalui portal. Masalah utama saya sekarang adalah mendapatkan bahwa efek perpaduan kamera tidak. Saya perlu dua kamera untuk berbaur bersama dengan mulus, seolah-olah Anda menjulurkan kepala melalui portal. Dan itu tidak bisa hanya persegi panjang, itu harus cocok namun pemain melihat melalui portal.

Petunjuk terbaik saya saat ini adalah memproyeksikan shader topeng kedalaman di belakang masing-masing portal, kemudian membuat kamera dari portal yang Anda tempuh hanya menjadi kedalaman saja. Lalu entah bagaimana mencampur dua kamera. Masalah utama saya adalah mencari tahu persis bagaimana saya akan melakukan ini, bagaimana membuat kamera kedua hanya membuat apa yang di luar portal, dan memiliki sisanya default untuk kamera 1 untuk mendapatkan satu proyeksi layar penuh.

Jika Anda bisa memberi saya ide, atau menjelaskan bagaimana saya bisa melakukan ini dengan shader topeng mendalam yang akan sangat membantu. Saya akan terus bekerja pada ini dan memperbarui saat saya membuat terobosan.

Timothy Williams
sumber
5
Bisakah Anda menguraikan apa yang tidak dilakukan oleh "efek perpaduan kamera" Valve? Saya mengerti bahwa di portal rendering satu kamera sudah cukup. Pada gim orang pertama, gim ini melekat pada pemain dan secara otomatis diubah ke lokasi baru saat melewati portal bersama dengan pemain. Untuk merender efek portal, salinan adegan yang ditransformasi akan ditampilkan. Ini dapat dicapai dengan kamera kedua juga, tetapi seharusnya tidak perlu ada perpaduan antara kamera-kamera ini.
msell
1
Saya sudah memiliki efek visual turun dengan sempurna. Apa yang saya coba lakukan adalah mencari tahu bagaimana mendapatkan efek berjalan melalui portal. Saya sudah memiliki semua grafik karakter dan bergerak dengan lancar, saya hanya perlu terlihat mulus dari sudut pandang orang pertama.
Timothy Williams
1
Saya yakin banyak orang ingin membantu Anda dengan masalah jika mereka mengerti apa itu. Anda benar-benar perlu menjelaskan masalah ini dengan lebih baik, mungkin menambahkan gambar atau bahkan video memvisualisasikan apa yang salah.
msell
2
Bisakah Anda menambahkan tautan ke video contoh efek?
Mike Baxter
2
Bagaimana jika Anda hanya menggunakan satu pengontrol kamera / FPS? Ketika kamera bergerak melalui portal, Anda dapat mengubahnya ke lokasi dan orientasi baru. Jika rendering portal sudah benar, transisi harus mulus dan tidak diperlukan campuran.
msell

Jawaban:

6

Memahami Masalahnya

Dari apa yang saya lihat masalah yang Anda gambarkan adalah hasil dari pesawat dekat kamera yang memotong bidang yang ditentukan oleh portal. Sementara persimpangan ini terjadi, Anda dapat melihat di balik dinding portal aktif.

Ini mirip dengan masalah yang dialami dalam permainan lain ketika pemain hanya bertransisi dari atas air ke bawah air. Jika kamera tepat di atas air, tidak ada efek pemrosesan pasca diterapkan untuk mengaburkan tampilan pemain (membuatnya gelap dan buram dan biru). Jadi jika bagian bawah pesawat dekat tepat di bawah air pemain dapat melihat dengan jelas di bawah air.

Jika saya benar, Anda dapat mengonfirmasinya dengan mengubah posisi bidang ini saat menentukan matriks proyeksi. Saat jarak dari kamera ke pesawat dekat bertambah, begitu juga masalahnya.

Solusi Mudah

Membuat pesawat dekat sangat dekat dengan kamera harus hampir menghilangkan masalah ini. Solusi ini tidak lengkap, tetapi akan menghasilkan hasil yang cukup baik di sebagian besar kasus dan efisien.

Solusi Lengkap

Jika hanya menempatkan pesawat dekat ke kamera tidak memuaskan, maka Anda dapat membuat "topeng" untuk memadukan gambar yang dihasilkan dengan menampilkan adegan dari perspektif pemain dan portal.

Dengan asumsi Anda hanya mengizinkan portal untuk diterapkan pada permukaan datar, Anda dapat menghitung garis persimpangan antara bidang dekat kamera dan bidang yang ditentukan oleh portal (atau dinding tempat portal itu berada). Baris ini akan membagi layar menjadi dua bagian. Menentukan sisi mana garis dari piksel layar yang aktif akan memberi tahu Anda gambar render mana yang akan digunakan, gambar portal atau gambar kamera pemutar.

Perlu diingat bahwa jika masalah ini terjadi maka frustum tampilan kamera harus sepenuhnya berada di dalam portal sehingga garis persimpangan akan selalu terpotong sepenuhnya dari satu tepi layar ke tepi lainnya.

Tautan ini akan membantu matematika untuk menemukan garis. Kode di bawah ini seharusnya kurang lebih benar.

Garis persimpangan didefinisikan menggunakan titik pada garis dan arah garis. Di bawah arah persimpangan dihitung menggunakan produk silang dari portal normal dan arah tampilan kamera (mendekati bidang normal). Titik pada garis diberikan dengan melemparkan sinar dari titik di dekat pesawat langsung menuju bidang portal (sepanjang portal normal) dan menemukan titik persimpangan.

Vector3 intersectionDir = Vector3.cross(portalNorm, viewDir);
Ray ray = new Ray(camPos + viewDir * camNearPlaneDist, portalNorm);
Vector3 intersectionPos = ray.intersects(new Plane(portalVert1, portalVert2, portalVert3);

Pastikan viewDir adalah vektor satuan. portalVert1, 2 dan 3 hanyalah 3 dari 4 simpul yang digunakan untuk decal portal atau permukaannya. Ada cara lain untuk mendefinisikan bidang di mana portal terletak, tetapi saya menganggap ini adalah informasi yang paling mudah tersedia.

Setelah Anda memiliki dua vektor ini untuk menentukan garis persimpangan, kalikan masing-masing dengan tampilan dan kemudian matriks proyeksi untuk mendapatkannya di ruang layar.

Anda kemudian dapat menggunakan shader proses pos untuk memadukan gambar-gambar ini. Anda memilih gambar mana yang akan digunakan pada setiap piksel dengan menentukan sisi mana dari garis pemisah tempat piksel saat ini berada. Ini dilakukan dengan mengambil posisi piksel (yang juga merupakan posisi yang Anda gunakan untuk mencari target render texel) dan melakukan;

float d = (pixelX - intersectionPos.X) * intersectionDir.Y - (pixelY - intersectionPos.Y) * intersectionDir.X;

Sisi diberikan oleh apakah d lebih atau kurang dari 0. Jika itu tepat 0, maka Anda berada di telepon.

Untuk referensi tentang matematika di atas lihat ini .

Metode ini juga dapat digunakan saat membuat buffer mask / stensil kedalaman untuk digunakan sebelum rendering dari perspektif portal. Anda dapat membuat quad layar penuh dan menggunakan garis untuk mengirisnya.

OriginalDaemon
sumber
Pesawat klip dekat adalah ide yang bagus, tetapi tidak persis apa yang saya cari. Bagian kedua itu adalah pendekatan yang menarik. Saat ini saya menggunakan shader topeng kedalaman pada segala sesuatu di belakang pesawat portal yang ada, kemudian mengatur bendera jelas kamera yang ada ke kedalaman saja. Ini membuatnya jadi bagian mana pun dari kamera yang keluar yang memuncak dari portal menarik di layar, dan kamera yang masuk menarik pada topeng kedalaman, sehingga ia menciptakan satu gambar dengan mencampur bagian-bagian dari setiap kamera yang memuncak dari itu portal masing-masing. Satu-satunya masalah adalah saya mendapatkan beberapa masalah kliping kecil dan sebagai
Timothy Williams
sedikit brengsek saat pemain melakukan perjalanan. Gagasan yang Anda kemukakan ini terdengar cukup menjanjikan. Jadi pada dasarnya apa yang perlu saya lakukan adalah menghitung garis di sepanjang layar bahwa kamera di dekat pesawat dan bidang portal berpotongan, arah memberi saya ke arah mana garis itu pergi, dan titik adalah berbagai titik garis. Bagaimana cara saya menentukan dalam shader / skrip sisi mana dari garis pemisah yang diletakkan piksel?
Timothy Williams
Saya memperbarui jawabannya sedikit untuk memberikan beberapa kode dasar. Pastikan untuk mencoba mengubah tampilan dekat jarak kliping pesawat untuk mengkonfirmasi masalah. Membuat ini sekecil mungkin juga cukup. Ingat, buat itu bekerja, buat itu bekerja dengan benar, lalu buat itu bekerja dengan cepat
OriginalDaemon
Saya melakukan uji coba mengubah jarak pesawat dekat kliping, itu membuat masalah sedikit lebih baik, tetapi sebagai artikel Mell diposting menyatakan itu tidak memperbaiki masalah ketika menembus. Saya masih merasa sepertinya garis persimpangan bisa berfungsi, jadi saya akan mencobanya. Saya juga akan melihat sedikit lebih dalam artikel yang diposting Mell. Pada akhirnya akan turun ke apakah topeng kedalaman lebih cepat atau garis persimpangan ini lebih cepat
Timothy Williams
3

Jawaban yang disarankan sangat bagus, tetapi akhirnya saya pergi untuk teknik yang berbeda menggunakan topeng kedalaman.

Apa yang Anda lakukan adalah mengambil skrip dan shader INI , Anda menempatkan skrip pada setiap objek dengan renderer di adegan Anda dan mengatur antrian render ke 3020 (saya akan memposting skrip untuk mempermudah ini nanti).

Kemudian, Anda membuat sebuah kotak pesawat (semua menghadap ke dalam, dalam gambar Anda tidak dapat melihat sisi kotak yang paling dekat dengan Anda, tetapi ketika Anda berada di dalam kotak, Anda akan melihat semua berwarna abu-abu) di belakang KEDUA portal Anda seperti itu: masukkan deskripsi gambar di sini Dan atur mereka ke lapisan khusus mereka sendiri (saya memilih "DepthMask" untuk tambang), lalu Anda menambahkan bahan dengan shader di atasnya. masukkan deskripsi gambar di sini

Anda kemudian mengambil kamera utama dan hapus centang pada layer khusus Anda dari culling mask (saya hapus centang pada layer DepthMask) dan atur kedalamannya ke 0. masukkan deskripsi gambar di sini

Kemudian ketika Anda melakukan teleportasi dan mengkloning kamera, atur bendera jernih kamera lainnya ke "Hanya Kedalaman" dan kedalamannya menjadi 1. masukkan deskripsi gambar di sini

Anda kemudian mendapatkan layar mulus yang dipadukan antara dua tampilan kamera.

Timothy Williams
sumber