Tạo hang với giun Perlin


11

Tôi hiện đang cố gắng tạo ra một địa hình Minecraft như voxel với 3D Simplex Noise và cũng muốn triển khai các hang động.

Tôi tìm thấy phương pháp của Perlin Worms trong chuỗi này , nó tạo ra kết quả thực sự tốt đẹp. Tuy nhiên, tôi không có manh mối về cách tạo ra nó trên một đoạn cơ sở. Điều này là có thể hay có bất kỳ sự thay thế nào tạo ra một con sâu tương tự như hang động trên một khúc gỗ bằng cơ sở không?

Chỉnh sửa: Đây là vấn đề mà tôi không biết cách giải quyết.

Chỉnh sửa2: Đây là kết quả của việc kết hợp Nhiễu đa âm 2D Rạng rỡ với sơ đồ độ cao Nhiễu đơn giản. Vẫn cần một số điều chỉnh, nhưng đây là kết quả tôi muốn. Cảm ơn Byte56.


Bạn nên sử dụng các công thức trực tiếp để tạo địa hình nếu có thể. Nếu bạn có thể tính toán một voxel chỉ dựa trên tọa độ của nó và không có thông tin về các vùng lân cận, các khối không còn là vấn đề nữa. Nếu bạn muốn sử dụng sâu perlin, mà tôi đoán không thể tính riêng cho từng voxel, hãy xem đoạn cuối trong câu trả lời được chấp nhận của câu hỏi bạn đã liên kết.
danijar

1
Về cơ bản, đó là câu hỏi của tôi. Địa hình cơ bản dễ tính toán chỉ với tọa độ đã cho, nhưng tôi không biết cách tính toán, có hang hay không.
user000user

Câu trả lời:


5

Hầu hết các thuật toán nhiễu perlin sẽ cho phép bạn truy xuất giá trị nhiễu tại bất kỳ vị trí nào, với một cái gì đó như noise(x,y,z). Điều này làm cho nó khá tầm thường để tạo ra tiếng ồn trên một khối bằng cơ sở chunk. Tất cả bạn cần làm là vượt qua vị trí toàn cầu, thay vì vị trí chunk.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

Vì vậy, bạn có thể thấy, chúng tôi đang tạo địa hình cho khối, bằng cách lặp qua các giới hạn của khối và kiểm tra xem vị trí toàn cầu đó có vững chắc hay không. Đây có thể là phương pháp tương tự bạn đang sử dụng để tạo địa hình nói chung.

perlinNoise.getcó một vị trí toàn cầu và trả về mật độ của nó. Trường hợp isSolidsẽ chỉ là một thử nghiệm đơn giản để xem liệu voxel có "đủ đậm đặc" để đủ điều kiện cho chất rắn hay không.

perlinNoise.getcó thể phức tạp hơn chỉ là một thuật toán nhiễu đơn giản. Bạn có thể kiểm tra dựa trên độ sâu của voxel trong thế giới của bạn. Ví dụ: nếu voxel nằm dưới mức bạn đã quyết định là "mức cơ sở tuyệt đối" thì nó có thể sử dụng thuật toán sâu perlin để trả về mật độ, nếu nó ở trên cơ sở tuyệt đối, nó có thể sử dụng hàm mật độ bình thường để cung cấp cho bạn địa hình đa dạng hơn. Tôi muốn giới thiệu một số pha trộn giữa hai tuy nhiên.

Kết hợp các chức năng tiếng ồn Perlin khác nhau chỉ là thứ bạn phải chơi và xem những gì hoạt động. Tốt nhất là thiết lập môi trường của bạn để bạn có thể thay đổi một số giá trị và trao đổi nóng địa hình mà không cần tải lại trò chơi của mình. Hạnh phúc thử nghiệm.


2
Cảm ơn câu trả lời. Tuy nhiên, tôi không biết cách sử dụng tiếng ồn Perlin hoặc Simplex "thông thường" để tạo ra các hang động giống như sâu. Chúng có dạng hình cầu, được thu nhỏ theo một hướng hoặc không dài lắm. Và đối với thuật toán Perlin Worms, tôi không biết cách xác định xem vị trí hiện tại có nằm trong một con sâu hay không mà không biết vị trí đầu.
user000user

1
Thuật toán sâu không dựa vào việc biết "vị trí đầu". Từ những gì bạn đang nói, có vẻ như vấn đề của bạn không phải là tạo ra tiếng ồn trên cơ sở khối. Có hướng dẫn về câu hỏi bạn liên kết để thực hiện sâu perlin. Làm thế nào để tạo địa hình "thông thường" có thể được tìm thấy ở đây .
MichaelHouse

Thế hệ địa hình cơ bản với 3D Simplex Noise hoạt động tốt, nhưng tôi không biết cách xác định vị trí / phân đoạn sâu trong một khối. Từ những gì tôi hiểu, bạn cung cấp cho sâu một vị trí đầu và n phân đoạn và tính góc giữa các phân đoạn có chức năng nhiễu. Đây là một hình ảnh có thể giải thích rõ hơn, vấn đề của tôi là gì: liên kết .
user000user

2
Có nhiều loại tiếng ồn khác nhau. Sử dụng một vị trí đầu và làm theo từ đó là một phương pháp. Nếu bạn nhìn gần cuối trang này , bạn sẽ tìm thấy một số tiếng ồn tạo ra loại tiếng ồn bạn muốn mà không cần vị trí đầu trước.
MichaelHouse

Cảm ơn gợi ý về điều đó. Mặc dù vậy, tôi đã thực hiện Nhiễu đa âm 3D Ridged, kết quả với nó khá là không thỏa mãn. Tôi sẽ cố gắng kết hợp nó trong 2D với 2D Widthmap và sau đó báo cáo lại. Điều này có thể tạo ra nhiều hang động giống như sâu.
user000user

3

Tôi nghĩ đây là cách nó hoạt động trong Minecraft. Mỗi con sâu có chiều dài tối đa (hãy gọi nó là M). Đầu của mỗi con sâu được tính toán dựa trên vị trí khối. Khi bạn kết xuất từng khối, bạn phải kiểm tra tất cả các khối trong Mbán kính và theo dõi tất cả các con sâu của chúng. Nó không lý tưởng về hiệu suất, nhưng nó hoạt động.

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.