Một đường dẫn sao và các vị trí rời rạc / trơn tru


8

Thuật toán A * (A-star) thường biểu thị một đường dẫn trên lưới.

Tuy nhiên, khi một đường dẫn đã được tìm thấy, đường dẫn trông có vẻ khối và không phù hợp nếu bạn di chuyển các đơn vị của mình bằng các kiểu dữ liệu dấu phẩy động.

Dưới đây là một hình ảnh mô tả vấn đề. Các ô màu trắng đại diện cho đường dẫn được tìm thấy bởi A *. Đường dẫn màu đen là đường dẫn tôi muốn, đường dẫn màu đỏ là đường tôi không có.

đây là bức tranh

Một giải pháp sẽ là chọn một góc khi đường dẫn rẽ và chuyển / giữ bên khi đường dẫn rẽ theo hướng khác. Có vẻ như cách hợp lý và sạch sẽ nhất để làm điều này.


Giải pháp phổ biến là làm mịn đường dẫn, nhưng thường thì giải pháp tốt hơn (dễ hơn / nhanh hơn) là sử dụng thuật toán tìm đường dẫn Any-Angle. Xem ở đây để biết thêm chi tiết.
BlueRaja - Daniel Pflughoeft

Câu trả lời:


4

Như tùy chọn khác, bạn có thể chia đường dẫn thành các phần thẳng. Sau đó, bạn chỉ cần tìm các điểm mà đường dẫn ban đầu của bạn để lại một phần đường dẫn (không cần tính toán, chỉ cần chuyển đổi theo hướng của phần tiếp theo). Chỉ những gì còn lại nó là kết nối các điểm của con đường trơn tru mới của bạn!

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

EDIT: nếu bạn nhấn mạnh vào đường dẫn bạn đã vẽ, chỉ cần so sánh hai khả năng cực đoan trong đó đường dẫn có thể để lại một phần thẳng (= điểm ở một hoặc đầu kia của cạnh) và chọn bất cứ điều gì tạo ra đoạn đường ngắn hơn (định lý pythagoras ).


Đối với chiều rộng anh hùng, nếu bạn nhìn kỹ - con đường nào gần cạnh nhất? Trong kết nối của "gạch" cuối cùng và trước đó. Kiểm tra khoảng cách đường dẫn đến cạnh trong điểm đó (bạn sẽ phải làm toán ngay bây giờ, chuyển đổi không đủ), nếu nó nhỏ hơn độ rộng anh hùng / 2, thêm điểm mới vào đường dẫn ở độ rộng anh hùng / 2 khoảng cách từ cạnh.

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

Xin lỗi về sự không nhất quán hình ảnh, đã xóa nguồn ảnh gốc.


Rất đẹp. Bạn có cách nào đơn giản để xử lý kích cỡ 'anh hùng' không? Tôi tự hỏi nếu xem xét các hành lang có chiều rộng = chiều rộng - bán kính của anh hùng (trong khi giữ cùng tọa độ trung tâm hành lang) sẽ không làm nên chuyện.
GameAlchemist

@GameAlchemist: Vâng, đó là cách thông thường để xử lý nó.
Ilmari Karonen

Thx cho cập nhật của bạn. Vì đó là chiều rộng hành lang = chiều rộng hành lang - chiều rộng anh hùng, nên ở mỗi bên, bạn chỉ nên xem xét (chiều rộng anh hùng / 2), hoặc thậm chí tốt hơn là xem xét bán kính = sqrt (sq (width / 2) + sq (height / 2)), trong trường hợp anh hùng có thể tự do quay đầu. (trong sơ đồ của bạn, các hành lang quá hẹp) (Rq: Tôi giả sử ở đây chúng tôi coi trung tâm của người anh hùng - cách duy nhất để tránh những cơn ác mộng -)
GameAlchemist

@GameAlchemist điểm tốt, nên là chiều rộng / 2. Bán kính là một chút quá mức mặc dù (chỉ cần cao hơn trong hai chiều).
wonderra

Trong thực tế, về bán kính, độ chính xác: nếu một người đang sử dụng các thử nghiệm va chạm Bounding Box được căn chỉnh theo trục, thì 'bán kính' phải là tối đa (chiều rộng / 2, chiều cao / 2). Đối với một người sử dụng các thử nghiệm va chạm vòng tròn Bounding, công thức là một ở trên (được tính một lần cho mỗi lần tạo đối tượng).
GameAlchemist

3

Một tùy chọn để làm mịn đường dẫn là truyền các tia từ vị trí hiện tại đến nút nhìn xa nhất và đến đó. Bạn có thể làm điều đó trong thời gian thực hoặc chỉ cần xây dựng một đường dẫn mới từ con đường bạn đã có, vì vậy thuật toán điều hướng vẫn giữ nguyên.

Bắt đầu từ vị trí hiện tại, truyền tia tới từng nút trong đường dẫn. Khi có một nút không thể đạt được bởi tia, nút trước đó là nút cần tính đến. Xem xét nút cuối cùng, lặp lại quá trình cho đến nút cuối cùng.

Cuối cùng, bạn sẽ có một kết quả tương tự như hình ảnh bên dưới (đường dẫn màu xanh lá cây) tùy thuộc vào độ rộng của tia và các tham số bổ sung mà trò chơi của bạn yêu cầu.

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


Ngoài ra, có bài thuyết trình của Valve về AI được sử dụng trong L4D. Thật đáng để xem nó và lấy ý tưởng từ nó.


đường dẫn màu xanh lá cây của bạn có vẻ không chính xác ... bạn thực hiện chiếu tia từ vị trí đơn vị chứ không phải từ vị trí ô vuông phải không?
jokoon

@jokoon Nó phụ thuộc vào cách bạn áp dụng nó. Tia đầu tiên được truyền từ vị trí đơn vị, sau đó từ nút nhìn xa nhất trừ khi bạn áp dụng nó khi thiết bị đang điều hướng (nhưng sau đó, nó lại bắn từ vị trí của nút nhìn xa nhất). Đường dẫn chỉ là một ví dụ và, như tôi đã nói, nó sẽ phụ thuộc vào độ rộng của tia của bạn và tôi chỉ tránh các góc trong khi vẽ nó.
reefaktor

1

Thuật toán A * hoạt động với các đường dẫn trên biểu đồ . Biểu đồ không phải là một lưới .

Nếu bạn nhìn vào những con đường bạn muốn, chúng sẽ đi qua các góc của các ô vuông. Cụ thể, họ đi qua các góc nơi ba gạch có thể đi bộ và một gạch là một bức tường. Thay vì cho A * một biểu đồ với các tâm gạch, bạn có thể xây dựng một biểu đồ chỉ với các góc "bên ngoài" này, với các cạnh biểu đồ từ góc này sang góc khác (nếu có đường ngắm). Bạn có thể muốn di chuyển các góc một vài pixel ra khỏi các góc để xử lý vấn đề kích thước anh hùng của người hùng.

Nếu bạn xây dựng biểu đồ góc này sang góc khác thay vì biểu đồ lưới, A * sẽ còn nhanh hơn các đường dẫn xử lý sau hoặc sử dụng thuật toán bất kỳ góc nào (Theta *). Tuy nhiên, việc xây dựng biểu đồ cần một chút thời gian (chủ yếu để xử lý đường ngắm), vì vậy nó có thể không phải là một lựa chọn tuyệt vời nếu người chơi có thể thay đổi bản đồ trong khi trò chơi đang chạ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.