Tham dự Tech Lounge

Tham dự Tech Lounge


Trong game bắn súng, đường đạn được mô phỏng như thế nào?

P.W
10/7/2020 9:59Phản hồi: 63
Trong game bắn súng, đường đạn được mô phỏng như thế nào?
Về cơ bản trò chơi điện tử là một gói dữ liệu khổng lồ chứa mô hình vật thể và những dòng thuật toán mô phỏng đời thật cũng như ra lệnh cho từng mô hình cư xử theo cốt truyện định sẵn để đánh lừa anh em chơi game. Lấy ví dụ trong game bắn súng, các nhà phát triển sẽ phải gõ ra những dòng code để mô phỏng những món vũ khí, trang bị trong quá trình sử dụng. Vậy trong game bắn súng, làm thế nào game biết anh em đã bắn trúng đối thủ?

Về cơ bản có hai cách để ghi nhận đường đạn trong game bắn súng, là hitscan và mô phỏng đạn đạo. Hitscan đơn giản hơn, xoay tâm và click chuột đúng lúc vào người đối thủ là game ghi nhận bắn trúng. Còn đối với mô phỏng đạn đạo (projectile ballistic), mỗi phát súng sẽ được CPU trong máy tính hay máy chơi game của anh em tính toán cụ thể tác động từ môi trường, từ hiệu ứng vật lý và những khả năng khác, thậm chí đôi khi là cả trọng lực của mặt đất trước khi xác định xem phát súng đó có trúng mục tiêu hay không.

Hitscan


Những ngày đầu của ngành phát triển game, rất nhiều trò chơi sử dụng một kỹ thuật gọi là raycasting, biến môi trường 2D trở thành bản đồ 2D góc nhìn từ trên xuống. Kỹ thuật này cho phép các nhà làm game xác định vật thể đầu tiên “đường ray” chạm vào, có thể tạm coi như vật thể gần nhất mà góc nhìn của người chơi nhìn thấy trong thế giới ảo. Đến lúc đấy các nhà làm game mới bắt đầu đưa ra câu hỏi, nếu áp dụng raycasting để xác định đường đạn trong game bắn súng thì sao? Với ý tưởng đó, hitscan ra đời.

Tinhte_Game1.gif

Trong hầu hết những game bắn súng sử dụng cơ chế hitscan để mô phỏng đường đạn, engine mô phỏng vật lý của game sẽ làm ba nhiệm vụ chính theo các bước sau:


1. Xác định hướng vũ khí đang nhắm tới
2. Tạo ra một đường ray 2D từ vị trí ngắm đến điểm đích được xác định sẵn, tạm gọi là điểm A đến điểm B
3. Sử dụng raycasting để xác định xem đường ray này có đi qua vật thể trong màn chơi hay không

Tinhte_Game2.png

Sau bước thứ 3, nếu đường đi của viên đạn từ điểm A đến điểm B có đi qua vật thể, engine vật lý sẽ gửi thông báo cho mã nguồn của game rằng viên đạn đã bắn trúng mục tiêu. Khi ấy những dòng code khác sẽ xác định vị trí viên đạn chạm đích như tay, chân, bụng, ngực hay đầu, rồi từ đó xác định sát thương mà phát súng ấy gây ra, từ đó hiển thị chính xác trên màn hình khi chơi game. Về cơ bản Hitscan rất đơn giản dễ hiểu, nhưng chỉ cần vài thay đổi trong thuật toán và cách mỗi món vũ khí hoạt động, nó trở nên đa dạng hơn nhiều. Lấy ví dụ đường raycasting từ vị trí ngắm đến điểm đích đủ xa sẽ hỗ trợ được nhiều thứ như:

1. Một phát súng có thể trúng nhiều mục tiêu trong một đường thẳng, như khẩu railgun trong Quake
2. Xóa điểm đích để tạo ra những món vũ khí laser với tầm bắn rất xa
3. Lập trình những bề mặt phản xạ có thể khiến đạn bị dội ngược lại, như skill phản xạ của Genji trong Overwatch

Tinhte_Game3.gif

Ưu thế của raycasting là vì sự đơn giản của thuật toán, nó được CPU xử lý rất nhanh, không cần vẽ ra thuật toán mới sử dụng bộ nhớ và khả năng tính toán của chip xử lý để mô phỏng viên đạn, vốn là một vật thể cần mô phỏng vật lý độc lập. Nhưng điều này cũng đồng nghĩa với việc, trong những game bắn súng online sử dụng cơ chế hitscan để xác định mục tiêu có bị bắn trúng hay chưa, kỹ sư phát triển netcode cũng không mất quá nhiều thời gian để giữ tất cả client có mặt trong cùng một trận đấu đồng bộ hóa thời gian với nhau. Độ giật của súng thì đơn giản hơn nhiều, cứ tạo ra một đường spray pattern cố định rồi bắt vũ khí vận hành theo code có sẵn là xong.

Chính vì sự đơn giản của nó nên hầu hết những game bắn súng đầu tiên đều dùng kỹ thuật hitscan để mô phỏng đường đạn, như Wolfenstein 3D, Doom chẳng hạn. Nhưng hiện giờ vẫn còn những game sử dụng hitscan để mô phỏng đường đạn như vài nhân vật trong Overwatch (Soldier 76, McCree hay Widowmaker) hay hầu hết các bản Call of Duty.

Quảng cáo



Tinhte_game4.gif Tinhte_Game5.gif Tinhte_Game15.gif

Vì nó quá đơn giản nên cũng tạo ra những yếu điểm về tính chân thực trong mỗi tựa game. Thứ nhất, đường ray khi thực hiện raycasting có tốc độ gần như dương vô cùng, đồng nghĩa với việc bóp cò là đạn đã trúng mục tiêu. Ngoài đời thật đâu có như vậy, khi đạn bay với vận tốc âm thanh hoặc hơn (mỗi loại đạn có tốc độ đạn đạo khác nhau, trên tốc độ âm thanh là super sonic, dưới là sub sonic, cái này xứng đáng có 1 bài viết riêng), rất chậm nếu so với vận tốc ánh sáng khi CPU xử lý raycasting. Ngay cả khi đối thủ đứng ở vị trí rất xa, hitscan chính xác trong tích tắc khiến việc né đạn gần như là không thể xảy ra nếu người chơi ngắm trúng và click chuột đúng thời điểm.

TInhte_Game6.gif

Yếu điểm thứ hai của hitscan về tính chân thực là đường raycasting thường thẳng băng, nghĩa là không thể mô phỏng thêm những hiệu ứng khác tác động lên viên đạn như gió, trọng lực và những yếu tố khác một khi viên đạn rời khỏi nòng súng. Lập trình viên có thể thêm thắt vài dòng code và mô phỏng chuyển động của vũ khí bị giật khi bắn, nhưng một khi đạn ra khỏi nòng, gần như không có cách nào thay đổi đường đi của viên đạn vì bản chất của kỹ thuật hitscan.

Vì thế, khi muốn tạo ra một tựa game bắn súng có phần chân thực, những nhà làm game hiện đại thường lựa chọn cách thứ hai để mô phỏng đường đi của viên đạn.

Mô phỏng đạn đạo (projectile ballistics)


Nghe có vẻ phức tạp và khó hiểu, nhưng kỳ thực ý tưởng của cách mô phỏng đạn đạo trong game rất đơn giản, khi nổ súng, game sẽ tạo ra một viên đạn, coi nó là một vật thể tuân thủ quy tắc vật lý trong môi trường thế giới ảo. Viên đạn đó có trọng lượng, có vận tốc và hitbox riêng, engine của game sẽ phải theo dõi và tính toán vật thể này.

Quảng cáo


Tinhte_Game7.gif

Lợi thế lớn nhất của mô phỏng đạn đạo là sự chân thực, vốn được rất nhiều game đề cao. Vì mỗi viên đạn tồn tại độc lập, các nhà làm game khi ấy có thể thêm vào những thông số riêng ảnh hưởng đến đường đi của nó, như gió, ma sát không khí, trọng lực, nhiệt độ, tất cả những thông số ảnh hưởng đến viên đạn thật ở ngoài đời khi nó được bắn đi. Cũng nhờ việc có thể thay đổi quy tắc vật lý trong thế giới ảo, nên người chơi lúc này có thể dùng những món trang bị khác như lựu đạn hay súng cối phóng tên lửa.

Với hệ thống mô phỏng đạn đạo, viên đạn sẽ không di chuyển với vận tốc ánh sáng như hitscan, nên các nhà phát triển cũng có thể mô phỏng những tính năng rất hay như:

1. Bullet-time làm chậm thời gian như trong Max Payne, Sniper Elite hay Superhot
2. Ghi nhận thời gian một viên đạn di chuyển, ví dụ như trong Battlefield, hạ gục mục tiêu từ xa còn phải cân nhắc cả yếu tố trọng lực để ngắm lên cao hơn so với mục tiêu, hay trong Sniper Elite còn phải tính cả gió nữa.
3. Những món trang bị như lựu đạn có thể tính giờ kích nổ

Tinhte_Game8.gif Tinhte_Game9.gif Tinhte_Game10.gif

Projectile ballistics phức tạp hơn nhiều so với hitscan, nên máy tính và máy chủ cũng phải làm việc nhiều hơn. CPU sẽ phải tính toán cả những yếu tố tác động lên viên đạn, còn máy chủ của game online thì phải xử lý để tất cả người chơi cùng đồng bộ hóa thời gian với nhau, tất cả những bất đồng về logic của thuật toán sẽ phải được xử lý để không tạo ra sai khác trong quá trình hàng chục người chơi trong cùng một máy chủ.

Có vài cách để tối ưu khả năng xử lý projectile ballistics, qua đó cho phép game xử lý những pha đấu súng hiệu quả nhất, thậm chí chân thực tới mức cả hai tay súng đều bị hạ gục từ đạn của nhau thay vì một bên ngừng bắn sau khi game xác định nhân vật đã hết máu. Nhưng mô phỏng ngần ấy viên đạn sẽ rất tốn tài nguyên xử lý. Một cách đơn giản khi tối ưu engine game là tạo ra một ổ dữ liệu con, tải trước khi bắt đầu chơi để mô phỏng từng loại đạn có trong game. Một khi viên đạn chạm mục tiêu (đối thủ hoặc bắn vào tường), ổ dữ liệu này sẽ ngừng theo dõi và mô phỏng đường đi của viên đạn đó, tiết kiệm tài nguyên xử lý cho viên đạn kế tiếp, về cơ bản là nó biến mất, không còn giá trị sử dụng trong màn chơi nữa.

Đến lúc này, khái niệm “tick” được vận dụng vào game. Lấy ví dụ máy chủ Call of Duty vận hành ở tốc độ 20 tick, máy chủ CS:GO matchmaking là 64 tick, Valorant là 128 tick một giây, mỗi tick ghi nhận 1 chuyển động của nhân vật và đường đạn khi chơi game. Dĩ nhiên thông số tick càng cao thì máy chủ ghi nhận được nhiều chuyển động và thay đổi, từ đó mô tả thế giới ảo chính xác hơn.

- Tick được đo độc lập với thuật toán render đồ họa game, đồng nghĩa với việc khi chơi game bắn súng, những pha đấu sẽ được mô tả chính xác hơn vì vật thể được đo độc lập với tốc độ truyền hình ảnh từ máy tính lên màn hình. Tick càng cao, thì thuật toán càng phức tạp vì phải đo được độ trễ từ khung hình đã render trước đó là bao nhiêu mili giây.
- Mỗi khung hình của game cũng được đo đạc thông số tick, áp dụng thuật toán vật lý cho từng khung hình. Nếu anh em bật chế độ khóa khung hình hoặc máy tính không tải nổi game nặng, thuật toán sẽ sai lệch dẫn đến khựng giật khi bắn súng.


Đấy cũng là lúc những lỗi của game diễn ra khi anh em tưởng rằng mình đã bắn trúng địch rồi nhưng vì tốc độ khung hình và tốc độ tick sai lệch dẫn đến việc máy chủ ghi nhận anh em bắn trượt. Cái này ai chơi CS:GO chắc cũng gặp vài lần.

Tinhte_Game11.gif

Nghe phức tạp như vậy, anh em có thể nghĩ projectile ballistics là một khái niệm mới chỉ tồn tại trong vòng khoảng hơn 2 chục năm gần đây đối với các nhà phát triển game. Kỳ thực không phải như vậy, vì ý tưởng mô phỏng đạn đạo thậm chí còn tồn tại trước cả hitscan nữa cơ! Những game bắn súng góc nhìn từ trên cao đầu tiên như Asteroids, Space Invaders hay Galaxian đều mô phỏng được đường đạn bay tà tà đến mục tiêu, mà đó đều là những trò chơi xuất hiện từ những năm 70 của thế kỷ trước, rất lâu rồi!

Hệ thống hybrid


Vậy có cách nào mô phỏng đường đạn trong game bắn súng theo cả hai cách kể trên không? Câu trả lời là có. Tuyệt đại đa số những game bắn súng hiện giờ đều hỗ trợ mô phỏng đường đạn theo cả hai cách mà mình đã đề cập ở trên, như Halo, GTA, Half-Life, mỗi món vũ khí lại vận hành theo cách riêng. Lấy ví dụ trong Halo, khẩu Assault Rifle sử dụng hitscan, còn khẩu Needler phải mô phỏng đạn đạo:

Tinhte_Game12.gif Tinhte_Game13.gif

Các nhà phát triển game cũng có thể pha trộn cả hai kỹ thuật mô phỏng đường đạn để giảm thiểu khuyết điểm của mỗi kỹ thuật, từ đó tạo ra trải nghiệm chân thực hơn trong game. Ví dụ để tránh tình trạng ngắm trúng nhưng bắn trượt vì lệch tick, mỗi viên đạn được mô phỏng projectile ballistics sẽ tự vẽ đường ray để thực hiện kỹ thuật hitscan mỗi tick, thậm chí cách này còn có thể tính toán được nếu hai viên đạn va chạm vào nhau trong quá trình bay nữa cơ.

Cũng với hệ thống hybrid, nhiều tính năng hay ho trong game cũng được tạo ra. Một ví dụ đáng đè cập chính là Sniper Elite. Sau khi bóp cò súng, engine game dùng hitscan để xác định xem liệu rằng nó có trúng đích hay không. Nếu trúng, hiệu ứng làm chậm thời gian được anh em rất thích sẽ dược kích hoạt.

Tinhte_Game14.gif

Với những gì làm được, chắc chắn cả hai cách mô phỏng đường đạn này sẽ còn được áp dụng trong thời gian dài sau này, nhưng cùng lúc các hãng game cũng sẽ tạo ra được những cải tiến nho nhỏ trong từng kỹ thuật để khiến game trở nên chân thực hơn, ví dụ như tăng thông số tick mỗi giây khi CPU càng lúc càng khỏe để ghi nhận đường đạn chính xác hơn chẳng hạn.

63 bình luận
Chia sẻ

Xu hướng

Hay thật. Nhỏ mê game bắn súng. Lớn mê game xếp hình nên giờ ko để ý mấy cái phức tạp này. Mà đọc vẫn thấy hay 😁
@Edward Đỗ Mình vẫn mê game bắn súng. Chỉ là đổi súng thôi.
@copthuy Chỉ duy nhất 1 loại súng, mà bắn xong nạp đạn hơi lâu.
@Edward Đỗ Mình lại thích vừa xêó vừa bắn. Hay lắm
@Newkhoavu Tetris, Bejeweled =)))
Phát-NDP
ĐẠI BÀNG
4 năm
Cảm ơn anh vì kiến thức thú vị này. Giờ mình đã hiểu tại sao lúc nhỏ chơi CF toàn thua mà chơi CS thì nguy cơ thắng nhiều hơn ha ha.
Các cụ nhà tôi thấy máy bay đằng Đông các cụ bắn đằng Tây . Thế mà máy bay vẫn ... rụng . Chả hiểu đạn đạo của các cụ kiểu gì .
@minhthuvc Nó tương tự như khi bạn đứng trên lầu 3 cầm 1 trái bóng, muốn thả trúng 1 chiếc xe hơi đang di chuyển phía dưới.
Đầu tiên bạn phải tính toán sức gió, độ cao, trọng lượng và tốc độ rơi của trái bóng rồi tốc độ chiếc xe, nhưng đòi hỏi bạn phải tính toán trong 1 thời gian rất ngắn (vì nếu tính chậm, chiếc xe chạy qua là bạn thua)
Khi tính xong rồi bạn bắt đầu thả, có khi bạn phải thả trước cách chiếc xe 10m.
Thực hành thử đi rồi bạn mới thấy điều này là hợp lý và skill của các cụ thuộc hàng siêu đẳng chứ không phải vừa.
chứ bạn tưởng viên đạn bay thẳng tốc độ ánh sáng đến mục tiêu à
Đờ Phắc
ĐẠI BÀNG
4 năm
@meohoangdochanh Nếu mình nhớ không nhầm thì 1 số game như PUBG cũng áp dụng kĩ thuật kiểu này, đặc biệt là khi phải bắn mấy cái xe ô tô đang chạy. Mà công nhận là các cụ ngày xưa giỏi thật, kĩ thuật kiểu này mình thấy khó lắm do mình không giỏi ước lượng hay tính toán.
@Đờ Phắc Hệ thống phòng không của VN thời chiến tranh được bố trí thành nhiều tầng nhiều lớp, cao nhất có máy bay Mig, kế đó là tên lửa Sam, thấp hơn thì đến pháo cao xạ, thấp hơn nữa các loại súng phòng không cỡ nòng nhỏ hơn như 14ly5, 12ly7, còn lại tầng thấp nhất là các loại súng bộ binh --> tạo thành lưới lửa nhiều tầng nhiều lớp, nên hiệu suất bắn rơi máy bay ở chiến tranh VN được xem là cao nhất thế giới đến giờ. Như câu chuyện của các bác nông dân bắn rơi máy bay Mỹ là do mấy ông F111 (Cánh cụp cánh xòe - loại máy bay chiến đấu nhanh nhất, hiện đại nhất lúc đó của Mỹ) mỗi lần bay vào miền Bắc VN đánh phá thường bay độ cao rất thấp, để tránh ra đa, và cứ bay ra bay vào cùng 1 đường bay, cùng 1 giờ, 1 quy luật như vậy nên mới bị VN tổ chức trận địa, đón lõng. Các bác nông dân cứ dùng súng trường mai phục thôi. Khi máy bay bay vào, thậm chí còn chưa thấy máy bay đã phải bắn rồi...cứ nghe đằng trước bắn là đằng sau đã bắn, vì vậy mới diệt được máy bay Mỹ bằng súng trường. Câu chuyện đại loại là như vậy ^^
Đờ Phắc
ĐẠI BÀNG
4 năm
@meohoangdochanh À, ra là vậy. Giờ mình mới biết. Cảm ơn bạn nhiều nha <3
neoquang
ĐẠI BÀNG
4 năm
Đột kích 1 thời. Lên hạng 3 sao rồi mà phải bỏ để lo cs
vvminhdung
ĐẠI BÀNG
4 năm
@neoquang Game kĩ năng mà thành ra lấy tiền đè người, bỏ là đúng
@neoquang Cái game mới đầu cũng hay sau lấy tiền đè người cộng thêm được đội ngũ 69.96 % là trẻ trâu óc tó nên nó nát rồi bác.
lolzland
ĐẠI BÀNG
4 năm
@neoquang Mình là 1 trong 10 người lên tá đầu tiên trong CF. Sau này game nát quá nên dẹp..
Việc con người tạo ra game đã là phức tạp.

Việc Thượng Đế/trí thông mình cao tạo ra và vận hành sự sống trên Trái Đất quả là kỳ diệu!
aka KiCHiK
ĐẠI BÀNG
4 năm
@cheetah_fast THƯỢNG ĐẾ GÌ Ở ĐÂY?
cảm ơn bác dã chia sẻ kiến thức này nhá
faraway93
TÍCH CỰC
4 năm
Wow. Mình không nghĩ là phức tạp đến vậy. Xưa giờ chơi cũng không nghĩ gì luôn. Mỗi game có 1 kiểu bắn khác nhau. Hóa ra phụ thuộc thằng này 😆
Jinnie KTL
TÍCH CỰC
4 năm
Ôi cao siêu quá
Phải nói là cực kì phức tạp á nhỉ!!!
Chỉ thích bắn half life trên pc lúc nhỏ
Mỗi game 1 kiểu =]]
zfxahlr2a3711.png
@gunnyonline Có thằng bắn được đạn từ ống nhòm kia thì đúng chịu. 😆
@maithang215 Haha, có lẽ ý là điểm ngắm trúng mục tiêu là tính đã trúng đạn.
Khiem Lee
ĐẠI BÀNG
4 năm
@gunnyonline Ảnh này cà khịa game, hay nội dung châm bím nghành game vậy bác
Chứ em thấy PUBG là cái đường đạn đầu tiên
BenGlo
CAO CẤP
4 năm
@gunnyonline Thế game nào đường đạn bắn ngược ấy nhể? 🤣
@BenGlo Thì CSGO 😆 ngắm ở bụng nhưng đạn giật vào đầu. Các game kia là tâm ở đâu là đạn từ đấy bay ra, còn em CSGO là tâm 1 nơi, đạn bay ra 1 nẻo
Hungtvvt
TÍCH CỰC
4 năm
Thật là hư cấu
kiến thức thú vị đó
Đó là cả 1 công nghệ 😃
Eazy
TÍCH CỰC
4 năm
1 shot 3,315m


@daugauhp911 Hơi cũ một tí nhưng mà vẫn còn nhiều người chưa biết mà hihi
@P.W 0 sao. U vẫn là 1 trong số ít các mod mà me thích ở tt
Chỉ cần làm cho cái chấm trên ống nhắm trúng vào đối phương và click là ăn kẹo
lại nhớ hồi học VTC academy nghe con squad của BTC game fail vì code mãi đg đạn không chính xác nổi 😆
CuongLam02
TÍCH CỰC
4 năm
Còn trong World of tanks thì nó còn tính toán cả loại đạn nổ mạnh, bán kính sát thương.... quĩ đạo đạn bay của các SPG. Đâm hút nhau các kiểu. Có khi bắn 1 em mà đạn dội trúng em kế bên chết luôn. Kkkk
@CuongLam02 Chuẩn luôn, game đó cơ chế toán học đanj đạo cực kỳ phức tạp, và game nó hay ở chỗ đó, chán cái là h cũng pay to ưin
CuongLam02
TÍCH CỰC
4 năm
@Minh Đạo FPT Ko phải lúc nào cũng pay to win đâu. Do skill bắn thôi. Mà cày lâu ms lên exp để nghiên cứu tăng - súng. Mà ức chế skill nhận biết xe bị địch phát hiện lâu lắm mới lên được dù full súng engine xích. Mà lâu lâu cũng nạp gold để ủng hộ nhà phát triển. 😃

Xu hướng

Bài mới









  • Chịu trách nhiệm nội dung: Trần Mạnh Hiệp
  • © 2024 Công ty Cổ phần MXH Tinh Tế
  • Địa chỉ: Số 70 Bà Huyện Thanh Quan, P. Võ Thị Sáu, Quận 3, TPHCM
  • Số điện thoại: 02822460095
  • MST: 0313255119
  • Giấy phép thiết lập MXH số 11/GP-BTTTT, Ký ngày: 08/01/2019