Những thế giới 'hoang dã' khổng lồ được tạo ra


76

Tôi chắc rằng tất cả các bạn đều biết về các trò chơi như Pháo đài Lùn - vùng đất hoang dã rộng lớn, được tạo ra theo thủ tục. Một cái gì đó như thế này, được lấy từ bài viết rất hữu ích này.

Tuy nhiên, tôi đã tự hỏi làm thế nào tôi có thể áp dụng điều này cho quy mô lớn hơn nhiều; quy mô của Minecraft xuất hiện trong tâm trí (không phải thứ gì đó giống như kích thước của bề mặt Trái đất gấp 8 lần sao?). Giả vô hạn, tôi nghĩ thuật ngữ tốt nhất sẽ là.

:CƯỜI MỞ MIỆNG

Bài báo nói về tiếng ồn perlin fractal. Tôi không phải là một chuyên gia về nó, nhưng tôi có ý tưởng chung (đó là một loại nhiễu được tạo ngẫu nhiên là bán kết hợp, do đó không chỉ là các giá trị pixel ngẫu nhiên).

Tôi chỉ có thể xác định kích thước vùng X theo X, thêm một số công cụ loại tải vùng và có một chút tiếng ồn tạo ra vùng. Nhưng điều này sẽ dẫn đến số lượng lớn các đảo.

Ở một thái cực khác, tôi không nghĩ rằng tôi thực sự có thể tạo ra một dải nhiễu perlin cực lớn. Và nó sẽ chỉ là một hòn đảo lớn, tôi nghĩ vậy.

Tôi khá chắc chắn tiếng ồn Perlin, hoặc một số tiếng ồn, sẽ là câu trả lời theo một cách nào đó. Ý tôi là, bản đồ rất đẹp. Và bạn có thể thay thế ascii bằng gạch, và có được một cái gì đó rất đẹp.


9
"sẽ dẫn đến một số lượng lớn các hòn đảo" - Hoặc nó tạo ra đất có hồ trong đó, nếu bạn chỉ trao đổi đất / nước.

3
Mặc dù vậy, bạn sẽ có được một lượng lớn hồ, trong một mô hình khá chuẩn.
Vịt Cộng sản

3
@Kylotan: Mincraft có kích thước vô hạn (cũng không hẳn, nhưng nó thực sự lớn ... tổng khối lượng = dài.MaxValue x 128 x long.MaxValue). Do đó, nó không tạo ra toàn bộ thế giới trong một lần chụp và cũng không lưu trữ toàn bộ bản đồ trong bộ nhớ. Nó tạo ra các vùng 16x128x16 không đồng bộ nếu chúng chưa được truy cập trước khi nó tải chúng từ đĩa.
zfedoran

2
@ Vịt Cộng sản: Đúng vậy, một trò chơi như minecraft có thể thoát khỏi việc sử dụng khoảng 2 đến 4 byte dữ liệu cho mỗi khối nhưng chỉ cần lưu một byte sau khi nó không còn hiển thị nữa (một byte mô tả loại khối , các byte khác mô tả ánh sáng và dữ liệu khác có thể được tính toán lại sau). Đây là nơi thú vị, bạn có thể sử dụng RLE để giảm đáng kể kích thước được lưu trữ xuống chỉ còn một vài byte do các khối có phần mạch lạc, như bạn đã đề cập.
zfedoran

4
'Thực sự lớn' không giống như vô hạn và bạn không thể sử dụng hai thuật ngữ thay thế cho nhau. Nếu bạn phát triển bản đồ và khi nó được phát hiện, đó là một kích thước hữu hạn phát triển theo yêu cầu - một đề xuất hoàn toàn khác với vô hạn. Mỗi bit tăng trưởng có thể được tạo ra khi cần thiết. Dữ liệu địa hình trong Minecraft rất dễ bị nén bởi vì có sự gắn kết cao giữa các dữ liệu. (ví dụ: RLE như đã đề cập.)
Kylotan

Câu trả lời:


35

Tôi nghĩ rằng tôi hiểu rõ hơn những gì bạn đang hỏi bây giờ.

Tiếng ồn không phải là ngẫu nhiên - nó trông ngẫu nhiên nhưng hoàn toàn dựa trên một công thức toán học và có thể lặp lại. Tất cả các thông tin được mã hóa trong công thức. Điều này có nghĩa là bạn có thể có một công thức có khả năng bao phủ một vùng vô hạn và chỉ cần sử dụng công thức trên tọa độ của khu vực bạn cần. Khi bạn cần một khu vực liền kề, bạn chỉ cần sử dụng lại công thức trên các tọa độ mới và vì công thức mang lại các giá trị liên tục, các khu vực sẽ nối liền nhau.

Đây là một ví dụ đơn giản, sử dụng nhiễu hình sin thay vì nhiễu perlin để tạo chiều cao và tưởng tượng thế giới là vô hạn trong trục X nhưng chỉ cao 1 đơn vị trong trục Y và Z.

Công thức là: height(x,y) = sin(x/20)

Trò chơi bắt đầu và chúng tôi tạo ra độ cao cho khu vực gần đó, tức là. (0,0) đến (9.0):

[0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.34, 0.39, 0.43]

Chúng tôi có một ngọn đồi, vươn lên về phía bên phải. Giả sử chúng ta đi đến cuối của nó và cần tạo các giá trị từ (10,0 đến 19,0) ngay bây giờ:

[0.48, 0.52, 0.56, 0.61, 0.64, 0.68, 0.72, 0.75, 0.78, 0.81]

Lưu ý cách ngọn đồi tiếp tục tăng đều đặn và giá trị ở (10.0) tiếp tục duy trì từ điểm ở (9.0). Điều này là do hàm sin liên tục, về cơ bản có nghĩa là nếu bạn cung cấp cho nó 2 số liền kề, bạn sẽ nhận được 2 kết quả liền kề - cho một định nghĩa nhất định về liền kề. Vì vậy, nếu bạn sử dụng tọa độ thế giới của mình làm tham số cho chức năng xác định thế giới của mình, bạn sẽ có được một cảnh quan liên tục khớp với nhau cho dù bạn tạo ra bao nhiêu hay ít một lúc. Khi bạn tạo các phần mới, chúng sẽ tự động chuyển từ các phần hiện có, vì độ cao đã được xác định trước.

Nếu thế giới sẽ không thay đổi, bạn thậm chí không cần lưu trữ bất cứ thứ gì, vì bạn có thể tính toán chính xác chiều cao ở bất kỳ điểm nào từ công thức. Rõ ràng với một thứ như Minecraft, thế giới hoàn toàn biến dạng, vì vậy bạn chỉ cần lưu từng khối khi bạn tạo ra nó. Cho rằng có sự kết hợp cao giữa các khối liền kề (nghĩa là nếu 1 khối là cỏ, thì nhiều khả năng không phải là khối bên cạnh nó cũng là cỏ), bạn có thể nén dữ liệu rất hiệu quả - mã hóa độ dài chạy sẽ hoạt động hiệu quả tốt, nhưng sau đó sẽ gần như bất kỳ thuật toán nén tiêu chuẩn.

Trong khi tôi đã nói về chiều cao là giá trị rõ ràng nhất, bạn có thể sử dụng cùng một hệ thống để tạo ra bất kỳ đặc điểm nào bạn muốn. Sử dụng hàm toán học với các thuộc tính liên tục và trong đó các đầu vào là tọa độ thế giới của bạn và có thể quyết định sự hiện diện của các mốc, mỏ khoáng sản, điểm sinh sản, bất cứ điều gì bạn thích. (Rõ ràng các giá trị trong một công thức có thể ảnh hưởng đến một công thức khác - không có điểm nào đặt mỏ than giữa không trung, do đó bạn tạo bản đồ chiều cao thế giới và sau đó chỉ tính toán khả năng than cho các khối đủ xa dưới mặt đất.)


Bạn chắc chắn đã giúp làm sáng tỏ mọi thứ, cảm ơn. :) Nhưng một cái gì đó như chức năng tiếng ồn sẽ không liên tục. Và AFAICS, nếu liên tục tôi sẽ không nhận được một thế giới 'ngẫu nhiên'. Hay tôi đang thiếu một cái gì đó ở đây?
Vịt Cộng sản

Xin lỗi cho nhận xét kép, nhưng tôi cảm thấy ở trên là tách biệt với điều này. Khi bạn nói 'sử dụng tọa độ thế giới cho tiếng ồn perlin', đây có phải là loại hiệu ứng tương tự như tạo ra tiếng ồn 'khổng lồ' nhưng theo từng phần không? Tôi cảm thấy một chút chậm trên sự hấp thu ngày hôm nay.
Vịt Cộng sản

Chà, việc tạo ra tiếng ồn của bạn chắc chắn có thể liên tục, và thường là bởi vì bạn làm cho nó mượt mà. Để vượt qua các ranh giới, bạn có thể cần phải đọc qua biên giới một chút, nhưng nguyên tắc vẫn giữ nguyên. Nếu tiếng ồn trong câu hỏi cần dữ liệu giả ngẫu nhiên, thì bạn tạo ra dữ liệu đó từ số lượng đã biết - tức là. một hàm băm của tọa độ thế giới của bạn. Các đầu ra sau đó có thể dự đoán được.
Kylotan

2
Đối với tính ngẫu nhiên, mỗi thế giới có thể có giá trị hạt giống riêng được sử dụng trong các tính toán. ví dụ. sin (x + seed) thay vì sin (x), trong ví dụ của tôi ở trên. Mỗi hạt giống khác nhau sẽ tạo ra một thế giới khác nhau. Và liên quan đến tờ giấy lớn ... Tôi không chắc nó có liên quan gì. Không quan trọng bạn tạo ra bao nhiêu hoặc ít hay khi bạn làm như vậy. Trạng thái ban đầu của thế giới được xác định bởi công thức toán học và bạn chỉ cần sử dụng công thức đó để khám phá trạng thái đó khi và khi bạn cần.
Kylotan

32

Hướng dẫn này tôi đã viết nhiều năm trước có thể cung cấp cho bạn một cái gì đó giống như những gì bạn muốn:

văn bản thay thế

Nếu bạn thực hiện sửa đổi đảo ở bước cuối cùng, nó có xu hướng hướng về một vùng đất duy nhất không chạm tới rìa bản đồ.


7
Hình dung tuyệt vời!
zfedoran

3
Tôi nhớ sử dụng hướng dẫn này khi làm luận án thạc sĩ về mô phỏng các hiện tượng tự nhiên. Tôi đã sử dụng ví dụ "ngọn đồi" để tạo vòm trời trên thế giới 3D của mình. Giới thiệu tuyệt vời về khái niệm thế hệ địa hình.
C.McAtackney

1
Thật điên rồ, thật tuyệt vời! Tôi không biết ai đã từng thực sự sử dụng nó.
khoan hồng

1
CHÚA ƠI !!! Tôi cũng đã sử dụng điều này trong một dự án trước đây ... cách đơn giản nhất để tạo địa hình mà tôi từng gặp !!!
Chiến tranh

15

Để tạo một hòn đảo lớn, bạn không cần phải tạo tất cả cùng một lúc. Tôi sẽ xây dựng các vùng không đồng bộ khi bạn truy cập chúng.

Thay vì sử dụng mặt nạ để tạo hòn đảo như bài viết mô tả, một điều bạn có thể làm là chơi với các bước sóng quãng tám nhiễu perlin để đạt được giao diện mà bạn đang hướng tới. Thông thường, quãng tám đầu tiên mô tả hình dạng chung của địa hình. Tất cả quãng tám sau khi nó chỉ đơn giản là thêm chi tiết hạt mịn hơn. Do đó, hãy chơi với bước sóng của quãng tám đầu tiên để kiểm soát lượng đất của bạn sẽ lớn như thế nào. Nếu bạn muốn vùng đất ở trung tâm, bạn chỉ cần giảm bản đồ chiều cao thêm một chút khi bạn di chuyển ra khỏi trung tâm và sau đó bình thường hóa tiếng ồn. Ví dụ, hãy tưởng tượng kết hợp cả hai để tạo hòn đảo của bạn:

quãng tám đầu tiên chi tiết

Bài viết này sẽ giúp: http://freespace.virgin.net/hugo.elias/models/m_perlin.htmlm

Nếu bạn muốn tìm hiểu về thế giới 3d vô hạn và về các thủ thuật khác nhau, bạn có thể sử dụng để thay đổi diện mạo của địa hình thông qua việc chơi với đầu vào và đầu ra tiếng ồn, hãy xem bài viết này: http://http.developer.nvidia.com /GPUGems3/gpugems3_ch01.html

Nó có thể là một chút khó đọc nếu bạn không quen thuộc với đường ống đồ họa và lập trình shader.


Loại hiệu ứng tôi muốn đạt được là thứ gì đó giống như bản đồ 2 chiều từ trên xuống của Minecraft (không phải trò chơi) ... nếu tôi chỉ sử dụng ít quãng tám, tôi vẫn không cần phải tạo ra một dải nhiễu perlin lớn chứ? Hoặc bằng cách nào đó tôi có thể tạo ra một lượng rất nhỏ của nó?
Vịt Cộng sản

Tôi nghĩ rằng bạn có thể vẫn còn một chút bối rối về cách hoạt động của tiếng ồn perlin. Bạn có thể tạo từng khối 16x16 khối riêng lẻ bằng cách gửi hàm bù cho tọa độ x và y cho nhiễu perlin. Lưu ý cách hàm PerlinNaty_2D (float x, float y) thực hiện trong tọa độ x và y. Nói cách khác, nó tạo ra nhiễu cho một số vị trí (x, y). Ngoài ra, tạo ra quãng tám ít hơn không giống như thay đổi bước sóng của quãng tám. Ít quãng tám => Ít chi tiết hạt mịn. Bước sóng dài hơn => phóng to hơn.
zfedoran

Ngoài ra, đây là một bài viết với mã chỉ cho bạn cách thực hiện thu phóng / bước sóng dài hơn: dreamincode.net/forums/topic/66480-perlin-noise
zfedoran


7

Tiếng ồn Perlin và bạn bè là một điểm khởi đầu tốt nhưng có lẽ bạn muốn tiến xa hơn một bước. Hầu hết các máy phát điện dựa trên tiếng ồn phổ biến sẽ cho bạn một kết quả khá không thú vị. Để làm cho địa hình thực tế, bạn muốn xem xét các thuật toán mô phỏng hiệu ứng xói mòn. Một trong những game mô phỏng thế giới trò chơi tiên tiến nhất hiện có - Pháo đài lùn - thực hiện mô phỏng xói mòn như một trong những bước xây dựng thế giới.

Một trong những giải pháp khá hay mà tôi đã thấy được mô tả trong bài viết "Lắng đọng hạt nâng cao" trong Đá quý lập trình trò chơi 7. Có rất nhiều giải pháp khác có sẵn trên Internet vì vậy có rất nhiều tài nguyên để rút ra (ví dụ 1 hoặc 2 ) .

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.