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.get
có một vị trí toàn cầu và trả về mật độ của nó. Trường hợp isSolid
sẽ 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.get
có 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.