Làm cách nào tôi có thể chuyển đổi một bitmap 2D (Được sử dụng cho địa hình) thành lưới đa giác 2D để va chạm?


7

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 '):

Kết quả bình phương

Đ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).

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

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 ...


1
"điều đó không mang lại cho tôi quy tắc va chạm hay bất cứ điều gì tương tự." Nói ai? Bạn có thể kiểm tra các pixel gần đó và tạo ra xung đột bình thường. Trong thực tế, bạn có thể sử dụng các hình khối diễu hành theo yêu cầu để làm chính xác điều này. Không cần lưới; bạn chỉ cần một bình thường, phải không?
Nicol Bolas

Ồ vâng, tôi đã thực hiện một cái gì đó tương tự thực sự, nhưng nó không tuyệt vời. Tôi có nghĩa là nó hoạt động khá tốt, nhưng chắc chắn không hoàn hảo. Sử dụng Marching Squares trên một khu vực nhỏ xung quanh điểm va chạm có lẽ là một giải pháp tốt hơn một chút so với trước đây của tôi, nhưng tôi vẫn có thể thấy vấn đề với nó. Ví dụ, một khu vực mẫu quá nhỏ sẽ tạo ra một thông thường không chính xác vì bạn bỏ qua chi tiết, trong khi diện tích quá lớn có nghĩa là bạn có thể phải lấy trung bình góc của các cạnh bạn nhận được (một lần nữa có thể không chính xác).
Megadanxzero

Và tất nhiên, đó là bỏ qua thực tế rằng sau đó tôi vẫn phải tạo ra vật lý của riêng mình, thứ có lẽ sẽ không tốt lắm, thay vì chỉ sử dụng một động cơ vật lý mạnh mẽ hiện có. Tôi không biết bất kỳ công cụ vật lý nào cho phép bạn ghi đè phát hiện va chạm bằng công cụ mỗi pixel của riêng bạn và sau đó chỉ cho nó va chạm bình thường để phản ứng. Có thể là một cái gì đó như thế tồn tại mặc dù.
Megadanxzero

Làm thế nào chính xác của một bình thường bạn cần? Bạn đang thực hiện một trò chơi theo phong cách Trái đất / Giun. Tôi nghĩ rằng các cầu thủ của bạn sẽ tha thứ cho bạn nếu độ nảy không hoàn hảo. Ý tôi là, bạn có nghĩ rằng Trái đất cũ của DOS đã được xây dựng các mắt lưới có độ chính xác cao không? Bạn có nghĩ rằng ngay cả các trò chơi Worms hiện đại cũng phải trải qua rất nhiều nỗ lực để tính toán công cụ này không?
Nicol Bolas

1
Phần "vật lý" của một hệ thống vật lý ( đặc biệt là 2D) là phần dễ nhất. Đó là phần "va chạm" thật khó.
Nicol Bolas

Câu trả lời:


2

Tôi chưa từng làm việc với các động cơ vật lý 2D trước đây, tôi không chắc chính xác lưới trông như thế nào.

Nếu nó chỉ đơn giản là một tập hợp các hình tam giác 2D, thì bạn nên xem xét các phương pháp tam giác. Ví dụ, tam giác Delauney bị hạn chế .

Tam giác Delaunay tối đa hóa góc tối thiểu của tất cả các góc của tam giác trong tam giác; họ có xu hướng tránh những hình tam giác gầy.

Đó là một điều tốt khi nói đến việc hiển thị các hình tam giác này ít nhất, và có thể hoặc không tốt cho việc phát hiện va chạm.

Một tam giác Delauny bị ràng buộc kết hợp các cạnh cố định, đó sẽ là các cạnh được phát hiện của bạn. Thư viện này có thể cung cấp những gì bạn cần


Aha, tôi đã không nghe nói về Triangulation Delaunay bị ràng buộc , có vẻ như đó có thể là chính xác những gì tôi cần, tôi chắc chắn sẽ phải xem xét nó. Cảm ơn!
Megadanxzero
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.