2011-09-23 34 views
9

Tôi đang làm việc trên bản trình diễn trò chơi 2D (xem từ trên) tương đối nhỏ, sử dụng OpenGL cho đồ họa của tôi. Nó sẽ cho một góc dựa trên tàng hình cơ bản, và như vậy với tất cả kẻ thù của tôi, tôi vẽ một vòng cung để người chơi biết họ đang tìm kiếm ở đâu.OpenGL- Phương pháp cắt/bẻ khóa 2D đơn giản?

Một trong những vấn đề của tôi cho đến nay là khi tôi vẽ cảnh hồ quang này (như là một đa giác đầy) một cách tự nhiên cho thấy thông qua bất kỳ bức tường trên màn hình kể từ khi có gì ngăn cản nó:

http://tinyurl.com/43y4o5z

tôi m tò mò làm thế nào tôi có thể tốt nhất có thể ngăn chặn một cái gì đó như thế này. Tôi đã có mã tại chỗ sẽ cho phép tôi phát hiện đường giao nhau với tường và vân vân (để phát hiện cảnh kẻ thù), và về mặt lý thuyết tôi có thể sử dụng điều này để phát hiện trường hợp đó và vẽ đa giác cho phù hợp, nhưng điều này có khả năng khá khó sử dụng và/hoặc không hiệu quả, vì vậy tôi đoán nếu có bất kỳ hệ thống OpenGL tích hợp nào có thể làm điều này cho tôi thì có lẽ nó sẽ làm tốt hơn nhiều.

Tôi đã thử tìm kiếm các câu hỏi về các chủ đề như cắt/tắc nhưng tôi thậm chí không chắc chắn nếu đây là chính xác những gì tôi nên tìm kiếm; kỹ năng OpenGL của tôi bị giới hạn. Có vẻ như bất cứ điều gì sử dụng, nói rằng, glClipPlanes hoặc glScissor sẽ không phù hợp với điều này do số lượng lớn các bức tường cá nhân và như vậy.

Cuối cùng, đây chỉ là một bản demo tôi đang làm trong thời gian rảnh rỗi của mình, vì vậy đồ họa không chính xác là nỗi lo chính của tôi. Nếu có một cách (không hợp lý) không đau để làm điều này thì tôi hy vọng ai đó có thể chỉ cho tôi đi đúng hướng; nếu không có cách nào đơn giản thì tôi có thể bỏ qua vấn đề ngay bây giờ hoặc tìm cách giải quyết khác.

+0

Tôi thực sự đang tìm kiếm thứ gì đó tương tự, để xử lý bóng trong trò chơi xếp hình từ trên xuống. Nghi ngờ của tôi cho đến nay đã được dọc theo dòng raycasting (chậm nhưng hoàn hảo) và tạo ra một mặt nạ từ các occluders và một số loại cơ khí esque lập bản đồ bóng. – ssube

+0

Bạn đã cân nhắc sử dụng đèn chiếu sáng OpenGL chưa? Nó có thể có nghĩa là một chút công việc, nhưng một vị trí ánh sáng thích hợp có thể cho hiệu quả mong muốn. – Keith

+0

@Keith: Cảm ơn, đó có thể là một ý tưởng hay. Kinh nghiệm của tôi với ánh sáng cũng bị hạn chế, và tôi có lẽ sẽ cần phải thực hiện một số điều chỉnh để vẽ mã của tôi để làm cho nó tất cả các công việc. Nhưng tôi sẽ ghi nhớ điều đó nếu không có gì tốt hơn. – Linkage

Trả lời

4

Đây thực chất là vấn đề về bóng. Đây là cách tôi muốn đi về nó:

Đối với mỗi điểm xung quanh cạnh cung, theo dõi một tia (2D) từ kẻ thù về phía điểm, tìm giao lộ với các ô màu xanh lục. Nếu các hộp màu xanh lá cây sẽ luôn luôn được căn chỉnh theo trục, toán sẽ dễ dàng hơn nhiều (tìm giao điểm Ray-AABB). Hiển thị các điểm giao nhau với tư cách là một quạt hình tam giác sẽ cung cấp cho bạn vòng cung của bạn.

Khi bạn đề cập rằng bạn đã có mã giao cắt đường thẳng, thì miễn là nó sẽ cho bạn biết khoảng cách từ kẻ địch đến tường, bạn sẽ có thể sử dụng nó cho vòng cung. Đừng tự động giả sử nó sẽ quá chậm - chúng tôi không chạy trên 486 nữa. Bạn luôn có thể giảm số điểm xung quanh mép vòng cung để tăng tốc độ.

+0

Điều này nghe có vẻ khá tốt, mặc dù tôi vẫn còn hơi lo ngại về tốc độ. Ý tôi là, giả sử tôi có tối đa 10 kẻ thù trong một bản đồ, nói ít nhất 30 arc-điểm cho mỗi kẻ thù, và nói 25 bức tường ... đó là 10 * 30 * 25 giao lộ-kiểm tra cho một khung, có vẻ như rất nhiều bộ vi xử lý làm việc cho một hiệu ứng tương đối đơn giản. Bất kể đó là một câu trả lời hay và tôi có thể sẽ thử ngay. – Linkage

+2

Đừng quên [chỉ mục không gian] (http://en.wikipedia.org/wiki/Spatial_database#Spatial_Index) để giảm số lượng tường bạn phải kiểm tra giao lộ. – genpfault

+0

@genpfault vâng, hoàn toàn. – geofftnz

4

Xử lý tắc nghẽn tích hợp của OpenGL được thiết kế cho nhiệm vụ 3D và tôi không thể nghĩ ra một cách đơn giản để lắp đặt nó để đạt được hiệu quả bạn đang làm. Nếu đó là tôi, cách tôi sẽ giải quyết điều này là sử dụng một chương trình đổ bóng, nhưng hãy cảnh báo rằng điều này chắc chắn không rơi vào "một cách hợp lý không đau đớn để làm điều này". Tóm lại, trước tiên bạn vẽ một "bản đồ tắc" nhị phân màu đen, nơi có các bức tường và màu trắng. Sau đó, bạn hiển thị "xem arc" giống như bạn hiện đang thực hiện với một chương trình phân đoạn được thiết kế để tìm kiếm từ trình xem đối với vị trí mục tiêu, tìm kiếm một dấu trừ (pixel đen). Nếu nó tìm thấy một occluder, sau đó nó ám rằng điểm ảnh của "xem arc" là 100% trong suốt. Nhìn chung, mặc dù, đây là một giải pháp "đúng" tôi chắc chắn sẽ nói rằng đây là một tính năng phức tạp và bạn có vẻ ổn mà không cần thực hiện nó.

+1

Đó sẽ là * đắt tiền *, nhưng nó có thể hoạt động. Vẽ chúng như minh bạch có thể chậm hơn so với sử dụng các loại bỏ được xây dựng trong, mặc dù. – ssube

+0

Hoàn toàn là một ý tưởng hay và một ý tưởng thú vị sẽ hoạt động với các tính năng cấp pixel. Sẽ có một lượng tải công bằng trên GPU, nhưng nếu tầm nhìn bao phủ một phần tương đối nhỏ của màn hình thì sẽ ổn thôi. – geofftnz

4

Tôi tính nếu có bất kỳ hệ thống OpenGL tích hợp nào có thể thực hiện việc này đối với tôi, điều đó có thể sẽ tốt hơn nhiều.

OpenGL là API vẽ, không phải là thư viện xử lý hình.

Thực tế phương pháp kiểm tra giao lộ của bạn là đúng cách để thực hiện. Tuy nhiên để tăng tốc nó, bạn nên sử dụng một cấu trúc phân khu không gian. Trong trường hợp của bạn, bạn có một cái gì đó đang khóc cho một phân vùng không gian nhị phân nhị phân. Cây BSP có thuộc tính đẹp, rằng độ phức tạp của việc tìm điểm giao nhau của một đường có tường là trung bình khoảng O (log n) và trường hợp xấu nhất là O (n log n) hoặc nói cách khác, BSP tress là rất hiệu quả. Xem Câu hỏi thường gặp về BSP để biết chi tiết http://www.opengl.org//resources/code/samples/bspfaq/index.html

+0

Không bao giờ nhìn vào cây BSP bản thân mình trước đây, nhưng nhìn qua nó bây giờ có vẻ rất hữu ích thực sự. Tôi có lẽ sẽ cố gắng thực hiện nó nếu tôi kết thúc làm việc với đề nghị trước đó của geofftnz (hoặc nếu tôi tìm thấy hệ thống va chạm của tôi thiếu sau này). – Linkage

Các vấn đề liên quan