Kamera Realistis / Guncangan Layar dari Ledakan

36

Saya ingin mengguncang kamera sedikit selama ledakan, dan saya sudah mencoba beberapa fungsi berbeda untuk membuatnya goyang, dan sepertinya tidak ada yang benar-benar memberikan 'wow, bang banget!' ketik perasaan yang saya cari. Saya sudah mencoba beberapa pola gelombang sinus frekuensi tinggi yang sewenang-wenang dengan sedikit pelemahan linear, serta pola tipe gelombang persegi. Saya sudah mencoba bergerak hanya satu sumbu, dua, dan ketiganya (walaupun efek dolly hampir tidak terlihat dalam kasus itu).

Apakah ada yang tahu tentang pola guncangan kamera yang bagus?

Falstro
sumber
2
Cobalah untuk menemukan beberapa cuplikan film guncangan kamera setelah ledakan dan saksikan dalam gerakan lambat untuk melihat bagaimana kamera goyang dan mendasarkan kode Anda pada itu.
Skizz
Saya memiliki masalah yang sama persis - goyangan hanya terlihat terlalu halus
Iain
Masalah terbesar yang saya hadapi ketika menerapkan guncangan kamera adalah tampaknya karakter pemain (yang fokus pada kamera) bergerak alih-alih kamera. Yang aneh adalah bahwa itu adalah kamera yang bergerak, jika Anda melihat lingkungan yang Anda perhatikan, tetapi karena Anda begitu fokus pada karakter pemain, persepsi Anda menjadi kacau. Saya masih mencoba menyelesaikan ini - mungkin dengan mengubah bidang pandang saat kamera bergerak / ke arah pemain.
Kaj

Jawaban:

35

Saya mendapatkan goyangan kamera yang layak dengan menerapkan noise Perlin ke orientasi kamera. Ini memberi Anda sentakan besar yang layak dengan guncangan frekuensi yang lebih tinggi, dan dapat terlihat sangat bagus.

http://mrl.nyu.edu/~perlin/doc/oscar.html memiliki lebih detail dan kode sampel untuk menghasilkan noise.

James Sutherland
sumber
3
Oh, berisik, kenapa aku tidak memikirkan itu ... Bagaimanapun juga, aku cukup banyak ledakan pendek, bukan ... Ide bagus!
Falstro
ide bagus, adakah yang bisa Anda gunakan untuk mengatasi perlin noise? : P
Cubed2D
1
Kebisingan pasti cara untuk pergi, jika Anda bahkan menggambarkan efek setelah Anda, perubahan singkat dari gerakan acak ke arah yang berbeda. Tapi itu bukan kejang, jadi Anda perlu bagian keseragaman yang singkat. Kedengarannya seperti penggunaan yang sempurna untuk kebisingan Perlin.
decaviatedcaviar
17

Jika Anda mengacu pada guncangan layar yang menilai dari sebuah ledakan, saya telah mencoba menerapkan ini dalam permainan prototipe saya (ini 2d tetapi harus diterjemahkan ke 3d dengan cukup baik, saya harapkan). Lihatlah video youtube dan lihat apakah itu yang Anda cari - guncangan layar dimulai sekitar 1:35

Bagaimanapun, cara saya mencapainya adalah membuat viewport untuk sceen dan menyimpan titik pusat ( centre).

Ketika sebuah ledakan dimulai, saya membuat acak radius~ 30px. Saya kemudian mengimbangi viewport dari centreini dengan banyak piksel dalam arah acak.

Untuk setiap pembaruan berikutnya (antara menarik ke layar), saya mengurangi radius10-20% dan mengimbangi viewport dengan banyak piksel dari ini centrelagi. Namun, alih-alih memilih sudut acak untuk offset ini, saya malah mengambil sudut viewport sebelumnya dari centredan menambahkan 180 +/- 60 derajat ke sana.

Jadi pada dasarnya, setiap pembaruan (atau 10-20 ms atau lebih), saya mengimbangi viewport dengan berkurangnya jumlah piksel dari centrelayar.

Inilah beberapa pseudocode:

viewportCentre = (400,300) //Lets say screen size is 800 x 600
radius = 30.0
randomAngle = rand()%360
offset = ( sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) // set centre of viewport
draw()  

while(true)  //update about every 10-20ms
{ 
    radius *=0.9 //diminish radius each frame
    randomAngle +=(180 +\- rand()%60) //pick new angle 
    offset = (sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
    viewport.setCentre(viewportCentre + offset) //set centre of viewport
    draw() //redraw
}

Saya biasanya menghentikan guncangan layar ketika jari-jari lebih rendah dari 2.0, pada saat itu saya mengatur ulang viewport kembali ke centre.

miklatov
sumber
4
Saya suka implementasi ini, sangat cocok untuk game 2D kecil. Sebagai komentar, itu sama dengan yang harus dilakukan randomAngle += (150 + rand()%60)untuk menyingkirkan masalah +/-.
Krøllebølle
2
Video Anda tidak aktif.
Tara
Seperti apa perhitungan "+/-"? Aku belum pernah melihat ini.
Yoo Matsuo
4

Untuk membuat goyangan kamera "merasa" benar kurang tentang arah gerak dan lebih banyak tentang kurva akselerasi.

Goyangan kamera masuk ke ranah animasi dan karenanya semua aturan aksi / reaksi berlaku. Jika Anda bergerak secara linier dari titik ke titik, itu akan terasa halus dan seragam dan tidak seperti dampak.

Jika Anda menggelengkan kepala bolak-balik, Anda akan melihat bahwa itu bergerak tercepat di titik tengah antara perubahan arah dan melambat di setiap sisi saat Anda pertama kali harus melambat dan kemudian mulai naik ke arah yang baru.

Berikut adalah daftar berbagai fungsi pelonggaran untuk diterapkan pada gerakan Anda. Anda mungkin ingin hanya EaseOut gerakan pertama agar terasa sedikit lebih tiba-tiba, dan kemudian EaseInOut sisanya untuk mensimulasikan gerakan kepala / kamera.

wkerslake
sumber
1
Saya pikir pelonggaran masih akan membuatnya terlalu halus. Suara perlin sepertinya ide yang bagus, atau sebaliknya acak acak dengan rentang acak berkurang ke nol seiring waktu untuk membuatnya menghilang (saya lebih suka bereksperimen dengan fungsi kemudahan yang berbeda pada jari-jari yang berkurang daripada pada gerakan yang sebenarnya, memudahkan gerakan itu sendiri akan membuat kamera terasa seperti berada di pegas, tidak terasa benar dengan guncangan kamera dalam pengalaman saya).
Kaj
3

wkerslake benar, goyangan kamera tampak lebih rumit dari yang Anda kira.

Saat meniru kamera guncang, Anda harus berpikir tentang jenis kamera (operator) yang ingin Anda tiru. Berat kamera memengaruhi kelembaman, misalnya. kamera yang lebih berat memuluskan gerakan kecil 'acak'. Operator kamera di rel atau di mobil menambah kebisingan tambahan.

Menggunakan Perlin atau noise Simplex jelas merupakan suatu pilihan, maka itu semua tentang menemukan keseimbangan yang tepat antara rasio kebisingan yang berbeda. Tapi saya menemukan menggunakan interpolasi antara nilai-nilai kurang intensif secara komputasi dan bisa sama efektifnya.

Beberapa waktu yang lalu, saya telah menemukan skrip Maya yang tampaknya melakukan banyak hal dengan benar. Anda bisa lihat bahwa .

Juga, Anda mungkin ingin melihat Gran Turismo (5) , tim mereka melakukan pekerjaan yang mengesankan dalam melakukan berbagai jenis guncangan kamera waktu nyata ketika Anda menonton tayangan ulang dalam permainan.


sumber
2

Jika Anda memiliki fisika objek dinamis [mungkin bukan kata yang tepat, tetapi semacam apa yang saya maksudkan], di mana objek apa pun yang tidak diperbaiki akan 'terpesona' oleh ledakan, Anda dapat memiliki kamera yang terpengaruh sebagai objek seperti itu.
Hanya bedanya hanya mengubah rotasi / pitch / yaw / roll kamera, dan bukan posisi.
Selain itu, mungkin menghasilkan urutan angka acak dan mengubahnya menjadi rotasi entah bagaimana? Pikirkan bahwa heightmap, barang abu-abu dapat menjadi contoh; mereka tidak sepenuhnya berbeda, tetapi acak.

Bebek Komunis
sumber
+1 ide yang menarik, saya pikir saya akan mencoba gerakan kebisingan, dan ketika saya menjalankannya, saya akan mencoba untuk menambahkan efek dolly yang lebih keren, seperti kamera terpasang pada pegas dan ditekan ke belakang oleh keterkejutan.
Falstro