Làm cách nào tôi có thể mở rộng btCollisionAlacticm để cho phép va chạm với địa hình voxel?


8

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_shapeTypegì 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 extendsbtBoxShape , the only difference being thatm_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 btRigidBodylớ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ên checkCollisionWith(CollisionObject * co)trả về đúng nếu có bất kỳ voxel nào trong AABB của cokhông.
  • Tôi đã mở rộng btCollisionAlgorithmlớp học, theo cách tương tự btCompoundCollisionAlgorithm, với processCollisioncách làm như sau:

    1. 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.
    2. Xóa các đa tạp bất kỳ thuật toán con.
    3. Gọi resultOut->setPersistantManifold(resultOut)
    4. 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.
    5. Lặp lại tất cả các thuật toán con, gọi proccessCollision.
    6. 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ồi m_dispatcher->freeCollisionAlgorithm())
    7. 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 processCollisionkhông?


Bạn đã sắp xếp cái này chưa? Tôi đang có một vấn đề rất giống nhau.
timoxley

Hơi muộn, xin lỗi, tôi không thấy câu hỏi của bạn. Nếu bạn chưa tìm ra điều này, bạn đã thử bản vẽ gỡ lỗi của cơ thể vật lý của mình chưa? AABB bạn đang sử dụng để phát hiện va chạm không ràng buộc cơ thể vật lý bạn đang sử dụng. Vì vậy, tại thời điểm bạn phát hiện ra vụ va chạm, đối tượng của bạn đã ở xa bên trong nó. Điều này giải thích tại sao các phản ứng va chạm của bạn rất kỳ lạ.
MichaelHouse

1
Xem câu trả lời mới nhất của tôi cho câu hỏi của tôi: gamedev.stackexchange.com/questions/27405/iêu
MichaelHouse

Câu trả lời:


1

Thật không may, tôi không thể nhận được kết quả đáng tin cậy từ phương pháp được mô tả trong câu trả lời mà bạn đang tham khảo . Tương tự như bạn, tôi sẽ nhận được các sự kiện nổi kỳ lạ, hoặc tình huống loại bỏ một voxel sẽ khiến các vật thể nổi trên đầu chúng lơ lửng trong không khí, hoặc làm một chiếc lông dao động kỳ lạ rơi xuống đất. Tôi đã từ bỏ chiến lược đó cho một chiến lược mới.

Tôi bắt đầu tạo các lưới va chạm tùy chỉnh cho từng đoạn địa hình voxel. Tôi làm điều đó với BvhTriangleMeshShape. Điều này hoạt động khá tốt:

nhập mô tả hình ảnh ở đây

Có nhiều chi tiết hơn về việc thực hiện các lưới va chạm tùy chỉnh ở đây .

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.