Một thuật toán tốt cho bố trí thành phố thủ tục dựa trên fractal là gì?


19

Lý lịch

Tôi điều hành một máy chủ minecraft nơi tôi sẽ thiết kế một thành phố khởi đầu với quy mô khá lớn. Tôi có một loạt các thứ, như biển báo quy tắc và lồng mob, tôi muốn đặt trong các tòa nhà ở đó. Bản thân thành phố sẽ vô cùng rộng lớn và trải rộng, tốt nhất là có kích thước lên tới 1000 x 1000.

Bản thân các tòa nhà sẽ có dấu chân hình khối hoặc hình chữ nhật dựa trên một khối cơ sở nhất định, giống như tất cả bội số của 3 khối. Các đường phố và khoảng cách giữa các tòa nhà tốt nhất là rộng 5-11 khối, tùy thuộc vào tầm quan trọng của đường phố.

Khi tôi bắt đầu kế hoạch cho thành phố, tôi sẽ biết chính xác tôi muốn các tòa nhà lớn đến mức nào và sẽ có bao nhiêu.

Vấn đề

Vấn đề là thiết kế bố trí cho thành phố. Rõ ràng với một cái gì đó có quy mô như vậy, và tôi đến từ một nền tảng lập trình chứ không phải là một nền tảng kế hoạch đô thị, thật khó khăn để thậm chí bắt đầu xoay quanh vấn đề.

Vấn đề cụ thể là tôi muốn thành phố trông tự nhiên nhất có thể. Tất nhiên điều này sẽ khá dễ dàng để xây dựng trên một mẫu lưới đơn giản, nhưng tôi muốn tránh một lưới, hoặc bất cứ thứ gì trông giống như lưới, càng nhiều càng tốt.

Câu hỏi

Những thuật toán nào tôi có thể theo đuổi để có thể giúp tôi thiết kế nó bằng mã? Tôi đã nghĩ rằng nó sẽ trông tự nhiên nhất nếu tôi sử dụng fractals theo một cách nào đó, vì minecraft sử dụng fractals đã có trong thế hệ địa hình của nó, và một thành phố dường như phát triển theo mô hình fractal một cách tự nhiên.

Tôi nghĩ rằng nó tương tự như một số cách với thuật toán chơi tetris, vì vậy nếu có ai có giải pháp tồn tại theo hướng đó thì nó cũng có ích. Tôi đang hình dung một cái gì đó mà tôi có thể xác định các hình dạng mà tôi muốn sử dụng và phần mềm sau đó lặp đi lặp lại cho đến khi tìm thấy giải pháp "tối ưu" nhất để phân phối các tòa nhà. Có một cái gì đó đã tồn tại để giúp tôi giải quyết vấn đề này bằng cách sử dụng python, tốt nhất là theo cách trực quan bằng pygame?

Đương nhiên, điều này cũng có ý nghĩa thú vị đối với thế hệ thành phố nói chung trong thiết kế trò chơi, vì vậy tôi rất vui mừng để xem giải pháp tốt nhất là gì.

chỉnh sửa Để rõ ràng, tôi chỉ tìm cách bố trí tại thời điểm này vì các tòa nhà sẽ được thiết kế và xây dựng trong trò chơi.


3
Minecraft sử dụng fractals? Tôi có ấn tượng rằng nó chỉ sử dụng các chức năng tiếng ồn liên tục (Perlin hoặc Simplex, tôi tin).
Martin Sojka

@Martin Sojka Perlin tiếng ồn thực sự là một fractal, vì vậy có.
Nevermind

1
@Nevermind: Đặc điểm xác định của fractal là tự tương tự : Nếu bạn chọn một phần của nó và chia tỷ lệ theo kích thước của bản gốc, nó sẽ "tương tự" (có cùng cấu trúc). Cụ thể, phổ tần số của tín hiệu fractal là bất biến đối với thang đo. Nếu bạn làm điều đó với tiếng ồn Perlin, tất cả những gì bạn sẽ nhận được là một khu vực mở rộng của tiếng ồn Perlin; phổ tần số cũng sẽ thay đổi.
Martin Sojka

@Nevermind Tiếng ồn Perlin thực sự không phải là một fractal, tuy nhiên chuyển động Brown (là một kỹ thuật có thể sử dụng tiếng ồn Perlin) là một fractal và thường được gọi là tiếng ồn Perlin.
Elva

Vâng, xin lỗi, tôi luôn sửa lỗi cho mọi người khi họ nhầm lẫn tiếng ồn Perlin và tiếng ồn màu hồng, nhưng ở đây tôi cũng đang mắc lỗi tương tự. Bảo vệ duy nhất của tôi là Minecraft thực sự sử dụng tiếng ồn màu hồng (chuyển động nâu), IIRC.
Không bao giờ bắt đầu

Câu trả lời:


20

Gần đây tôi đã thực hiện một thuật toán cho bố cục thành phố theo thủ tục. Đây vẫn là một công việc đang tiến triển, nhưng dường như đầy hứa hẹn với tôi. Hãy xem:

ví dụ thành phố thủ tục

Thuật toán được sử dụng để tạo bố cục này dựa trên L-Systems một cách lỏng lẻo . Tôi có một Elementlớp cơ sở , có một hình chữ nhật đánh dấu vị trí của nó trên bản đồ và một phương thức Grow, nó tạo ra một hình khác Elementsbên trong hình chữ nhật và / hoặc sinh ra một số đối tượng trên bản đồ. Sau đó là những yếu tố thực tế, kế thừa từ lớp cơ sở này: City, Street, Building, vv

Thế hệ bắt đầu với một số đối tượng "hạt giống" (trong trường hợp của tôi, chỉ là một Cityyếu tố duy nhất được đặt ngẫu nhiên trên bản đồ). Sau đó, hệ thống lặp lại tất cả các phần tử, gọi Grow, cho đến khi tất cả các phần tử trở nên không hoạt động ( Growtrả về false) hoặc một số lượng lớn các lần lặp lại.

Thành phố trong ảnh được xây dựng chỉ bằng một vài quy tắc đơn giản:

  • Citytrở thành một Streetyếu tố chia tách khu vực ở một nơi nào đó.
  • Tất cả đều Streetphát triển 0-3 bên đường, tiếp tục chia tách khu vực.
  • Ngoài ra, Streets liên tục cố gắng để phù hợp với một kích thước ngẫu nhiên Buildingở bên cạnh.

Kết quả không thú vị lắm, nhưng cũng không tệ. Hệ thống có thể được mở rộng dễ dàng và đủ đơn giản để hiểu chuyện gì đang xảy ra (-8


Yêu sự đơn giản. Các thành phố, theo tôi, thực sự là hữu cơ bởi vì chúng được kiểm soát bởi một thực thể hữu cơ - tìm cách tạo ra sự hoàn hảo khi mắt của nó nhìn thấy nó - làm cho L-Systems có thể là xấp xỉ tốt nhất của quá trình này.
Jonathan Dickinson

Tôi thích nó. =) Bây giờ để thực hiện trong pygame ...
Ken

8

GDC nói về thế hệ xây dựng thủ tục từ vài năm trước. Đó là để tạo các tòa nhà riêng lẻ dựa trên một tập hợp các mẫu, nhưng không phải để tạo toàn bộ thành phố (đặt đường phố và vv). Thật không có mã miễn phí để đi với nó, thật không may. Hệ thống được mô tả trong bài nói chuyện được triển khai trong Unreal mặc dù tôi không rõ liệu nó có ở phiên bản UDK miễn phí hay không. Trong mọi trường hợp, bạn có thể sử dụng một số ý tưởng tương tự để xây dựng hệ thống của riêng bạn.

Googling "các tòa nhà thủ tục" hoặc "thành phố thủ tục" cũng sẽ cung cấp cho bạn khá nhiều giấy tờ và bài viết khác về chủ đề này.


1

Tôi đã chạy qua một hướng dẫn rất tốt / chi tiết để tạo ra các thành phố thủ tục một thời gian trước. Có một video @ http://www.youtube.com/watch?v=-d2-PtK4F6Y Hướng dẫn có trên blog của tác giả: http://www.shamusyoung.com/twentysidedtale/?p=2940 Hy vọng điều này sẽ giúp xung quanh


Trông giống như một hướng dẫn tuyệt vời từ những gì tôi đọc lướt qua, và nó sẽ có một số gợi ý tuyệt vời nếu tôi quyết định tạo ra các thành phố sau này. =)
Ken
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.