Tôi đang sử dụng Bullet và đang cố gắng tạo ra một thuật toán va chạm tạo ra các điểm tiếp xúc ngoài địa hình dựa trên khối lập phương cùng với phản ứng va chạm thích hợp. Tôi cũng có kế hoạch mở rộng điều này để bao gồm cả các hình dạng không phải hộp, tuy nhiên điều đó không quan trọng vào lúc này. Tôi đã thấy rằng việc sử dụng lưới tam giác là quá nhiều RAM cho các bản đồ lớn.
Tôi đã thử quy trình do Byte56 vạch ra ở đây , tuy nhiên, tôi có một số câu hỏi liên quan đến việc thực hiện điều này với Bullet:
- Làm thế nào để bạn tạo ra một hình dạng va chạm cho thế giới? Bạn có sử dụng một hình dạng tùy chỉnh? Bạn đặt
m_shapeType
gì trên đó? - Hay bạn vẫn sử dụng một hộp hình dạng kích thước của thế giới?
- Làm thế nào để bạn đảm bảo rằng các điểm liên lạc được giải phóng?
- Làm thế nào chính xác để bạn sửa đổi
processCollision
?
Những điều tôi đã làm:
- Tôi đã tạo một địa hìnhSht
that extends
btBoxShape, the only difference being that
m_shapeType = CUSTOM_CONVEX_SHAPE_TYPE`, để tôi có thể đăng ký thuật toán va chạm mới với bộ điều phối cho các đối tượng chỉ có hình dạng này. - Tôi đã mở rộng
btRigidBody
lớp theo cách tương tự như Byte56 trong câu hỏi của anh ấy (xem liên kết trong đoạn 2), tuy nhiêncheckCollisionWith(CollisionObject * co)
trả về đúng nếu có bất kỳ voxel nào trong AABB củaco
không. Tôi đã mở rộng
btCollisionAlgorithm
lớp học, theo cách tương tựbtCompoundCollisionAlgorithm
, vớiprocessCollision
cách làm như sau:- Kiểm tra các đối tượng va chạm được truyền dưới dạng đối số và xác định đó là địa hình và thực thể nào.
- Xóa các đa tạp bất kỳ thuật toán con.
- Gọi
resultOut->setPersistantManifold(resultOut)
- Tạo hình dạng hộp mới và biến đổi trong AABB bị chiếm đóng bởi thực thể va chạm và sau đó gọi
m_dispatcher->findAlgorithm
. Lưu trữ hình dạng, biến đổi và thuật toán tìm thấy trong cấu trúc Thuật toán con cho mỗi voxel trong AABB. - Lặp lại tất cả các thuật toán con, gọi
proccessCollision
. - Lặp lại tất cả các thuật toán con, loại bỏ bất kỳ thuật toán nào bên ngoài AABB của thực thể va chạm. (gọi
~btCollisionAlgorithm()
rồim_dispatcher->freeCollisionAlgorithm()
) - Gọi
resultOut->refreshContactPoints()
.
Những gì hoạt động: processCollision
được gọi bất cứ khi nào AABB của người chơi giao nhau với các voxels không không khí.
Điều gì không xảy ra: phản ứng va chạm chỉ đơn giản là kỳ lạ ... Thực thể người chơi bắt đầu bay lên. Nếu nó đi vào một cái gì đó, nó bật ra dữ dội. Đôi khi, nó không thể tiếp tục di chuyển trên một trục sau khi bước vào một cái gì đó. Điều tôi nghi ngờ đang diễn ra là các điểm tiếp xúc không được giải phóng sau phản ứng va chạm, có thể là do thực thể người chơi luôn ở trong AABB của đối tượng thế giới. Tôi tò mò muốn xem liệu tôi có đang sủa đúng cây processCollision
không?