Bây giờ tôi đã làm việc với một trò chơi 3D trong java bằng cách sử dụng LWJGL. Tôi đang cố gắng tạo địa hình 3D vô hạn được tạo theo thủ tục được tạo xung quanh người chơi.
Cho đến nay tôi có:
- Các khối địa hình 3D được tải và không tải khi người chơi di chuyển. Các khối này được tạo thành từ các hình tam giác không phải hình tứ giác, và là các đỉnh 128x128.
- Một lớp tiếng ồn Perlin có thể tạo ra tiếng ồn Perlin thành công. (Tôi nghĩ rằng nó thực sự là một cái gì đó gọi là nhiễu giá trị, nhưng nó hoạt động)
- Một lớp thế giới xử lý việc tải và dỡ các khối, và áp dụng các bản đồ chiều cao cho các khối.
Tất cả điều này hoạt động như nó được mã hóa để làm, nhưng không phải là cách tôi muốn nó. Tôi không biết làm thế nào để giảm tiếng ồn một cách liền mạch.
Làm thế nào tôi có thể tạo ra các ô nhiễu, và hơn nữa, làm thế nào tôi có thể tạo ra các cấu trúc lớn như những ngọn núi chiếm tới hàng trăm khối.
Đây là những gì hiện đang xảy ra với các khối và tiếng ồn không ốp lát:
Đây là mã tiếng ồn Perlin của tôi:
private float[][] perlinNoise(int width, int height, int octave, float[][] whiteNoise)
{
float[][] result = new float[width][height];
int samplePeriod = 1 << octave;
float sampleFrequency = 1.0f / samplePeriod;
for (int i = 0; i < width; i++)
{
int x1 = (i / samplePeriod) * samplePeriod;
int x2 = (x1 + samplePeriod) % width;
float xBlend = (i - x1) * sampleFrequency;
for (int j = 0; j < height; j++)
{
int y1 = (j / samplePeriod) * samplePeriod;
int y2 = (y1 + samplePeriod) % height;
float yBlend = (j - y1) * sampleFrequency;
float top = (float) MathHelper.interpolateLinear(whiteNoise[x1][y1], whiteNoise[x2][y1], xBlend);
float bottom = (float) MathHelper.interpolateLinear(whiteNoise[x1][y2], whiteNoise[x2][y2], xBlend);
result[i][j] = (float) MathHelper.interpolateLinear(top, bottom, yBlend);
}
}
return result;
}
public float[][] generatePerlinNoise(int width, int height, Random random, int octaveCount)
{
float[][] whiteNoise = new float[width][height];
float[][][] totalNoise = new float[octaveCount][][];
float[][] perlinNoise = new float[width][height];
float amplitude = 1.0f;
float totalAmplitude = 0.0f;
float persistance = 0.5f;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
whiteNoise[i][j] = random.nextFloat() % 1;
}
}
for (int i = 0; i < octaveCount; i++)
{
totalNoise[i] = perlinNoise(width, height, i, whiteNoise);
}
for (int o = octaveCount - 1; o >= 0; o--)
{
amplitude *= persistance;
totalAmplitude += amplitude;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
perlinNoise[i][j] += totalNoise[o][i][j] * amplitude;
}
}
}
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
perlinNoise[i][j] /= totalAmplitude;
}
}
return perlinNoise;
}
Tôi nghĩ cũng đáng để đề cập rằng tôi cũng đã hỏi về điều này trên StackOverflow .