Tạo sông hoặc đường thủ tục cho địa hình vô tận


28

Tôi nên nói những con đường, không phải những con đường như tôi đang nghĩ giống thời trung cổ hơn. Ngoài ra, không tìm kiếm chủ nghĩa hiện thực. Câu trả lời tôi đang tìm kiếm sẽ phù hợp với khuôn mẫu mà tôi mô tả hơn là chủ nghĩa hiện thực.

Tôi đang tìm kiếm một phương pháp để tạo ra những con đường / con sông theo thủ tục theo kiểu cong, nhưng tôi muốn làm như vậy cho một hệ thống loại địa hình vô tận. Giống như cách nhiễu perlin tạo ra các đốm màu, tôi muốn tạo các đoạn đường dài ngẫu nhiên (có thể là chiều dài vô hạn).

Tôi biết các chiến lược như câu trả lời được đề xuất ở đây , tuy nhiên nó dựa vào điểm bắt đầu và điểm kết thúc cụ thể để làm việc, tôi không có điểm bắt đầu và điểm kết thúc cụ thể. Tôi muốn có thể chỉ cần gọi một hàm bằng cách sử dụng tọa độ tùy ý và trả lại cho dù tọa độ cụ thể là một phần của sông / đường.

Tôi không muốn yêu cầu địa hình được tạo ra trước. Điều đó bao gồm một sơ đồ chiều cao (như được sử dụng cho mô phỏng lượng mưa hoặc tương tự). Tôi cũng không muốn yêu cầu điểm bắt đầu / kết thúc.

Có một thuật toán hoặc tinh chỉnh cho thuật toán nhiễu mà ai đó có thể biết để thực hiện những gì tôi đang cố gắng giải thích không?

Gần nhất tôi đã đến cho đến nay là fractals đa chủng loại, nếu tôi sử dụng đúng tên. Tôi chỉ lấy giá trị tuyệt đối của nhiễu giá trị (giả sử nó được chia tỷ lệ thành -1 đến +1) và đặt ngưỡng. Vấn đề chính của tôi với điều này là các đường chồng chéo quá thường xuyên, chủ yếu là hình tròn, đôi khi hội tụ để tạo thành các hồ lớn gọn gàng nhưng không mong muốn và thường độ dày của các dòng thay đổi quá nhiều.

Đây là hình ảnh về những gì tôi có trong 2D, nhưng với tần suất rất cao để hiển thị chi tiết hơn:

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


do các dòng sông "chảy" nên có thể dễ dàng xác định các dòng sông bằng cách sử dụng tiếng ồn để xác định điểm xuất phát, sau đó chỉ cần sử dụng dữ liệu sơ đồ chiều cao thô của bạn để xác định đường dẫn.
Chiến tranh

Đường có thể khó khăn hơn một chút, tôi đã cân nhắc việc xây dựng đường dựa trên việc sử dụng, nếu một người chơi / tất cả người chơi thường xuyên đi bộ trên một số địa hình thì nó sẽ trở thành đường dẫn.
Chiến tranh

1
@ user19142 OK, không trùng lặp rồi. Bạn cũng có thể tìm thấy một số sử dụng từ câu hỏi / câu trả lời này: gamedev.stackexchange.com/questions/53400/. Và tôi sẽ bao gồm các liên kết trước đó là "liên quan" gamedev.stackexchange.com/questions/45403/ . stackexchange.com/questions/29044/... gamedev.stackexchange.com/questions/31263/...
MichaelHouse

4
Tôi nghĩ đường sẽ không đáng tin nếu được tạo ra bằng tiếng ồn. Đường được tạo ra bởi trí thông minh thay vì vật lý và thời gian. Mặc dù đôi khi chúng có thể giống nhau, nhưng chúng đủ khác nhau để bạn có thể không sử dụng cùng một thuật toán cho cả hai.
MichaelHouse

1
Các con đường trong dự án đó là các đường đồng mức theo các độ cao cụ thể, vì vậy bạn có thể tạo chúng tại địa phương. Nó hoạt động ở đó nhưng các bản đồ chiều cao không được tạo ra với nhiễu Perlin.
amitp

Câu trả lời:


11

Chỉ cần ý tưởng của tôi để lưu trữ điều này những gì bạn muốn mà không cần (nhiều) tiền mã hóa và khả năng cho một thế giới vô tận.

Pice đầu tiên của thuật toán là việc sử dụng Voronoi-Diagramms . Bạn chia thế giới của mình thành các lưới, mỗi lưới có một địa chỉ ở dạng (xgrid, ygrid). Đối với mỗi ô mà bạn cần tạo đường bạn đặt các biến xgrid và ygrid vào hàm băm trả về một số CellSeed . Bạn sử dụng CellSeed làm hạt giống cho trình tạo số ngẫu nhiên tạo tọa độ các điểm cho Biểu đồ Voronoi.

Bây giờ bạn cần tìm kiếm các cạnh của sơ đồ và các nút nơi có nhiều cạnh va chạm. Bạn cũng có thể lưu trữ thông tin vào biểu đồ để dễ truy cập hơn.

Sau bước này, bạn có thể tìm kiếm đường dẫn qua mạng hợp lệ.

Đối với các đường dẫn hợp lệ, bây giờ bạn có thể tạo các đường (chúng có các cạnh sắc nét).

Lưu ý : Bạn cũng cần tạo tọa độ của sơ đồ Voronio cho tất cả các ô neightbor để bạn không có viền trên các cạnh của ô.

Nếu bạn không muốn các cạnh sắc nét, bạn có thể tính điểm giữa của mỗi kết nối và sử dụng hướng làm tiếp tuyến cho phép nội suy bezier giữa hai cạnh trong biểu đồ.

Về việc sử dụng Voronoi-Diagramms

Để lưu trữ thành phố như các cấu trúc đường, các điểm từ hàm ngẫu nhiên giả có thể được căn chỉnh trên lưới, vì vậy các cách có hình chữ nhật.

Đối với nhiều quận như đường, các điểm phải được sắp xếp nhiều hơn.

sơ đồ từ wikipedia

Giới thiệu về hàm Pseudo Random để tạo vị trí của các điểm cho Biểu đồ Voronoi

Nó có thể là một hàm ngẫu nhiên bình thường hoặc một bộ Hammersley để phân phối các điểm không bị vón cục đồng đều hơn.


Bạn có bất kỳ ví dụ về hàm băm? Tôi đã có cùng một mục tiêu (thế giới vô tận sử dụng voronoi cho đường) nhưng dường như tôi không thể kiểm soát được việc này nên được thực hiện như thế nào. Mỗi lib voronoi tôi có thể tìm thấy tọa độ của một hộp giới hạn ngay lập tức đánh bại mục đích.
BotskoNet

Không, hàm băm chỉ để gán một ô bắt đầu cho ô. Có thể là một cái gì đó tầm thường như x * Prime1 + y * Prime2 + z * Prime3. Trường hợp các số nguyên tố không bằng nhau và lý tưởng là lớn, bạn nên tính toán ở đây với số nguyên 64 bit / không dấu. Sẽ không có vấn đề gì nếu lib sử dụng hộp giới hạn, bởi vì với mỗi ô, bạn chỉ cần lấy tất cả các điểm trong ô cộng với tất cả các điểm của các ô lân cận (là 8 ô lân cận).
Quonux

Bạn có thể chạy vào các vấn đề chính xác với độ chính xác duy nhất nếu lib sử dụng độ chính xác đơn hoặc nếu bạn sử dụng độ chính xác đơn. Để bỏ qua vấn đề nếu lib chỉ sử dụng độ chính xác duy nhất và bạn không làm như sau: Trước khi chuyển đổi các vị trí thành độ chính xác duy nhất trừ vị trí toàn cầu của ô trung tâm khỏi chúng, sau đó đặt giá trị này như là float vào lib, sau đó chuyển đổi kết quả trở lại.
Quonux

Tôi thực sự không bao giờ thực hiện thuật toán này nhưng hàm băm có thể thực sự là một thuật toán tầm thường.
Quonux

8

Đối với sáng tạo đường (và thành phố), bài báo tốt nhất tôi tìm thấy là bài này:

Mô hình hóa thủ tục các thành phố của Giáo xứ Y và P Müller

Điều này sử dụng L-System và nó có thể tạo ra các mẫu đường của Hoa Kỳ và EU. Nếu bạn không muốn tạo đường cho cả thành phố, bạn chỉ có thể tạo đường chính. Nó có thể lấy bản đồ chiều cao, bản đồ nước và bản đồ mật độ dân số trong đầu vào.


+1 chỉ vì tôi thích bài báo. Thực sự không phù hợp với cách tôi muốn tạo ra những con đường / con đường / dòng sông KHI tạo ra địa hình một cách linh hoạt.
Thần thoại

6

http://vterrain.org/CARM/Roads/ phần "Tạo đường 3D" có một số thông tin về tạo đường .

Vấn đề với đường là chúng kết nối các mốc (mặc dù chúng thường đi theo địa hình thay vì đi thẳng từ A đến B).

Cá nhân, tôi sẽ tạo địa hình, sau đó đặt các con sông (có thể sử dụng xói mòn, xem http://vterrain.org/Water/ phần "thủy văn"), sau đó đặt các thành phố ở những nơi có ý nghĩa (ví dụ gần sông hoặc khác nguồn nước, hoặc ở nơi có thể vận chuyển nước đến sử dụng cống hoặc tháp nước và đường ống) và cuối cùng tạo ra các con đường giữa các thành phố.

Để làm cho điều này dễ sử dụng hơn trong thế giới thủ tục, bạn có thể tạo các điểm trung gian trên địa hình nơi đường có khả năng đi nhất khi được tạo ở nơi đó, sau đó kết nối các điểm trung gian nếu đường thực sự được tạo ở nơi đó.


4

Đầu tiên, sông và đường rất khác nhau. Đường có xu hướng đi theo các đường cách ly (cùng độ cao / tương tự) - lý do là việc đi lại trên những con đường không tăng hoặc giảm nhiều sẽ dễ dàng hơn nhiều. Mặt khác, các con sông di chuyển vuông góc với các cô lập / đường đẳng (xuống dốc). Các dòng sông hình thành trong các lưu vực (bộ sưu tập các ngọn núi chảy xuống một thung lũng nhất định) và có xu hướng hình thành các cấu trúc giống như cây. Ngoài ra, đường thường đi vuông góc với sông, để tạo thành những cây cầu logic. Ý tưởng tốt nhất là trước tiên tạo ra các con sông, sau đó tạo ra các con đường hợp lý (tức là các con đường giữa các thành phố). Thật không may, tôi không có thời gian để đi sâu vào chi tiết, nhưng hy vọng điều này sẽ giúp bạn đi đúng hướng.

Điều này có vẻ hiển nhiên, nhưng hãy nhìn vào bản đồ của Google ở ​​nhiều loại địa hình và đường khác nhau; bạn sẽ có cảm giác tốt hơn về cách họ nên nhìn.


1
Tôi đã sửa đổi câu hỏi một lần nữa để làm cho nó hiểu rõ hơn rằng tôi không quan tâm đến chủ nghĩa hiện thực ở bất cứ đâu gần như theo cách mà thuật toán sẽ cần để làm việc. Tuy nhiên, tôi đánh giá cao câu trả lời mặc dù chủ yếu là cho một số thuật ngữ được sử dụng. Hãy thử nghĩ về mong muốn của tôi giống như những khúc ngoặt có chiều dài ngẫu nhiên vô hạn có thể được tạo ra với dữ liệu tối thiểu cần thiết (như bản đồ chiều cao).
Thần thoại
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.