Phát hiện va chạm và phản ứng trong Hệ thống thực thể


12

Vui hơn với ES ...

Hiện tại, tôi có một vài hệ thống:

  • Trình kết xuất (Thuộc tính kết xuất, Thuộc tính chuyển đổi)
  • Chuyển động (thuộc tính Movable, thuộc tính Transform, thuộc tính kết xuất [cho các hộp giới hạn, v.v.))
  • Đầu vào (thuộc tính InputReceiver)
  • Vân vân.

Tôi đang thêm phát hiện va chạm. Suy nghĩ đầu tiên của tôi là thêm một hệ thống mới thực hiện va chạm. Tôi có ý nghĩa với việc giữ cho thiết bị này tách biệt khỏi Motionhệ thống vì không phải tất cả những thứ chuyển động hoặc hoạt hình đều nhất thiết phải tham gia phát hiện va chạm - máy ảnh, sương mù, v.v. - nhưng dường như điều đó CollisionMotionphụ thuộc lẫn nhau.

Khi Motiondi chuyển một thực thể, phép biến đổi cần được xác nhận Collisionvà chuyển động bị hủy hoặc điều chỉnh (nảy, dừng tại một bức tường, v.v.).

Một cách khác là tạo một thuộc tính Collidable duy trì tham chiếu đến một đối tượng va chạm - kd-tree, octree, v.v. được chia sẻ giữa các thực thể có thể va chạm với nhau. Các Motionhệ thống sau đó sẽ kiểm tra các thuộc tính đó, và sử dụng nó để kiểm tra hoặc điều chỉnh phong trào.

Từ góc độ mã, đó là một giải pháp chấp nhận được. Tuy nhiên, từ quan điểm kiến ​​trúc ECS, có vẻ như nó đang đẩy logic vào Motionhệ thống không áp dụng cho tất cả các thực thể có Movablethuộc tính.

Tôi cũng có thể lưu trữ một vector chuyển động trong Movablethuộc tính, và có Colliderhệ thống điều chỉnh Transformkhi cần thiết, nhưng điều đó sẽ liên quan đến việc sao chép chức năng giữa MotionCollider, hoặc gọi lại từ Colliderđến Motionvới một số dữ liệu về vị trí va chạm và bề mặt dữ liệu cho thư bị trả lại / phản xạ, vv .

Điều này có thể thuộc nhóm "hack trường hợp đặc biệt" nhưng tôi muốn nhận một số thông tin đầu vào từ những người đã xử lý việc này trước đây mà không tạo ra một tấn mã trường hợp cạnh.

Câu hỏi Một cách tốt để tránh sự kết hợp chặt chẽ giữa các hệ thống chuyển động và va chạm khi dường như chúng đòi hỏi kiến ​​thức về nhau?


1
Câu hỏi là gì?
jcora

@Bane đâu là nơi tốt để đặt logic phát hiện va chạm, giữ cho va chạm + chuyển động càng tách biệt càng tốt và giữ sự phụ thuộc lẫn nhau giữa các hệ thống ở mức tối thiểu. Bài đăng của tôi có một chút
lan man

1
Tuyệt vời, bây giờ đặt điều đó trong câu hỏi của bạn, in đậm . :)
jcora

Câu trả lời:


7

Bạn đang xem xét nó. Trong công cụ của tôi, cũng sử dụng một hệ thống thành phần thực thể, mỗi hệ thống GameObjectcó thể có một con trỏ tới a ModuleCollision.

Điều gì xảy ra khi trò chơi cập nhật:

  • Cảnh cập nhật tất cả các đối tượng nó giữ. Nó gọi Updatehàm cho mỗi GameObject.
  • Bên trong Updatechức năng, mỗi người GameObject chỉ cập nhật tốc độ và hướng chứ không phải vị trí của nó.
  • GameObjecttải lên vị trí hiện tại, tốc độ và hướng của nó ModuleCollision, nếu có sẵn.
  • Cảnh không va chạm kiểm tra trên ModuleCollisioncơ sở.
  • Cảnh gọi UpdatePosthàm trên mỗi GameObject. Nếu đối tượng có mô-đun va chạm, nó sẽ tìm nạp vị trí, tốc độ và hướng cập nhật từ mô-đun va chạm. Vị trí được cập nhật với tốc độ và hướng.
  • Việc GameObjectxây dựng một ma trận 3x3 cuối cùng ra khỏi vị trí và tiêu đề của nó.

Vâng, có một số bản sao của trạng thái, nhưng không sao. Thực hiện xử lý va chạm trên a ModuleCollisionlà cách tốt nhất để xử lý nó, bởi vì nếu không, bạn sẽ phải kiểm tra từng cái GameObjectđể xem nó có ModuleCollisionxử lý hay không.


2
Vì vậy, thay vì lo lắng về vị trí quay lui trong trường hợp va chạm, bạn sẽ tách tốc độ / gia tốc từ dịch thuật, thay đổi những thay đổi dựa trên bất kỳ va chạm nào được phát hiện, và sau đó những thay đổi đó được lan truyền trong bản cập nhật chuyên biệt thứ hai trong cùng một khung? Có vẻ khá sạch sẽ. Cảm ơn.
3Dave

3

Tôi sẽ làm nó như thế này ...

Có ba hệ thống:

  1. Hệ thống chuyển động
  2. Hệ thống tăng tốc
  3. Hệ thống va chạm

Hệ thống chuyển động áp dụng vận tốc cho các vị trí. Hệ thống gia tốc áp dụng lực cho vận tốc. Hệ thống va chạm phát hiện va chạm và áp dụng các lực theo đúng hướng, hoặc, nếu bạn muốn va chạm thô, trực tiếp làm thay đổi vận tốc.

Ví dụ, bạn có thể tính toán góc giữa các va chạm bằng atan2 , và sau đó sử dụng góc đó để áp dụng lực / vận tốc chính xác của các vật thể.

Có hệ thống phát hiện va chạm tin nhắn phát sóng nếu cần quá.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.