Nhà thủ tục với máy phát điện phòng


74

Tôi đã xem xét một số thuật toán và bài viết về thủ tục tạo ra một hầm ngục. Vấn đề là, tôi đang cố gắng tạo ra một ngôi nhà có phòng và dường như chúng không phù hợp với yêu cầu của tôi.

Đối với một, ngục tối có hành lang, nơi nhà có hội trường. Và mặc dù ban đầu chúng có vẻ giống nhau, một hội trường không gì khác hơn là khu vực không phải là phòng, trong khi hành lang được thiết kế đặc biệt để kết nối khu vực này với khu vực khác.

Một sự khác biệt quan trọng khác với một ngôi nhà là bạn có chiều rộng và chiều cao cụ thể, và bạn phải lấp đầy toàn bộ mọi thứ bằng các phòng và hội trường, trong khi với một hầm ngục, có không gian trống.

Tôi nghĩ rằng các phòng trong một ngôi nhà là một cái gì đó ở giữa một hành lang ngục tối (đưa bạn đến các phòng khác) và một khoảng trống trong ngục tối (nó không được xác định rõ ràng trong mã).

Cụ thể hơn, các yêu cầu là:

  • Có một bộ các phòng được xác định trước
    tôi không thể tạo ra các bức tường và cửa ra vào.
  • Các phòng có thể được xoay nhưng không thể thay đổi kích thước
    Một lần nữa, vì tôi có một bộ phòng được xác định trước, tôi chỉ có thể xoay chúng, không thể thay đổi kích thước chúng.
  • Kích thước ngôi nhà được đặt và phải được lấp đầy hoàn toàn với các phòng (hoặc hội trường)
    Tức là tôi muốn lấp đầy một ngôi nhà 14x20 với các phòng có sẵn để đảm bảo không có không gian trống.

Dưới đây là một số hình ảnh để làm cho điều này rõ ràng hơn một chút:

Máy tạo dungeon điển hình Hầm ngục không có hành lang Kết quả máy phát điện nhà

Như bạn có thể thấy, trong nhà, "không gian trống" vẫn có thể đi bộ và nó đưa bạn từ phòng này sang phòng khác.

Vì vậy, đã nói tất cả những điều này, có lẽ một ngôi nhà chỉ là một hầm ngục thực sự rất chật với các hành lang. Hoặc nó là một cái gì đó dễ dàng hơn một ngục tối. Có lẽ có một cái gì đó ở ngoài đó và tôi đã không tìm thấy nó bởi vì tôi thực sự không biết phải tìm kiếm cái gì.

Đây là nơi tôi muốn sự giúp đỡ của bạn: bạn có thể cho tôi gợi ý về cách thiết kế thuật toán này không? Bất kỳ suy nghĩ về những bước nó sẽ mất? Nếu bạn đã tạo một trình tạo dungeon, bạn sẽ sửa đổi nó như thế nào cho phù hợp với yêu cầu của tôi? Bạn có thể cụ thể hoặc chung chung như bạn muốn. Tôi đang tìm cách để chọn bộ não của bạn, thực sự.


2
Một đề xuất kỳ lạ: Tôi thực sự khuyên bạn nên kiểm tra các cuốn sách của Christopher Alexandre Cách xây dựng vượt thời gianNgôn ngữ mẫu , các sách kiến ​​trúc hình thành nền tảng ban đầu cho khái niệm về mẫu (phần mềm); về cơ bản, chúng mô tả một ngôn ngữ rõ ràng cho các tòa nhà và không gian sống có thể được biến thành một phương pháp xây dựng theo thủ tục từ trên xuống.
Steven Stadnicki

Cá nhân, tôi sẽ cố gắng tạo ra một thuật toán như câu trả lời của egarcias. Bắt đầu bằng cách tạo các trình giữ chỗ phòng (các khu vực lớn có thể chứa đầy số lượng phòng khác nhau. Mỗi chủ phòng được yêu cầu phải có một khoảng cách kích thước cụ thể (hoặc ngẫu nhiên với giới hạn thấp hơn) giữa chúng. Không gian 'khoảng cách' là gì được coi là một hành lang, tức là không gian trong nhà nhưng không phải trong phòng, và những người giữ phòng sẽ được lấp đầy bởi các phòng có kích thước ngẫu nhiên tương tự như 'ngục tối của bạn không có ví dụ về hành lang.
Benjamin Danger Johnson

@pek Vui lòng tạo câu trả lời cho giải pháp của bạn, đừng đặt câu hỏi đó.
MichaelHouse

@ Byte56 Xong. Để rõ ràng, tôi đã làm điều đó bởi vì tôi không muốn nhận được tín dụng vì tôi chỉ làm những gì người khác đề nghị. Tôi hiểu mặc dù tại sao điều đó không lý tưởng cho định dạng của trang web, vì vậy, tôi đã thêm câu trả lời của mình.
pek

Cảm ơn @pek. Đừng lo lắng về việc nhận tín dụng, nó xứng đáng và hữu ích cho mọi người đến trang web để xem giải pháp (và xem nó ở nơi mà nó mong đợi là tốt nhất).
MichaelHouse

Câu trả lời:


50

Tôi nghĩ rằng đây là trường hợp tốt để sử dụng phân vùng không gian nhị phân hoặc ternary.

Trên đường đèo đầu tiên, chia không gian nhà thành các sảnh và {khối phòng}. Nhận phần lớn tiếp theo, chia nó thành {hall và chunk} hoặc {2 chunk và hall giữa chúng}. Trên mỗi bước, xoay hướng cắt 90 độ. Dừng lại khi {không còn khối lớn nào còn lại} hoặc {tổng diện tích hội trường đạt đến giới hạn}.

Trên đường chuyền thứ hai, chia các phần còn lại thành các phòng. Nhận phần lớn tiếp theo và chia nó. Bỏ qua việc chia một số khối không quá lớn một cách ngẫu nhiên, để có một số phòng lớn.

Nếu bất kỳ hội trường nào phải đối mặt với hội trường cũ hơn nhiều, hãy đặt tường (hoặc tường có cửa) ở đó.

Kết nối các phòng với hội trường trực tiếp hoặc thông qua các phòng đã được kết nối khác.

Ví dụ: bạn có thể thấy kết quả được tạo thủ công của tôi hoặc C ++ - mã giả được thực hiện một phần giống nhau . Phát bắn cuối cùng:

phát bắn cuối cùng


Đó là nơi kết quả nghiên cứu của tôi, trong phân vùng không gian. Ví dụ của bạn với mã đã cho tôi một khởi đầu rất rất tốt. Tôi hiện đang đọc về các thuật toán. Một câu hỏi mặc dù: một trong những yêu cầu của tôi là các phòng được xác định trước (nghĩa là có các phòng 2x2 có một cửa, 1x1 có hai cửa, nhưng không có 2x2 có ba cửa), vì vậy tôi không thể bắt đầu phân vùng và sau đó quyết định nơi tôi sẽ đặt cửa . Tôi nghĩ rằng tôi phải ghi nhớ những hạn chế của mình trong khi tôi phân vùng. Bạn có một gợi ý cho cách tôi sẽ đi về điều này? Trong mọi trường hợp, cảm ơn bạn rất nhiều vì câu trả lời và nỗ lực của bạn!
pek

@pek Tôi không chắc chắn nếu chỉ người phàm có thể tìm ra giải pháp học thuật cho vấn đề này. Bạn có thể thử thiết lập các điều kiện bổ sung cho bộ tách khối và bộ tách hộp, sau đó tạo và giảm mức cho đến khi bạn tìm thấy một trong đó tất cả các điều kiện có thể được đáp ứng.
Bóng tối trong mưa

Vâng, tôi đã hy vọng rằng tôi đang thiếu một cái gì đó. Cách tiếp cận đầu tiên của tôi là sử dụng A * để tìm ra cách lắp các phòng trong một không gian nhất định, nhưng nó thiếu logic cho các hội trường. Bây giờ tôi nghĩ rằng tôi có thể sử dụng BSP để đặt hội trường, và sau đó sử dụng A * cho các khối. Điều tôi lo lắng nhất là nó có thể quá đắt và không phải lúc nào cũng tạo ra kết quả. Nhưng tôi sẽ phải kiểm tra cái này trước. Có lẽ nó sẽ không tệ như vậy?
pek

2
@pek Tôi tìm thấy một cái gì đó hữu ích, nếu bạn vẫn quan tâm. Nhìn vào cái này , cũng google L-system.
Bóng tối trong mưa

24

Bạn có thể tận dụng thực tế là thiết kế mong muốn của bạn đặt các phòng trong các phòng hình chữ nhật được bao quanh bởi các hành lang. Với ý nghĩ đó, tôi sẽ làm điều này:

  1. Thiết kế hành lang và "không gian lớn" cho các phòng
  2. Điền vào từng "không gian lớn" với các phòng

2 bước

Việc lấp đầy các không gian lớn với các phòng có thể được thực hiện dễ dàng nếu bạn bắt đầu với các phòng ở biên giới - chúng có những hạn chế cụ thể, ví dụ các phòng đối diện với hành lang có thể có cửa trên bức tường đó, nhưng các phòng đối diện với "bức tường bên ngoài" không thể (họ có thể có cửa sổ, có lẽ). Các phòng "bên trong" các khối lớn của các phòng sẽ cần ít nhất một lối vào.


15

Vì vậy, đây là cách tôi giải quyết vấn đề này. Nhưng trước tiên, tôi muốn cảm ơn cả @Shadows In Rain và @egarcia vì câu trả lời của họ. Họ đã cho tôi một hướng đi tốt giúp tôi có được một số kết quả.

Tôi đã sử dụng phân vùng không gian của Shadows In Rain để tạo ra một ngôi nhà cơ bản và sau đó làm theo lời khuyên của egarcia để lấp đầy khu vực có phòng.

Việc phân vùng không gian khá đơn giản vì 90% mã được thực hiện bởi Shadows. Phần "điền vào phòng" khó khăn hơn một chút. Tôi quyết định sử dụng hệ thống Lập kế hoạch AI giả sử dụng A * để định vị các phòng một cách thích hợp. Điểm hay của việc sử dụng lập kế hoạch thay vì chỉ A * là các điều kiện tiên quyết giúp cắt giảm đáng kể không gian tìm kiếm.

Dưới đây là một số ảnh chụp màn hình với kết quả:

Giai đoạn tạo kế hoạch sàn Giai đoạn tạo kế hoạch sàn

Giai đoạn đặt phòng Giai đoạn đặt phòng

Bây giờ với cửa kết nối!
Bây giờ với cửa kết nối!


11

Dahl & Rinde có một bài luận văn về Tạo môi trường trong nhà theo thủ tục , sử dụng phương pháp tiếp cận bộ xương & khu vực để lấp đầy nội thất tòa nhà với các phòng và hành lang. Bài viết bao gồm các sơ đồ lớp cho nguyên mẫu của họ. Ngoài ra còn có một số tài liệu tham khảo tốt trong thư mục của họ, bao gồm cả Ngôn ngữ mẫu đã nói ở trên .

Công việc của họ được thiết kế xoay quanh các giả định đơn giản hóa sau:

  • chỉ giao dịch với các tòa nhà chung cư
  • không chia cấp
  • giới hạn hình dạng của các tòa nhà (phong bì) phải là đa giác
  • không có lỗ trên phong bì
  • độ dày đường bao tương tự hoặc thay đổi tuyến tính (IE không có hình dạng đồng hồ cát)
  • chỉ giao dịch với các tòa nhà cần hành lang

Dưới đây là tổng quan ngắn gọn về quy trình của họ:

  • Tìm bộ xương cho phong bì. Hành lang sau đó được đặt dọc theo bộ xương dựa trên khoảng cách từ phong bì, khoảng cách gần cửa ra vào hoặc cầu thang & khoảng cách với hành lang được đặt trước đó.
  • Tiếp theo, không gian phi hành lang còn lại được phân vùng thành các khu vực được kết nối tối đa, mỗi khu vực có một ranh giới liên tục duy nhất. Trong một số trường hợp, điều này sẽ yêu cầu chèn một bức tường.
  • Các khu vực này sau đó được chia thành các căn hộ cố gắng phân bổ ít nhất một cửa sổ cho mỗi căn hộ. Trong một số trường hợp, các bộ phận nhỏ hơn sẽ hợp nhất để tránh các căn hộ quá nhỏ. Các khu vực không có cửa sổ chỉ đơn giản là bỏ qua.
  • Cuối cùng, các căn hộ được chia thành các phòng sử dụng sơ đồ giống như Voronoi có trọng số như một cơ sở như sau:

    • Trọng lượng hạt giống được sử dụng để ảnh hưởng đến kích thước phòng. Hạt giống được thêm vào ở cửa ra vào và cửa sổ. Hạt giống bổ sung được thêm vào, thường là một hạt cho mỗi phòng mong muốn; trong khi không được nêu rõ ràng, có vẻ như các hạt giống được đặt dọc theo các bức tường bên ngoài của căn hộ.
    • Bắt đầu với điểm xa nhất, một đường giữa hạt giống đã cho & tất cả các điểm khác được tính toán và sau đó chia đôi khoảng cách tương ứng với trọng số tương ứng của các điểm cuối (EG nếu A & B có trọng số 1 & 4, điểm chia đôi sẽ là 1/4 đường từ A đến B). Bộ sưu tập các đường chia đôi, cùng với bức tường bên ngoài sau đó tạo thành tế bào cho hạt giống.
    • Tiếp theo, một bộ xương tường S-Space (theo Peponis et al 1997) được tạo ra bằng cách phân vùng khu vực với các đường thẳng vuông góc từ các điểm giữa giữa các cặp tính năng tường ngoài (cửa sổ hoặc cửa ra vào).
    • Cuối cùng, các bức tường được chọn từ bộ xương không gian S 'tương ứng cũng như có thể với các bức tường tế bào Voronoi.'

3
Bạn có thể bao gồm hình ảnh? Điều đó sẽ rất tuyệt. Tôi đã đọc lướt giấy và các phòng họ tạo ra trông đẹp từ một POV kiến ​​trúc.
congusbongus

Phương pháp rất thú vị, tôi sẽ phải tự kiểm tra kỹ hơn xem có ý tưởng nào tôi có thể lấy ra từ nó không.
Draco18

Tôi đến đây để thư giãn từ công việc ... Bất ngờ chủ đề nghiên cứu của tôi xuất hiện. Tôi quá lười để viết câu trả lời dựa trên nghiên cứu của riêng tôi (tôi mới chỉ thiết kế xương trần của thuật toán, vì vậy dù sao nó cũng không đáng) hoặc mô tả cách tiếp cận vấn đề của Danil Nagy, vì vậy tôi sẽ chỉ để nó ở đây autodeskresearch.com/publications/ trên
Felipe Gutierrez
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.