Saya telah bermain game seperti MW2 baru-baru ini dan, sebagai seorang programmer, saya cenderung bertanya pada diri sendiri bagaimana mereka membuat game ini begitu mendalam. Misalnya, bagaimana mereka mensimulasikan kecepatan peluru.
Ketika seorang NPC menembakkan peluru dari senjatanya, apakah peluru itu benar-benar berjalan dari senjatanya ke target yang diberikan atau apakah mereka benar-benar mengabaikan bagian ini dan hanya menempatkan lubang peluru pada target?
Jika peluru benar-benar bergerak dari pistol ke sasaran, pada kecepatan berapa sebenarnya ia bepergian?
projectile-physics
mahen23
sumber
sumber
Jawaban:
Sebagian besar game FPS menggunakan raycasting untuk gameplay yang sebenarnya; peluru langsung bergerak dan mengenai target ketika ditembakkan.
Tetapi sebagian besar game juga menggunakan pelacak "palsu". Setiap 3 tembakan, atau interval lainnya, pelacak akan ditembakkan bersama dengan peluru, pelacak akan sangat cepat, tetapi tidak instan. Ini dilakukan sebagai efek visual saja, dan tidak memengaruhi permainan langsung, tetapi membantu memberi isyarat kepada penembak, penembak, dan memberikan pengamat referensi terarah pada tembakan.
Sebagian besar permainan yang menggunakan jenis-jenis fisika peluru ini tidak realistis, karena tidak ada ricochets, tidak ada fragmen peluru, dan jika ada penetrasi biasanya linier.
Beberapa game, seperti ARMA II, STALKER (seluruh seri) menggunakan fisika peluru yang lebih realistis dengan waktu tempuh, ricochets, dan penetrasi dengan sudut defleksi. Saya percaya sistem ini menggunakan raycasting, tetapi dengan batas yang ditentukan oleh kecepatan peluru. Dengan permainan ini, kecepatan moncong bisa realistis seperti pada ARMA II, atau terlihat benar seperti pada STALKER.
Saya lebih suka memiliki fisika peluru yang realistis, karena senjata menembakkan proyektil, bukan laser.
sumber
Untuk peluru, mereka biasanya tidak bersusah payah mensimulasikan peluru yang sebenarnya melayang di udara dan cukup menempatkan lubang peluru pada target begitu peluru itu ditembakkan. Hal-hal lain seperti roket lebih lambat * dan permainan sebenarnya menunjukkan mereka melakukan perjalanan di udara.
Pada jarak pendek peluru akan melakukan perjalanan, bersama dengan selang waktu di antara frame, mereka akan mendapatkan dari penembak ke target antara atau dalam 1 frame.
* Artinya, lebih lambat dari roket di kehidupan nyata, agar pemain melihat mereka terbang di udara.
sumber
Saya menulis kode peluru untuk PlanetSide. Kami memiliki beberapa proyektil 'hitscan', tetapi sebagian besar mensimulasikan proyektil sebaik mungkin mengingat kendala CPU dan sejumlah besar peluru yang dimainkan kapan saja.
Dalam kasus hitscan, dampak ditentukan dalam bingkai yang sama dengan input yang diterima, sering menggunakan raycast tunggal. Ini sesuai untuk senjata seperti laser atau proyektil yang sangat cepat lainnya. Kami melakukan hitscan dengan hanya memutar kecepatan awal pada proyektil begitu tinggi sehingga akan melewati papan permainan dalam satu centang.
Peluru non-hits dapat dicentang, baik ke waktu bingkai grafis atau ke waktu yang ditetapkan, dengan perhitungan untuk akselerasi (roket berpikir), gravitasi, gesekan udara, panduan (pikirkan proyektil mencari panas) dll. Diterapkan. Tujuannya adalah untuk menghasilkan posisi terminal proyektil untuk catatan waktu. Setelah titik awal dan akhir ditetapkan, satu atau lebih sinar dapat dilemparkan untuk mendekati jalur penerbangan dan mendeteksi setiap tabrakan yang mungkin terjadi selama penerbangan.
Dalam proyektil hitscan dan non hitscan, apa yang terjadi pada tabrakan tergantung pada properti proyektil Anda dan permukaan yang Anda bentak. Misalnya, Anda mungkin mengenai permukaan yang keras, dalam hal ini Anda dapat memeriksa jumlah bouncing Anda dan menyesuaikan posisi dan kecepatan per refleksi, atau meledakkan proyektil jika Anda telah mencapai jumlah bouncing maksimum Anda. Dalam sistem ini, roket hanya memiliki jumlah bouncing maksimum 0. Anda mungkin mengenai permukaan yang lunak dan kemudian memeriksa daya tembus Anda untuk menentukan apakah proyektil harus berlanjut melalui bahan, dll.
Itu kode yang menyenangkan untuk ditulis. Juga, sangat berguna untuk menulis visualisasi debug yang baik tentang apa yang terjadi sehingga Anda dapat memeriksa jalur penerbangan, acara, dll secara visual.
sumber
Itu tergantung pada permainan dan tingkat akurasi / realisme.
Menyinkronkan model pemotretan dan kerusakan dalam pengaturan multi-pemain cukup sulit karena Anda perlu menentukan secara akurat di mana dan kapan tepatnya peluru ditembakkan, apakah mengenai target, dan apakah ada hal lain yang melewati jalur.
Oleh karena itu, saya menduga bahwa jika memungkinkan, perancang gim menyederhanakan banyak hal dengan memperlakukan beberapa bidikan sebagai instan (sehingga Anda hanya perlu mempertimbangkan lokasi setiap orang pada satu waktu), atau dengan membatasi jarak peluru. Untungnya, ini sering berhubungan dengan fisika kehidupan nyata. Misalnya, senapan sniper menembakkan putaran kecepatan tinggi.
Banyak gim yang dapat mensimulasikan lintasan multi-snapshot multistep dari objek yang bergerak lambat (seperti artileri, bom, putaran spidol, dll.) Tetapi itu sangat mahal dan masalah sinkronisasi lebih umum, mengarah ke video youtube yang lucu.
Kekhawatiran lain adalah dengan permainan yang mempertahankan "lingkungan" kecil yang terpisah (misalnya, setiap kamar disimulasikan secara terpisah) untuk menciptakan ilusi ruang yang lebih besar. Dalam kasus ini, hal-hal dalam batas-batas "ruang" dapat disimulasikan dengan benar sehingga setiap orang di ruangan diperbarui tentang serangkaian transisi dalam ruang yang dibuat oleh peluru, tetapi yang lain di luar lingkungan itu tidak.
sumber
Untuk proyektil yang bergerak lebih cepat dari yang dapat dilihat mata, raycasting sering digunakan - sinar dari moncong dihitung dengan arah yang sesuai dan diuji terhadap objek target potensial untuk menentukan apa yang terkena. Ini bisa rumit dengan banyak sinar dan beberapa perhitungan tambahan jika Anda ingin mensimulasikan hal-hal seperti drop peluru dan semacamnya. Anda juga dapat memberikan proyek kecepatan dan menggunakannya untuk menambahkan beberapa realisme tambahan ke perhitungan (jadi peluru tidak instan).
sumber
Itu tergantung pada implementasinya tetapi saya tahu bahwa Mesin Sumber tidak menggunakan peluru fisik (objek proyektil) sama sekali, mereka hanya melakukan pemerasan sinar dari pemain untuk menargetkan dengan lingkaran "zona tembak" acak (jari-jari yang lebih besar atau lebih kecil bergantung pada seberapa cepat senjata ditembakkan dan jika pemain menahan tombol api) yang pusatnya adalah titik yang dituju pemain, maka setelah menentukan sinar yang sebenarnya dilemparkan dari pemain ke titik yang ditentukan secara acak dan tergantung pada faktor-faktor lain (seperti peluru "berat" dan kecepatan moncong (semua nomor internal), benda mengenai, dll) pemeran sinar dilemparkan melalui beberapa objek atau sampai mencapai medan.
Di sisi lain, Torque 3D Engine DID menggunakan objek proyektil yang sebenarnya dan perancang dapat memengaruhi kecepatan, massa, dan pengubah gravitasi masing-masing. Semua yang dilakukan mesin adalah memperbarui nilai setiap 32 milidetik.
SUNTING
Selain menggunakan objek proyektil, Torque 3D Engine juga memungkinkan untuk menggunakan ray gips sebagai alternatif. (Saya telah membuat beberapa permainan di mana "proyektil" sebenarnya adalah efek partikel yang tidak memiliki dukungan yang dilakukan oleh objek proyektil sehingga diperlukan pemeran sinar.)
sumber
Ada tulisan yang cukup keren di wiki Team Fortress 2 tentang perilaku proyektil dan senjata hitcan mereka.
http://wiki.teamfortress.com/wiki/Mechanics#Hit_detection
sumber
Sebenarnya banyak game menggunakan algoritma gpu rendering hit test. Inilah cara dasar kerjanya:
1) Di luar layar buat render tampilan saat ini di mana semua medan berwarna hitam, dan setiap karakter adalah warna non-hitam 2) Dapatkan warna piksel di bawah garis silang 3) Jika non-hitam cari warna- > pemetaan pemain dan terapkan hit ke target itu.
Metode ini telah digunakan selama bertahun-tahun dalam permainan sebagian besar karena pixel-nya sempurna. Jika satu piksel topi pemain mencuat dari balik dinding, Anda dapat memukulnya. Yaitu jika Anda bisa melihatnya, Anda bisa memukulnya. Jenis presisi ini hampir tidak mungkin dengan teknik pengecoran sinar sederhana. Dan kedua, tes semacam ini sangat cepat dan dapat dilakukan pada GPU.
sumber
Beberapa game tidak diragukan lagi memang menggunakan fisika peluru realistis, dengan mempertimbangkan waktu tempuh dan jatuhkan peluru, tapi saya rasa sebagian besar permainan tidak, setidaknya untuk NPC.
Untuk gim yang melakukan perjalanan peluru langsung (tanpa jatuhkan) itu instan, gim ini melacak garis imajiner (vektor) dari titik laras ke depan. Itu kemudian menghitung apa yang berpotongan dengan garis itu, dan mendaftarkan "hit" peluru pada titik itu. Mungkin benda padat seperti dinding di mana dampak memicu efek seperti stiker peluru dan "kepulan" asap / puing. Ini dapat berdampak pada objek yang dapat pecah yang menyebabkannya pecah, atau mungkin berdampak pada objek fisika dan memberinya "tendangan". Atau tentu saja itu bisa mengenai pemain atau NPC lain dan menyebabkan serangan kesehatan. Simulasi hard core akan memodelkan peluru menembus dinding dan memicu efek hit di sisi keluar, mungkin mengurangi kerusakan peluru saat keluar.
Agar NPC tidak memiliki tujuan yang sempurna, banyak game menambahkan semacam pengacakan ke vektor untuk memodelkan penyebaran peluru. Ini adalah apa yang akan Anda lihat dalam kehidupan nyata, di mana peluru tidak semua mengenai tepat sasaran, tetapi dalam pola yang berpusat di sekitar titik sasaran.
Untuk memvisualisasikan penyebaran peluru, bayangkan kerucut yang keluar dari pistol bukannya garis lurus (vektor). Arah peluru yang sebenarnya secara acak berada di suatu tempat di dalam kerucut ini. Jika penembak sangat dekat dengan target, sebarannya kecil dan akurasinya tinggi. Jika target jauh, kerucut menambahkan lebih banyak penyebaran sehingga kemungkinan penembak untuk mencapai target lebih kecil.
Gagasan shot cone ini dapat digunakan untuk memodelkan akurasi penembak (skill), akurasi senjata dan kondisi lainnya. Misalnya NPC level rendah mungkin diberikan cone tembakan akurasi rendah, sedangkan NPC terampil tinggi akan memiliki akurasi tingkat tinggi. Seorang pemain yang berlari dengan senapan mesin ringan yang menembak dari pinggul akan memiliki kerucut tembakan lebar, yang akan berkurang jika mereka berhenti berlari atau membidik. Senapan sniper akan memiliki tembakan kerucut yang lebih ketat secara alami daripada mengatakan pistol.
sumber
Berbicara tentang kode sumber Nexuiz sejak saya melihatnya, mereka tidak benar-benar mengirim objek 'peluru' dari titik A ke titik B. Jika saya ingat dengan benar, dan ini khusus untuk beberapa senjata - senjata lain tidak ada ' t senjata instan ketika ditembakkan, kode melihat ke arah mana senjata Anda diarahkan. Jika ditujukan pada seseorang (dan merupakan senjata hit instan) ketika Anda mengklik 'api' maka Anda berhasil.
Yang juga penting adalah bagaimana Nexuiz memiliki opsi sisi server untuk menghitung hit pada klien atau pada server. Jika Anda mencurigai klien curang, Anda dapat beralih ke perhitungan klik sisi server dalam upaya untuk membantu mengurangi itu.
sumber
Strategi lain adalah hibrida dari rendering segalanya dan ray tracing everything. Anda tidak harus membuat setiap peluru. Sebagai contoh, jika pistol Anda menembakkan 30 putaran / detik, strafe dapat menghasilkan beberapa ratus partikel ... Anda dapat mengurangi rendering dengan menggunakan "efek pelacak", membuat setiap tembakan ke-3, ray melacak dua lainnya. Pemain masih melihat 10 putaran / detik menembaki musuh.
Tweak untuk situasi spesifik Anda, berikan lebih banyak untuk senjata api tingkat rendah, lebih sedikit untuk lebih tinggi.
sumber
Jangan lupa bahwa framerate versus kecepatan peluru bisa menjadi masalah, dalam beberapa kasus jika Anda tidak mengkodekan mesin fisika Anda dengan cukup baik, peluru tersebut dapat menembus benda tanpa memukulnya. Ada solusi untuk masalah ini, yang saya tidak ingat dengan baik ...
Bagaimanapun, saya pikir itu bisa sangat bermasalah untuk mengkompensasi peluru realistis dalam lingkungan multi-pemain, jika bukan tidak mungkin jika latensi mulai lebih dari 30 atau 50 ms.
Namun suatu hari, ISP mungkin lebih peduli tentang latensi dan memberikan penawaran berbeda ... tetapi tanpa FTTH, itu masih mimpi ...
sumber
Dalam permainan seperti perusahaan yang buruk, battlefeild 3 dan stalker, saya percaya peluru itu adalah entitas individu aktual yang ditembakkan seperti "roket". Saya hanya berpikir ray tracing diperlukan jika peluru akan langsung mengenai target. Ketika entitas itu sendiri dalam peluru realistis hanya akan berdetak untuk melihat apakah itu mengenai seseorang.
sumber
Sebenarnya, jika Anda melihat tayangan ulang video di Call of Duty, Anda bisa samar-samar melihat biped oranye terbang di udara ke target yang dituju, dan menyerangobo sebenarnya memiliki jawaban yang tepat untuk sebagian besar.
Jika Anda ingin efek richochet seperti Hobo dinyatakan hanya bermain salah satu game Halo. Jika Anda menembaki dinding logam dari posisi yang lebih dekat, Anda dapat melihat peluru kaya terlepas dari logam. Penembak jitu di dalamnya meninggalkan jejak ke tempat hits.
Jawaban yang sudah selesai selesai, saya mungkin kembali nanti untuk memperbaikinya.
sumber
Peluru dan semua fisika dalam seri penguntit game menggunakan perpustakaan open source yang disebut "Open Dynamics Engine".
http://en.wikipedia.org/wiki/Open_Dynamics_Engine
Peluru jatuh dengan gravitasi dan bahkan memantul dari dinding dan hal-hal yang sangat akurat jika cukup pintar Anda, Anda bahkan dapat melengkung peluru dari sesuatu untuk menembak seseorang yang Anda tidak bisa melihat tetapi tahu posisi mereka. Peluru adalah model objek yang sebenarnya. Ini adalah cara paling realistis yang saya lihat dilakukan, metode ray trace tidak praktis ketika Anda mulai pindah ke ruang besar. Akan lebih baik untuk menembakkan senjata laser.
Game lain yang menggunakannya BloodRayne 2, Call of Juarez, World of Goo, X-Moto dan OpenSimulator.
Pilihan lain yang baik adalah perpustakaan fisika "Bullet". http://en.wikipedia.org/wiki/Bullet_%28software%29
Itu digunakan dalam pencurian mobil 4, penebusan mati merah dan banyak lagi.
ps arma 2 menggunakan mesin fisika in-house, game arma 3 berikutnya akan menggunakan mesin PhysX Physics
sumber