Đường chéo của tầm nhìn với hai góc


9

Ngay bây giờ tôi đang sử dụng thuật toán dòng của Bresenham cho đường ngắm. Vấn đề là tôi đã tìm thấy một trường hợp cạnh mà người chơi có thể nhìn xuyên tường. Xảy ra khi người chơi nhìn giữa hai góc tường với một khoảng trống ở phía bên kia ở các góc cụ thể.

Dòng trường hợp cạnh nhìn

Kết quả tôi muốn là cho gạch giữa hai bức tường được đánh dấu không hợp lệ như vậy.

Kết quả như ý

Cách nhanh nhất để sửa đổi thuật toán dòng của Bresenham để giải quyết vấn đề này là gì? Nếu không có một giải pháp tốt, liệu có một thuật toán phù hợp hơn? Bất kỳ ý tưởng đều được chào đón. Xin lưu ý giải pháp cũng phải có khả năng hỗ trợ 3d.

Chỉnh sửa: Giải pháp đơn giản của tôi là kiểm tra xem cả hai góc có bị đóng khi tọa độ x và y của một dòng thay đổi hay không. Để biết mã nguồn làm việc và bản demo tương tác của sản phẩm đã hoàn thành, vui lòng xem http://ashblue.github.io/javascript-pathfinding/


2
Liệu nó có làm nên sự khác biệt nếu bạn chuyển điểm bắt đầu và điểm kết thúc? Có lẽ sau đó bạn chỉ có thể chấp nhận kết quả nếu cả hai tính toán trả về một đường ngắm không bị cản trở. Bạn cũng có thể tìm thấy một số bài viết LOS hữu ích tại RogueBasin.
thalador

1
Dù bằng cách nào, hai khối màu đen đó chéo nhau ở 4-5 không được kết nối với một bức tường ở vị trí đầu tiên, và tôi nói điều này bởi vì bạn đang ngầm cho phép chuyển động chéo. Bạn phải vuông góc với đường chéo đó để biến nó thành một bức tường liền kề hoặc làm cho đường đi bộ của bạn vuông góc với các bước di chuyển chéo của nó thay vì đi theo đường chéo hoàn toàn như 2-3 và 4-5.
Patrick Hughes

Lật nó nghe có vẻ là một ý tưởng tốt, nhưng nó không giải quyết được vấn đề. Điều duy nhất tôi có thể nghĩ đến là kiểm tra và xem nếu một trong hai góc trống. Có vẻ đắt tiền mặc dù.
Ash Blue

5
"Có vẻ đắt" không bao giờ là đủ để biện minh cho việc không thử một cái gì đó. "Sẽ là quá đắt" nói chung là, giả sử rằng bạn có thể chứng minh rằng một cái gì đó sẽ quá chậm.
Mokosha

3
Chỉ thay đổi thuật toán cần thiết là nếu cả X và Y đều thay đổi trên cùng một bước thì trước tiên thay đổi X và sau đó thay đổi Y, điều này sẽ loại bỏ hoàn toàn các đường chéo.
Patrick Hughes

Câu trả lời:


7

Eric Lippert đã viết một sê-ri xuất sắc về việc tạo tầm nhìn trong C # với Shadow Casting trên lưới phẳng hình chữ nhật ..

Trong số các vấn đề khác, Eric đã giải quyết các câu hỏi khác nhau phải được trả lời về các yêu cầu về tầm nhìn, đưa ra các kết quả khác nhau và đưa ra các ví dụ về một vài kết quả khác nhau. Một trong những bài viết đề cập sâu sắc đến một tình huống "nhìn quanh góc" xảy ra trong một phiên bản đầu tiên của thuật toán của ông.

Tôi đã điều chỉnh thuật toán của Eric thành một lưới lục giác ở đây và đã sử dụng thành công nó trên các lưới lục giác lớn (> 400 x 700) với bán kính hiển thị rộng (> 60 hình lục giác). Việc triển khai này tính toán và hiển thị chế độ xem trường hoàn chỉnh nhanh nhất mà tôi có thể chớp mắt, bằng cách sử dụng một CPU i7 duy nhất. Điều này chắc chắn là đủ nhanh cho bất kỳ việc sử dụng mà tôi mong đợi để đưa nó vào.

Cập nhật - Đường ngắm với độ cao:
Việc triển khai lưới hex được liên kết với ở trên sẽ tính toán đường ngắm với độ cao, không chỉ là chướng ngại vật. Các ghi chú tài liệu cũng thảo luận về một quyết định bổ sung phải được đưa ra liên quan đến các tính toán độ cao: Chiều cao mục tiêu và chiều cao quan sát viên. Lựa chọn mặc định là làm cho cả hai bằng nhau, tạo ra trường nhìn đối xứng, nhưng mặt đất đối diện và mắt người quan sát có thể được chọn. (Mã này là Nguồn mở theo Giấy phép MIT)


Tôi thực sự đang đào Shadow Casting, nhưng tôi đã gặp phải một vấn đề. Gặp khó khăn khi tìm bất kỳ thông tin nào về việc nhân rộng thuật toán để hoạt động với trục z. Xin lỗi để đề cập đến điều này, nhưng bạn có bất kỳ tài nguyên được đề xuất nào để làm cho nó hoạt động trong 3d không?
Ash Blue

@AshBlue: xem phần phụ lục ở trên
Pieter Geerkens

Tôi đang nhìn vào cơ sở mã của bạn. Nó có những thứ tuyệt vời trong đó, nhưng dường như tôi không tìm thấy thuật toán vẽ đường giống Bresenham thích nghi với các hình lục giác. Bạn có làm điều đó với LOS không?
MLProgrammer-CiM

@EfEs: FieldOfView là đối tượng được trả về; ShadowCastingFov * .cs tạo ra trường nhìn bằng cách đổ bóng. Nếu bạn có câu hỏi cụ thể về mã, những câu hỏi đó có thể được hỏi tốt nhất trong phần Thảo luận của trang web; câu hỏi chung hơn tôi rất vui được trả lời ở đây
Pieter Geerkens

@PieterGeerkens Bạn có thể tìm thấy câu hỏi tại đây gamedev.stackexchange.com/questions/57087/ợi
MLProgrammer-CiM

1

Điều gì sẽ xảy ra nếu tính toán LOS, bạn có một lưới "độ phân giải cao hơn" riêng biệt lấp đầy các khoảng trống góc. Tôi đã suy nghĩ một cái gì đó như thế này:

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

Bên trái là phần khối ban đầu của 4 hình vuông.

Bên phải là phiên bản "độ phân giải cao", vì bạn có thể thấy mỗi hình vuông ban đầu được chia thành các quaters và một trong các góc đã được điền vào. Tôi không chắc chắn thuật toán để tạo ra nó, nhưng nó có thể được tính toán trước từ bản đồ hiện tại.

Điều đó có nghĩa là không gian tọa độ tăng gấp bốn lần nhưng tôi không hình dung đó là một vấn đề hiệu suất quan trọng.


Khá chắc chắn độ phân giải cao hơn sẽ trông giống hệt như bản gốc. Khi chia lưới thành một lưới nhỏ hơn, bạn sẽ có cùng một biểu diễn trực quan, chỉ với một lưới nhỏ hơn. Mỗi ô vuông đơn giản chỉ trở thành 4 ô vuông nhỏ hơn ở cùng một điểm.
MichaelHouse

@ Byte56 Đúng, tôi có nghĩa là logic bổ sung sẽ được áp dụng sau khi chia nó để thêm vào các khối bổ sung cho bản sao đó. Logic để làm điều đó là một bài tập để lại cho người đọc.
Davy8

Bạn có thể dễ dàng tạo lưới độ phân giải cao bằng cách làm mờ bản gốc. Sau đó, xác định ngưỡng của 0.5các ô có độ phân giải cao có được điền hay không. Do đó, việc sử dụng lưới độ phân giải cao cảm thấy khá khó khăn với tôi.
danijar
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.