3 điểm bởi GN⁺ 2024-05-25 | 1 bình luận | Chia sẻ qua WhatsApp

Giải quyết va chạm vật thể cứng 2D

Định nghĩa vấn đề

  • Từ việc Mario giẫm lên mây cho đến hai chiếc xe đâm nhau trong game đua xe, xử lý va chạm là một phần rất quan trọng trong hầu hết các trò chơi điện tử.
  • Loạt bài blog này sẽ đề cập đến toán học và vật lý thực tế của mô phỏng vật lý.
  • Trò chơi điện tử là một cách rất tốt để đặt các khái niệm này vào ngữ cảnh và làm chúng bớt trừu tượng hơn.

Đôi lời về toán học

  • Bài viết này có khá nhiều toán học, nhưng tác giả khuyên bạn đừng e ngại điều đó.
  • Ký hiệu toán học có thể trông phức tạp, nhưng phần lớn chỉ là các phép tính số học đơn giản.
  • Tác giả khuyến khích bạn đừng sợ toán và hãy thử thách bản thân.

Trước khi bắt đầu

Vật thể cứng

  • Vật lý vật thể cứng là mô phỏng vật lý xử lý các vật thể không bị biến dạng.
  • Trên thực tế, mọi vật thể đều biến dạng ở cấp độ phân tử, nhưng trong mô phỏng, điều này được đơn giản hóa và xử lý như vật thể cứng.

Phát hiện va chạm và giải quyết va chạm

  • Phát hiện va chạm là quá trình kiểm tra xem những vật thể nào trong cảnh đang va chạm với nhau.
  • Giải quyết va chạm là quá trình quyết định các vật thể đã va chạm nên chuyển động như thế nào.
  • Loạt bài blog này sẽ tập trung vào giai đoạn giải quyết va chạm.

Chúng ta đang cố làm gì?

  • Hầu hết các trò chơi đều chạy bên trong một vòng lặp lớn.
  • Ở mỗi lần lặp của vòng lặp game, vị trí của vật thể được cập nhật theo vận tốc hiện tại.
  • Vận tốc là một vector có độ lớn và hướng.

Vận tốc

  • Vận tốc biểu thị sự thay đổi vị trí của vật thể trong một khoảng thời gian nhất định.
  • Vị trí mới của vật thể được tính bằng cách cộng thêm độ dời, tức là vận tốc hiện tại nhân với khoảng thời gian.

Giải quyết va chạm

  • Mục tiêu của giải quyết va chạm là thay đổi vận tốc của các vật thể sau va chạm để chúng không còn xuyên qua nhau nữa.
  • Vận tốc sau va chạm có thể được biểu diễn là tổng của vận tốc trước va chạm và độ thay đổi vận tốc do va chạm gây ra.

Va chạm là gì?

  • Để xác định hai vật thể có đang va chạm hay không, cần thỏa mãn hai điều kiện:
    1. Hình học của các vật thể phải tiếp xúc hoặc chồng lấn lên nhau.
    2. Các vật thể vẫn phải đang chuyển động hướng tới va chạm.

Pháp tuyến bề mặt

  • Để di chuyển một vật thể ra xa bề mặt nhiều nhất có thể, cần di chuyển theo hướng vuông góc với bề mặt.
  • Hướng này được gọi là hướng pháp tuyến, tức là hướng vuông góc với bề mặt.

Tích vô hướng

  • Để tính mức độ mà hai vector đang chỉ cùng một hướng, ta dùng tích vô hướng.
  • Tích vô hướng được định nghĩa là tổng các tích của những thành phần tương ứng của hai vector.
  • Thông qua dấu của tích vô hướng, ta có thể biết hai vector đang cùng hướng hay ngược hướng.

Kết luận

  • Va chạm xảy ra khi một điểm của một vật thể tiếp xúc với một điểm của vật thể khác và vận tốc pháp tuyến tương đối là âm.
  • Bài viết tiếp theo sẽ đề cập đến vật lý thực sự của va chạm.

Ý kiến của GN⁺

  • Tầm quan trọng của mô phỏng vật lý: Trong phát triển game, mô phỏng vật lý là yếu tố quan trọng giúp tăng tính chân thực.
  • Vai trò của toán học: Toán học là cốt lõi của mô phỏng vật lý, và hiểu được nó sẽ giúp tạo ra các mô phỏng tốt hơn.
  • Độ phức tạp của giải quyết va chạm: Giải quyết va chạm là một quá trình phức tạp hơn nhiều so với việc chỉ cập nhật vị trí của vật thể.
  • Giá trị giáo dục: Bài viết này rất hữu ích để hiểu các nền tảng cơ bản của mô phỏng vật lý.
  • Học thêm: Tự triển khai một physics engine cũng là một cách học rất tốt. Có thể tham khảo các physics engine mã nguồn mở như Box2D hoặc Chipmunk.

1 bình luận

 
GN⁺ 2024-05-25
Ý kiến trên Hacker News

Tóm tắt các bình luận trên Hacker News

  • Hey everyone, author here!

    • Chào mọi người, tác giả đây!
    • Đây là bài đầu tiên trong loạt blog, hướng tới những người không phải lập trình viên game hoặc có nền tảng toán học chưa vững.
    • Đây là lý do tôi giải thích các khái niệm khá chi tiết.
    • Nếu có câu hỏi, cứ thoải mái nhé.
  • Oh! Look, a well-researched, deeply-explained, and interactive post.

    • Khi thấy tên miền và TLD là ".ski", tôi đã tưởng đây là tác giả từng viết những bài rất hay khác, nhưng hóa ra là người khác.
    • Chất lượng bài viết cũng xuất sắc tương tự.
    • Tôi khá tò mò về bí mật đằng sau TLD ".ski".
  • One side project I am working on right now is a 2d space shooter I am developing with my son.

    • Một dự án phụ tôi đang làm hiện tại là game bắn súng không gian 2D phát triển cùng con trai.
    • Tôi đã thử tự triển khai thay vì dùng game engine, nhưng gặp khó khăn ở bài toán phát hiện va chạm.
    • Cuối cùng tôi quyết định dùng Box2D.
    • Dù có hơn 20 năm kinh nghiệm phát triển và nền tảng toán học, tôi vẫn nhận ra mình đã đánh giá thấp vấn đề này.
  • I always enjoyed the explanation from the N game: N game tutorial

    • Tôi luôn thích phần giải thích của N game: Hướng dẫn N game
    • Vào thời Flash còn thịnh hành, tôi rất thích những giải thích của N game.
  • I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.

    • Tôi đã rất vui khi làm một bản demo TypeScript về chủ đề này, với các quả bóng có thể nảy và va chạm. Tôi học được rất nhiều.
    • Mã nguồn
    • Kết quả/demo
  • This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!

    • Tuyệt vời thật. Nó khiến tôi nhớ đến loạt bài Rigid Body Dynamics của Chris Hecker trên GDMag/Gamasutra mà tôi đã đọc cách đây (nhìn đồng hồ) gần 30 năm!
    • Rigid Body Dynamics của Chris Hecker
  • Collisions are violations of the pairwise non-intersection constraint between bodies.

    • Va chạm là sự vi phạm ràng buộc không giao nhau theo từng cặp giữa các vật thể.
    • Lực va chạm là các nhân tử Lagrange của những ràng buộc này.
    • Pháp tuyến va chạm là đạo hàm riêng của hàm ràng buộc.
  • If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post

    • Nếu muốn tìm hiểu sâu hơn về rigid body dynamics và các ràng buộc, tôi thấy loạt bài blog này rất hữu ích: Bài viết trên blog Toptal
  • To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games

    • Nhắc lại một loạt bài blog cũ nhưng rất đáng đọc có liên quan:
    • Gaffer on Games
  • Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.

    • Có lẽ đây là một màn tự quảng bá không ngại ngùng, nhưng hơn 12 năm trước tôi đã viết một chương trình thú vị bằng three Js vốn ngay cả lúc đó cũng đã rất cũ; nó không hẳn sát phần cứng, nhưng ít trừu tượng hơn nhiều so với các công cụ ngày nay.
    • Busy Boxes