Bagaimana peluru disimulasikan dalam video game?

86

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.

  1. 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?

  2. Jika peluru benar-benar bergerak dari pistol ke sasaran, pada kecepatan berapa sebenarnya ia bepergian?

mahen23
sumber
25
Layar berdarah, sangat nyata!
AttackingHobo
6
shoots : BOOOOORRRIIIING
mahen23
1
Saya tidak yakin apakah Anda dapat menyebut peluru Megaman Legend sebagai peluru, tetapi di Megaman, mereka menggunakan proyektil yang lambat untuk peluru. Di dalamnya, Anda dapat dengan jelas melihat tembakan melengkung jika Anda berlari dalam lingkaran saat memotret (efek coriolis).
Lie Ryan

Jawaban:

84

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.

SerangHobo
sumber
1
Tidak pernah memainkan game yang disebutkan di atas, bagaimana efeknya pada gameplay? Maksud saya, jika Anda menggunakan fisika peluru ke dalam permainan seperti Call of Duty, apakah Anda benar-benar melihat perbedaan yang nyata? Apakah sudut penetrasi itu mengubah game? Akankah para pemain bahkan menyadari bahwa karakter mereka tidak sejajar dengan lubang peluru dalam kaitannya dengan penembak? Hanya ingin tahu manfaat apa yang ada untuk membenarkan biaya overhead. Terima kasih sebelumnya.
Dutchie432
Ini menambah lapisan ketidakpastian dan kedalaman pada mekanisme pemotretan yang menurut saya menyenangkan. Peluru tidak instan !!! chuckhawks.com/rifle_ballistics_table.htm Seekor siput yang berjalan 2644 kaki per detik selama 600 kaki membutuhkan waktu lebih dari 0,2 detik untuk mengenai target yang tidak memperhitungkan perlambatan tambahan. Target yang berjalan akan terlewatkan jika Anda mengarahkannya secara langsung. Jarak yang lebih jauh akan memungkinkan siput bergerak lebih lambat daripada kecepatan suara, memungkinkan orang untuk melompat ke tanah atau lainnya jika mereka mendengar tembakan.
AttackingHobo
Ada beberapa pernyataan yang tidak akurat yang dibuat dalam jawaban ini dan harus dihapus. Periksa jawaban saya di bawah ini.
EddieV223
1
Peluru dalam ArmA 2 adalah proyektil yang disimulasikan; mereka dapat dimodifikasi (perubahan kecepatan, perubahan arah) pertengahan penerbangan dan bertabrakan dengan benda saat mereka bepergian. Apakah ini dilakukan dengan pengecoran sinar atau tidak tidak relevan, mereka bertindak sebagai objek fisika nyata.
decaviatedcaviar
jadi mw2? raycasting atau tidak? Karena mereka jelas melakukan pekerjaan yang hebat dalam mensimulasikan lubang peluru dan lingkungan yang dihancurkan olehnya
mahen23
51

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.

jhocking
sumber
44

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.

Don Neufeld
sumber
2
Saya bermain Planetside sebelum saya memprogram permainan yang bagus, dan itu terdengar menyenangkan untuk dikodekan.
Anthony
18

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
14

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).

Josh
sumber
11

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.)

Casey
sumber
teman cerita yang luar biasa. Namun, saya yakin mesin 3D Torsi membutuhkan daya pemrosesan lebih besar, untuk menghitung semua fisika ini.
mahen23
@ mahen23 Anda akan terkejut. Itu memiliki perhitungan fisika KURANG daripada Mesin Sumber lakukan, sebagian karena tidak menangani tabrakan Softbody sama sekali, hanya kotak lompatan dan tabrakan sederhana.
Casey
10

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

lunixbochs
sumber
2
Wiki itu bacaan yang bagus.
mgiuca
Sementara bagian itu pendek, ini menjelaskan hitscan dan non-hitscan dan menjelaskan apa itu hitbox dan bagaimana mereka digunakan.
jhocking
ingat untuk membaca sub artikel "Proyeksi" dan "Hitscan" tepat di bawah judul bagian itu
lunixbochs
6

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.

Timothy Baldridge
sumber
Pencarian warna-> pemain terdengar menyakitkan? Jika Anda ray melemparkannya, bukankah itu efisiensi yang sama?
deceleratedcaviar
Sebenarnya, ini sangat cepat. Sebagian besar waktu yang dihabiskan untuk rendering adalah dari naungan poligon yang sebenarnya. Dalam hal rendering uji-hit, hanya poligon warna solid yang digunakan. Selain itu, uji coba ini dapat dilakukan sepenuhnya dalam GPU, dan ini pixel-perfect. Tidak ada yang lebih baik dari pemain selain melakukan pukulan sempurna pada target, dan kemudian uji coba mengatakan bahwa itu adalah kehilangan.
Timothy Baldridge
Tetapi bagaimana Anda mengonversi ruang piksel ke ruang dunia ke objek yang sesuai yang Anda tekan.
decaviatedcaviar
@Aniel: Seperti jawabannya, target yang terkena diidentifikasi oleh warna. Setiap karakter dirender sebagai warna yang berbeda (solid), jadi Anda bisa mengecek warna dan hitam = miss, yang lainnya = cari siapa yang dirender dalam warna itu, karena mereka terkena.
Dave Sherohman
@Dave Sherohman, saya pasti sudah salah membaca awalnya, setelah membaca penjelasan Anda, tampak sangat jelas apa yang dia maksud ... tepuk tangan
deceleratedcaviar
4

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.

Tim Holt
sumber
+1 informasi yang baik. Tapi saya pikir mungkin secara visual lebih menyenangkan jika AI, sebenarnya buruk dalam membidik pemain, daripada kerucut yang lebih besar. Atau jika Anda ingin membuat kerucut lebih besar, buatlah itu berukuran variabel berdasarkan dari recoil dan berikan musuh level yang lebih rendah tingkat kenaikan ukuran yang lebih cepat, sehingga mereka sepertinya tidak berpengalaman.
AttackingHobo
1

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.

Jeff Welling
sumber
1

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.

Stephen
sumber
1
Anda harus memasukkan beberapa informasi mengapa setiap tembakan ketiga atau lebih akan memiliki pelacak. Ini bukan pengembangan game-developer. Itu militer. Peluru pelacak yang memiliki fosfor tertanam di bagian belakang siput. Ketika peluru ditembakkan, serbuk mesiu membakar fosfor dan menciptakan jejak cerah di belakang peluru. Peluru pelacak lebih mahal daripada peluru biasa, sehingga mereka hanya menggunakan tembakan X yang pernah ada atau lebih untuk menghemat uang, sambil tetap memiliki efek yang dimaksudkan agar dapat membidik dengan lebih mudah.
AttackingHobo
Juga, Anda tidak ingin membaginya dalam rendering dan pembaruan seperti yang Anda katakan. Anda ingin semua fisika peluru sepenuhnya dilakukan dengan metode pembaruan. Anda ingin setiap tembakan X atau lebih juga menelurkan efek pelacak yang jauh lebih lambat daripada peluru untuk menunjukkan gerakan dan arah.
AttackingHobo
@AttackingHobo Saya tidak secara spesifik memikirkan putaran fosfor, melainkan beberapa isyarat visual bahwa peluru terbang. Idenya adalah untuk menggunakan kompresi selektif ... menghapus tingkat detail bahwa pemain tidak akan pernah mendaftar sebagai "hilang", tetapi itu memudahkan beban pada sistem. Bit "setiap peluru ke-3" adalah arbitrer ... Anda harus bereksperimen untuk melihat apa yang bekerja dengan baik. Dalam jawaban Anda, Anda mengatakan "pelacak palsu", yang juga masuk akal.
Stephen
1

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 ...

jokoon
sumber
1

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.

JAMOY
sumber
0

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.

Jack lincah
sumber
-5

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

EddieV223
sumber
3
Menyesatkan untuk membatalkan game yang menggunakan ODE untuk tujuan yang tidak ada hubungannya dengan peluru.
jhocking
4
Ini juga menyesatkan untuk mengatakan penguntit menggunakan ODE untuk peluru, padahal sebenarnya permainan menggunakan tes tabrakan miliknya sendiri, tetapi hanya menggunakan pemecah ODE.
AttackingHobo