Vì vậy, tôi đang tạo ra một trò chơi loại pháo, tương tự như Worms với tất cả những thứ thông thường như địa hình có thể phá hủy, v.v ... và trong khi tôi có thể sử dụng va chạm trên mỗi pixel mà không cho tôi các quy tắc va chạm hoặc bất cứ thứ gì tương tự. Chuyển đổi tất cả thành một lưới cũng có nghĩa là tôi có thể sử dụng một thư viện vật lý hiện có, nó sẽ tốt hơn bất cứ thứ gì tôi có thể tự làm.
Tôi đã thấy mọi người đề cập đến việc này bằng cách sử dụng Marching Squares để lấy các đường viền trong bitmap, nhưng tôi không thể tìm thấy bất cứ điều gì đề cập đến cách biến chúng thành lưới (Trừ khi nó đề cập đến lưới 3D với các đường viền xác định các độ cao khác nhau, đó không phải là điều tôi muốn). Hiện tại tôi có thể có được một đường viền Marching Squares cơ bản trông giống như thế này (Trong đó các đường giống như lưới trong nền sẽ là các ô của Marching Squares '):
Điều đó cần phải được nội suy để có được kết quả mượt mà hơn, chính xác hơn nhưng đó là ý tưởng chung. Tôi đã có một vài ý tưởng về cách biến cái này thành một cái lưới, nhưng nhiều trong số chúng không hoạt động trong một số trường hợp nhất định, và cái mà tôi nghĩ sẽ hoạt động hoàn hảo hóa ra rất chậm và tôi thậm chí còn chưa hoàn thành nó chưa! Lý tưởng nhất là tôi muốn bất cứ thứ gì tôi kết thúc bằng cách đủ nhanh để thực hiện mọi khung hình cho các trường hợp như vũ khí bắn nhanh hoặc công cụ đào.
Tôi nghĩ rằng phải có một số loại thuật toán / kỹ thuật hiện có để biến một thứ như thế này thành một lưới, nhưng dường như tôi không thể tìm thấy bất cứ thứ gì. Tôi đã xem xét một số thứ như Delaunay Triangulation, nhưng theo như tôi có thể nói rằng sẽ không xử lý chính xác các hình dạng lõm như ví dụ trên, và cũng sẽ không tính đến các lỗ hổng trên địa hình.
Tôi sẽ xem xét kỹ thuật mà tôi đã đưa ra để so sánh và tôi đoán tôi sẽ xem liệu có ai có ý tưởng tốt hơn không. Trước hết, nội suy các đường đồng mức Marching Squares, tạo các đỉnh từ đầu dòng và nhận các đỉnh nơi các đường cắt ngang các cạnh của ô (Quan trọng). Sau đó, đối với mỗi ô chứa các đỉnh tạo đa giác bằng cách sử dụng 2 đỉnh và một góc ô là đỉnh thứ 3 (Có lẽ là góc gần nhất).
Làm điều này cho mỗi ô và tôi nghĩ bạn nên có một lưới biểu thị chính xác bitmap gốc (Mặc dù sẽ chỉ có các đa giác ở các cạnh của bitmap, và các vùng lớn ở giữa sẽ trống). Vấn đề duy nhất với nó là nó liên quan đến việc lướt qua từng pixel một lần cho Marching Squares ban đầu, sau đó lặp qua mọi ô (chiều cao hình ảnh + 1 x chiều rộng hình ảnh + 1) ít nhất hai lần, kết quả là rất chậm đối với bất kỳ kích thước nào hình ảnh ...