Làm thế nào để tạo ra một mạng lưới đường phố thành phố?


16

Tôi muốn tạo ra một máy phát điện thành phố cho một trò chơi, nhưng tôi đang gặp phải một vấn đề ngay từ đầu thế hệ: hệ thống đường bộ.

Vì đây là một thế giới thời trung cổ, tôi không muốn có một kế hoạch lưới như nhiều thành phố hiện đại. Tôi lý tưởng sẽ thích một thế hệ giả ngẫu nhiên gồm những con đường lớn và những con đường nhỏ hơn, nơi có thể bị lạc, nhưng vẫn còn một số logic - không phải là một mê cung hoàn chỉnh.
Một cái gì đó trông giống như một thị trấn phát triển tự nhiên.

Để giữ cho nó đơn giản, giả sử các thành phố của tôi sẽ ở trên địa hình bằng phẳng và ổn định, không có bất kỳ vấn đề vượt sông hay cứu trợ nào. Tôi có thể cố gắng tích hợp nó vào một giải pháp sau.

Tôi đã không quyết định kích thước chính xác hoặc bố trí cho các thành phố của mình, vì vậy nếu bạn có một giải pháp chỉ hoạt động với các thành phố có dạng chính xác (hình vuông, hình tròn, hình chữ nhật, v.v.), tôi sẽ lấy nó.


2
Bạn có thể muốn xem xét trình tạo thành phố theo thủ tục bằng Phần mềm Introversion mà họ đã tạo cho Subversion. Trong khi trò chơi bị hủy bỏ, có rất nhiều cảnh quay xung quanh từ máy phát điện của họ.
Philipp

Bạn có một ví dụ về những gì bạn muốn (ví dụ thực tế từ khoảng thời gian mục tiêu của bạn, ví dụ từ một trò chơi khác, phác họa, v.v.) không? Có rất nhiều lựa chọn giữa 'không phải là lưới' & 'không phải là một mê cung hoàn chỉnh'.
Pikalek

@Pikalek Tôi không cho chính xác hơn vì tôi không có nó. Tôi không tìm kiếm thứ gì đó rất cụ thể, bất kỳ ví dụ nào về thế hệ không tạo ra mê cung hay kế hoạch lưới đều có thể làm tôi hài lòng.
Aracthor

Câu trả lời:


21

Một nơi tốt để bắt đầu với việc tạo thành phố theo thủ tục là Mô hình thủ tục thành phố của Giáo xứ và Müller . Bài báo của họ trình bày một Hệ thống L trong đó các quy tắc liên quan đến mật độ dân số và mô hình đường (lưới hình chữ nhật, thay đổi hướng tâm và thay đổi độ cao nhỏ nhất) được kết hợp và sau đó cố định để phù hợp với các hạn chế cục bộ như mặt tiền nước và thẩm mỹ đường. Mặc dù kết quả của hệ thống này rất ấn tượng, nó đã bị chỉ trích là phức tạp không cần thiết . Giải pháp thay thế của Barrett được trình bày lại trong blog dev Phụ tùng của Rudzicz như sau:

  • duy trì một danh sách các con đường "đề xuất"
  • đánh giá chúng theo thứ tự
  • nếu chúng được chấp nhận (có hoặc không có một số sửa đổi nhỏ)
  • lưu trữ từng con đường được chấp nhận trong khi "đề xuất" một nhánh nhiều hơn từ nó

Cách tiếp cận này loại bỏ hầu hết các biểu tượng viết lại kế thừa vệ sinh trong Hệ thống L của Giáo xứ và Müller. Bạn có thể xem bản demo của phương pháp này tại đây .

Một lợi ích của phương pháp này là đó là thuyết bất khả tri về hình dạng thành phố - bạn có thể thêm các ràng buộc phác thảo khi cần, do đó hình dạng thành phố của bạn có thể được xác định bởi nhu cầu thiết kế trò chơi của bạn thay vì thuật toán. Tùy thuộc vào quy mô thành phố của bạn, điều này có thể đủ tốt như vậy. Dưới đây là một kết quả từ bản demo ở trên với một giới hạn phân đoạn của 100: nhập mô tả hình ảnh ở đây Nhưng nếu bạn cần một cái gì đó lớn, bạn có thể gặp khó khăn; đây là kết quả có giới hạn phân khúc là 500: nhập mô tả hình ảnh ở đây

Một phần, bạn có thể điều chỉnh điều này bằng cách thay đổi quy tắc phân nhánh đường, tránh góc 90 độ, v.v ... Nếu bố cục của bạn vẫn quá đều đặn, đây là cách sửa của tôi:

Chuyển đổi lưới thành phố của bạn thành một biểu đồ trong đó mỗi đường là một cạnh và mỗi giao lộ là một nút. Tiếp theo, sử dụng bất kỳ thuật toán nào bạn muốn để chuyển đổi biểu đồ thành mê cung . Đây là ví dụ cuối cùng biến thành mê cung: nhập mô tả hình ảnh ở đây

Bây giờ đầu ra có vấn đề ngược lại, nó quá mê cung. Nhưng bây giờ chúng ta có thể áp dụng một vài kỹ thuật từ Công việc bí mật của Công cụ tạo Dungeon của Jamis Buck . Đầu tiên, tăng độ thưa bằng cách loại bỏ một số hành lang cụt. Tiếp theo, tăng kết nối bằng cách thêm vào các đường tạo vòng lặp (nghĩa là giới thiệu chu kỳ cho biểu đồ). Đây là một kết quả ví dụ: nhập mô tả hình ảnh ở đây

Lưu ý: có thể đạt được kết quả cuối cùng trực tiếp từ giai đoạn bố trí lưới định hướng trước đó (trước khi tạo mê cung), bằng cách chỉ áp dụng loại bỏ cạnh cho lưới thành phố. Vấn đề với cách tiếp cận đó là bạn phải đảm bảo loại bỏ một cạnh không phân vùng thành phố do đó làm cho các phần không thể truy cập được.


6

Nếu bạn tìm kiếm các kế hoạch thời trung cổ / thành phố cũ trên Google, bạn sẽ tìm thấy nhiều biến thể khác nhau, chủ yếu dựa trên nguồn gốc thành phố (ví dụ: định cư ngẫu nhiên so với vị trí quân sự có tổ chức).

Tôi cho rằng bạn đang tìm kiếm một khu định cư phát triển / hỗn loạn tự nhiên hơn.

Đối với những điều này, tôi sẽ thử một cách tiếp cận như thế này:

  • Bắt đầu với một con đường chính đi từ đầu này sang đầu kia (và lý tưởng nhất là kết nối một số khu định cư khác. Nếu bạn muốn, hãy tạo một con đường thứ ba để bạn có một ngã ba để bắt đầu giải quyết.
  • Đặt một số ngôi nhà dọc theo con đường (chỉ ở một bên).
  • Bây giờ mở rộng con đường đó dọc theo các ngôi nhà và thêm một mốc chính ở phía bên kia (thường là một nhà thờ, nhưng đây cũng có thể là một số nhà máy hoặc tương tự). Đây sẽ là trung tâm / thị trường của bạn.
  • Bây giờ chọn hai vị trí bên ngoài khu vực với các ngôi nhà và tạo một con đường mới bao quanh các ngôi nhà.
  • Tùy chọn tạo một số đồng minh nhỏ hơn giữa các ngôi nhà kết nối con đường cũ và mới.
  • Bây giờ lặp lại cho đến khi bạn hài lòng với "cốt lõi" của mình:
    • Thêm một vài ngôi nhà.
    • Thêm một con đường khác bao quanh họ.
    • Thêm các con hẻm nối lại các con đường.
  • Một khi bạn hài lòng với điều đó, bạn đã hoàn thành. Nếu nó được coi là một thị trấn, hãy bao quanh nó bằng những bức tường và lặp lại những bước cuối cùng một vài lần nữa, thêm những ngôi nhà bên ngoài bức tường.

3

Trước hết, có rất nhiều cách để tạo ra thủ tục và không có cách nào dễ dàng cả, tôi sẽ thực hiện cách tiếp cận để bạn có thể làm cho nó hoạt động, tùy thuộc vào bạn, sửa đổi hoặc loại bỏ nó.

Sẽ giả mã trong JS vì nó dễ hiểu hơn.

1º xác định một điểm vào, vì bạn muốn xây dựng một thành phố thời trung cổ, chúng ta sẽ bắt đầu với một hình vuông, vì vậy giả sử thị trấn của bạn sẽ có 300 đơn vị bình phương và hình vuông sẽ ở giữa nó (đại diện bằng chữ X).

       300
________________
|               |
|               |
|               | 300
|       X       |
|               |
|               |
|_______________|

const square = [ 150, 150 ];

Bây giờ chúng ta sẽ có các con đường, sẽ có một số ngẫu nhiên trong số chúng, chúng sẽ thẳng và sẽ bắt đầu từ quảng trường giữa hoặc từ các đại lộ khác

let avenues = [] // will contain start and end [[sx,sy],[ex,ey]]
const n_avenues = RANDOM(4, 8); // number of avenues
const n_av_from_square = RANDOM(0, avenues); // starting in the square

for av in av_from_square
  avenues.push(square, [RANDOM(0, 200) + 100, RANDOM(0, 200) + 100])
  // we want avenues to have, at least 100 units length, thats why we randomize just te last 200 units of the whole town size

Điều này sẽ cung cấp cho bạn một hình vuông và vài đường phố chính

       300
________________
|   \\          |
|    \\         |
|     \\        | 300
|       X=====  |
|               |
|               |
|_______________|

Bây giờ chúng ta phải đặt các đại lộ không bắt đầu ở quảng trường chính, chúng sẽ giao với các đại lộ khác

for av in (n_avenues - av_from_square){
  const av_to_intersect = avenues[RANDOM(0,avenues.length)];

  //check av_to... and get a perpendicular vector (explained bellow)
  av[0] = [ av_to_intersect[0][1], - av_to_intersect[0][0] ];
  av[1] = [ av_to_intersect[1][1], - av_to_intersect[1][0] ];

}

Để có được các vectơ vuông góc, bạn phải hoán đổi các dây x, y và phủ định y mới:

đã vuốt == x: noswiped.y, y: -1 * (noswiped.x)

Ngay bây giờ bạn nên có một cái gì đó tương tự như thế này, nó không giống như một thị trấn? : P

       300
________________
|   \\  //      |
|    \\//  ||   |
|     \\   ||   | 300
|    //\X=====  |
|   //     ||   |
|          ||   |
|_______________|

Bây giờ bạn chỉ phải kết nối các đại lộ với những con đường ngắn, ngoài ra, bạn có thể sinh ra những ô vuông ngẫu nhiên dọc theo thị trấn và tạo ra những con đường giống như trên cho tất cả chúng, hoặc chỉ sinh ra những con đường nhỏ từ một số quảng trường kín đáo, tùy thuộc vào bạn.

Hãy nhớ rằng, đường phố của bạn ngắn nhất, thị trấn hỗn loạn trông như thế nào.

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.