2012-11-24 3 views
2

Perlin Noise 세대에 약간의 문제가 있습니다. 어떻게 작동하는지 여러 기사를 읽었습니다. 나는 다음과 같은 코드로 구현 :이 거대한 코드 덤프Perlin 잡음이 작동하지 않습니다.

//performs perlin noise function 
public static float[][] getPerlinNoise(int octaves, long seed) { 
    float[][] noise = new float[Main.csX][Main.csY]; 
    for(int z = 0; z < octaves; z++) { 
     float f = (float)Math.pow(2, z); 
     PerlinNoise oct = new PerlinNoise(seed, f); 
     for(int y = 0; y < Main.csY; y++) { 
      for(int x = 0; x < Main.csX; x++) { 
       noise[x][y] = (noise[x][y] + oct.getInterpolatedNoise(x * f, y * f)) * (float)Math.pow(p, z); //<- pumps out numbers between -1.0 and 1.0 
      } 
     } 
    } 
    return noise; 
} 

죄송합니다 : 내가 함께 내 모든 옥타브를 추가 할 때 여기

package PerlinNoise; 
import java.util.Random; 

public class PerlinNoise { 

private long seed; 
private Random rand; 
private float f; 

public PerlinNoise(long seed, float f) { 
    this.seed = seed; 
    this.f = f; 
    rand = new Random(); 
} 

//interpolates generated noise 
public float getInterpolatedNoise(float x, float y) { 
    float a = (int) Math.floor((double) x/f); 
    float A = a + 1; 
    float b = (int) Math.floor((double) y/f); //<-- define the points around the point 
    float B = b + 1; 
    return cosineInterpolate(
      cosineInterpolate((float) getNoise(a, b), (float) getNoise(A, b), (float) (x - a * f)/f), 
      cosineInterpolate((float) getNoise(a, B), (float) getNoise(A, B), (float) (x - a * f)/f), 
      (float) (y - b * f)/f); //<-- interpolates everything 
} 

//cosine interpolation 
private float cosineInterpolate(float a, float b, float x) { 
    float f = (float) ((1f - Math.cos(x * Math.PI)) * .5f); 
    return a * (1f - f) + b * f; 
} 

//generates random noise value between -1.0 and 1.0 
private float getNoise(float x, float y) { 
    if(y < 0) { 
     rand.setSeed((long) (332423 * (Math.sin(Math.cos(x) * x) + Math.cos(Math.sin(y) * y) + Math.tan(seed)))); 
    }else{ 
     rand.setSeed((long) (432423 * (Math.sin(x) + Math.cos(y) + Math.tan(seed)))); 
    } 
    float n = (float)(((float)rand.nextInt(255) - (float)rand.nextInt(255))/255.0f); 
    return n; 
} 

그리고입니다. 코드를 실행하면 작동하지만 Perlin 노이즈는 발생하지 않습니다. 난 그냥이 얻을 :

Definitely not Perlin Noise..

이 blurY의의 더는 무엇보다 소음을 혼합. 옥타브를 더 추가하거나 지속성을 높여도 매우 비슷한 결과를 얻습니다. 코드를 작성하기위한 참조로 this 문서를 사용했습니다 (또한 this 하나). 그래서 누군가가 왜 이것이 작동하지 않는지에 대한 아이디어가 있다면, 제발 대답/대답하십시오. 감사!

+2

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

아니요. 나는 단지 응답을 기다릴 것이라고 생각합니다. 감사합니다 – CoderTheTyler

+0

또는 respone에 대한 희망 : D – CoderTheTyler

답변

0

나는이 문제를 겪었으며, Perlin Noise로 시작하는 사람들에게는 상당히 일반적입니다. 나는 일어나는 일이 너무 멀어진 지점에서 펄린 노이즈를 샘플링하고 있다는 것을 믿습니다. f에 0.1을 곱해보고 도움이되는지 확인하십시오. 또한 처음에는 한 옥타브 만 사용해보십시오. 디버그에 도움이됩니다.

+0

나에게 좋은 소리입니다. 감사합니다 – CoderTheTyler

+0

글쎄요? 그 일 했니? –

관련 문제