C # Perlin tiếng ồn - tạo ra khối địa hình bất tận thành phố bất động sản?


7

Tôi hiện đang viết một chương trình phụ nhỏ trong C #, để vừa học C # vừa vui chơi. Ngay bây giờ tôi có một trình tạo số ngẫu nhiên đơn giản tạo ra thế giới nhưng nó không thực sự tuyệt vời đến thế - vì vậy với một số nghiên cứu, tôi đã phát hiện ra rằng thế hệ tiếng ồn Perlin có thể giúp tôi khá nhiều. Vấn đề là, tôi muốn có một cảnh quan "vô tận" được tạo thành từ nhiều khối.

Về cơ bản các câu hỏi / mối quan tâm của tôi là:

  1. Sử dụng minecraft làm ví dụ (Bỏ qua chiều thứ 3), làm thế nào để Notch có được từng đoạn để kết nối với nhau một cách hoàn hảo? Các đường hầm, hang động, tĩnh mạch quặng, núi, vùng đất bằng phẳng, quần xã sinh vật, v.v ... tất cả đều được kết nối với nhau mặc dù mỗi đoạn được tạo ra riêng biệt, và đôi khi vào một ngày sau đó. Đây là chìa khóa đối với tôi, tôi muốn người chơi có thể đi bên phải và khi họ đang đi bộ, tạo ra nhiều cảnh quan kết nối với cảnh quan trước đó, bao gồm các đường hầm ngầm và hệ thống hang động.
  2. Đi ra khỏi vị trí số 1, làm thế nào điều này sẽ được thực hiện theo giả định rằng mỗi khối là một hình vuông và thế giới cao 10 ô vuông, và hình vuông rộng vô hạn? Tức là mỗi "khối" là gạch 128x128 và thế giới có tổng số gạch cao 1.280. (Điều này là để tôi có thể tạo một bản đồ sâu vô hạn nếu tôi chọn - và cũng để cho thấy rằng tất cả 4 cạnh của một khối / hình vuông cần có thể kết nối và tiếp tục những gì hình vuông / khối trước đó đang làm).

Câu trả lời:


10

Tìm cách triển khai C # của Simplex noise, nó giống như Perlin nhưng hoạt động tốt hơn và nhanh hơn.

Điều về các chức năng nhiễu liên tục như Perlin và Simplex là chúng có tính xác định, tiếng ồn không phải là ngẫu nhiên . Điều mà hầu hết các cài đặt tiếng ồn sử dụng là giá trị Seed bù vào nhiễu được tạo ra làm cho Seed = 1 khác với Seed = 2.

Do quan sát ở trên, bạn có thể tiếp tục sử dụng lại Seed và tất cả các địa hình mới được tạo khi bạn di chuyển qua chức năng tiếng ồn sẽ khớp với nhau vì nó chỉ xuất hiện ở nơi bạn rời đi.

Phần này của nó khá đơn giản và khá hay, những gì bạn làm với tiếng ồn được tạo ra là nơi phép màu xảy ra.

Đối với James, điều đó là có thể nhưng bài kiểm tra tốc độ cá nhân của tôi với tiếng ồn 3D cho thấy đơn giản là nhanh hơn ở mức 3, có thể là bất kỳ yếu tố nào trong bài kiểm tra cá nhân của tôi nhưng nó phù hợp với ý tưởng chung trong văn học. Ngay cả khi nó chậm hơn, tôi sẽ khuyên bạn nên đơn giản vì nó không hiển thị các tạo phẩm "hình vuông" mà perlin làm.

Đối với Jon, tiếng ồn là một hàm toán học và nó chỉ đưa ra kết quả từ các tham số và đưa ra cùng một tham số, bạn sẽ nhận được cùng một số. Tôi thấy sự nhầm lẫn có thể đến từ đâu.

Hàm tiếng ồn này được lấy mẫu như: number = noise (x, y, z); cho tiếng ồn 3 chiều. Ví dụ: bản đồ đầu tiên của bạn có thể lấy mẫu từ X = 0,0 đến X = 1,9, bản đồ ở bên phải của nó tiếp tục và các mẫu từ X = 2.0 đến 3.9

Một phần của nghệ thuật sử dụng tiếng ồn là tìm các phạm vi tốt để lấy mẫu, quyết định số lượng quãng tám, lọc và xử lý, v.v ... Hãy xem một thư viện tiếng ồn tiện dụng để xem một vài ví dụ và một số mã nguồn của Perlin đang hoạt động.


2
Tôi nghĩ Simplex chỉ nhanh hơn ở kích thước cao hơn 3 hoặc 4 so với nhiễu perlin? Perlin đã kết hợp Simplex một cách cụ thể để bù đắp cho chiều cao hơn làm chậm thuật toán ban đầu của anh ta chạy vào.
James

Vì vậy, về cơ bản nếu tôi tạo ra một hạt giống ngẫu nhiên khi tạo ra một thế giới và tiếp tục cho hạt giống đó vào, nếu tôi tạo một bản đồ tiếng ồn mới được đặt ở bên phải của bản đồ tiếng ồn đầu tiên, nó sẽ tiếp tục? Tức là nếu bản đồ tiếng ồn ban đầu có những gì cuối cùng sẽ là một tĩnh mạch sắt, tĩnh mạch sắt đó sẽ được tiếp tục trong bản đồ mới? Làm thế nào chính xác để làm việc này? Làm thế nào để thuật toán biết rằng nó cần "tiếp tục" bản đồ nhiễu ở bên trái, bên phải, trên cùng hoặc dưới cùng?
Jon

@ Tôi đã chỉnh sửa câu trả lời của mình để thử và mô tả rõ hơn các chức năng nhiễu làm gì, tôi hy vọng nó có ý nghĩa hơn về cách thức tiếng ồn có thể được sử dụng để xây dựng bản đồ liên tục tại một thời điểm. Ý tưởng quan trọng nhất vẫn là tiếng ồn không phải là ngẫu nhiên.
Patrick Hughes

@PatrickHughes Wow bản chỉnh sửa của bạn đã xóa nó khá nhiều, cảm ơn. Bây giờ tôi chỉ cần tìm một lớp C # / XNA đơn giản để tạo tiếng ồn đơn giản để làm việc.
Jon

2

một bảng tiếng ồn được tính toán trước để xếp liền mạch, giống như bất kỳ bản đồ kết cấu liền mạch khác. Vì vậy, đó là lý do tại sao bạn có thể đi đến điểm X và nó sẽ giống nhau mọi lúc, rất quan trọng trong hoạt hình để kết cấu không thay đổi từ khung này sang khung khác.

có một chủ đề về điều này trên answer.unity3d.com (thế hệ cấp độ của trình điều khiển bên thủ tục)

Ngoài ra, cuốn sách "mô hình hóa và kết cấu thủ tục" năm 1994 nói về tiếng ồn và đa hình (tiếng ồn phân lớp với tần số và góc quay khác nhau).


Tôi có thể đang hiểu lầm bạn, hoặc tôi đã không giải thích rõ về bản thân mình - Tôi không muốn xếp liền mạch chúng, tôi muốn tạo ra một loạt các 'khối' độc đáo (bản đồ tiếng ồn) kết nối với nhau - Tôi không ' Tôi không muốn bất kỳ ai trong số họ giống nhau, tôi chỉ muốn họ nhận ra rằng "Này, người bên cạnh tôi có một đường hầm ở điểm giữa - tôi nên tiếp tục đường hầm đó"). Chính xác như cách Minecraft làm điều đó, nhưng trong 2d.
Jon
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.