我需要使用我寫的perlin噪聲程序在Java中爲3D行星(球體)生成紋理。但問題在於左右兩邊需要相同,也是上下,因此您可以將紋理放置在球體上。Java - 佩林噪聲循環
我不能在這裏把柏林噪聲源,因爲它太長時間,但它主要是基於http://devmag.org.za/2009/04/25/perlin-noise/
我需要使用我寫的perlin噪聲程序在Java中爲3D行星(球體)生成紋理。但問題在於左右兩邊需要相同,也是上下,因此您可以將紋理放置在球體上。Java - 佩林噪聲循環
我不能在這裏把柏林噪聲源,因爲它太長時間,但它主要是基於http://devmag.org.za/2009/04/25/perlin-noise/
柏林噪聲的工作方式是,它一格的值之間的插值。
爲了這個目的,單純的噪音會更合適(否則噪音密度在兩極將不會相同,因爲您無法正確地用正方形鋪設球體)。
你需要將你的球體分成單形(在你的案例中是三角形),然後是每個三角形(每個點只有一次),隨機化一個值。
然後,您可以通過使用單純形噪聲方法進行插值來計算三角形每個點處的紋理。
如果你的噪聲函數縮放到4D,那麼你可以用兩個二維圓的座標來給x,y,z,w餵食。生成的圖像將在x軸和y軸上進行最佳平鋪。
例如(很邋遢,但爲清楚起見):
float textureSize = 1024.0f;
for(float i = 0.0f; i < textureSize; i += 1.0f){
for(float j = 0.0f; j < textureSize; j += 1.0f){
nx = cos((i/textureSize) * 2.0f * PI);
ny = cos((j/textureSize) * 2.0f * PI);
nz = sin((i/textureSize) * 2.0f * PI);
nw = sin((j/textureSize) * 2.0f * PI);
looped_noise = noise_4D(nx, ny, nz, nw, octaves, persistence, lacunarity, blah...);
noise_buffer[((int)i * (int)textureSize) + (int)j] = looped_noise;
}
}
如果函數不容易擴展到4D,嘗試用任何單一的噪音實現在那裏。