2012-03-06 2 views
0

내가 만들고있는 게임에 대한 데이터를 생성 할 때 펄린 노이즈 함수를 사용하지만 다른 이유로 입력에 대해 동일한 결과를 계속 반환합니다. 필자는 FBM 기능에서 디버깅을 시도하는 데 4 시간을 소비 했으므로 알아낼 수 없었기 때문에 Ken Perlin의 향상된 노이즈 기능을 시도해 보았습니다. 동일한 문제가 발생합니다.Perlin 다른 입력에 대해 동일한 결과를 반환하는 노이즈 함수

이유가 누구인지 아시겠습니까? 그것을 고치는 좋은 방법은 무엇입니까? 내가 할 수 있었던 유일한 것은 x와 y 좌표에 .6473과 같은 10 진수 값을 추가하는 것이었지만, 배열 내부에서 반복되는 값과 같은 다른 문제가 발생했습니다.

다음은 테스트 코드입니다. 노이즈 값으로 채워진 두 개의 다른 2D 배열을 만들려고합니다. x와 y 입력은 내 게임의 좌표입니다. 그 다음에 '* *'이 나오면 그 값을 늘리지 않으면 두 배열 모두 모두 0으로 채워집니다. 이 예에서 좌표 (0.0, -768.0) 및 (-1024.0, -768.0)은 정확히 동일한 노이즈 값을 반환합니다. 내 게임에서 9 개의 좌표가 동일한 값을 반환합니다.

I이 시험에 사용하고있는 Perlin 노이즈 함수 here

public class TestPerlinMain 
{ 
    public static void main(String[] args) 
    { 
     int seed = 532434; 

     //create first noise array 
     double x = 0.0; //x-coordinate 
     double y = -768.0; //y-coordinate 
     float z = 10.0f; 

     double[][] test = new double[15][15]; 

     System.out.println("Noise Array 1: "); 

     for(int i = 0; i < test.length; i++) 
     { 
      for(int j = 0; j < test[i].length; j++) 
      { 
       test[i][j] = ImprovedNoise.noise(x + (j * 64.0), y + (i * 64.0), 10.0); 
       x += .314f;//************ 

       System.out.print(test[i][j] + " "); 
      } 
      y += .314f;//*********** 

     } 
     System.out.println(); 

     //create 2nd noise array 
     double x2 = -1024.0; //x coordinate 
     double y2 = -768.0; //y coordinate 
     float z2 = 10.0f;  

     System.out.println(); 

     double[][] test2 = new double[15][15]; 

     System.out.println("Noise Array 2: "); 

     for(int i = 0; i < test2.length; i++) 
     { 
      for(int j = 0; j < test2[i].length; j++) 
      { 
       test2[i][j] = ImprovedNoise.noise(x2 + (j * 64.0), y2 + (i * 64.0), 10.0); 
       x2 += .314f;//************* 

       System.out.print(test2[i][j] + " "); 
      } 
      y2 += .314f;//************ 

     } 
     System.out.println(); 
    } 

답변

2

가 Perlin 노이즈는 모든 그리드 위치에서 0 (정수의 X, Y, Z)로 정의된다. 연결된 코드에서 직접 손으로 시뮬레이션하여이를 증명할 수 있습니다. 자신의 바닥을 뺄 때 x, yz 모두 0이되기 때문에, grad() 값이 모두 0 인, 그래서 lerp() 값은 원하는 노이즈를 얻을 수있는 방법은 여러 가지가 모두 0

있습니다. 먼저 z의 정수가 아닌 값을 사용하면 임의의 잡음 값을 가져야합니다. 그러나 그리드 간격이 64이므로 노이즈 기준보다 훨씬 큽니다. 정적 인 것처럼 보이며 Perlin 노이즈가 아닙니다. 더 나은 방법은 noise(j/4., i/4., z)과 같은 방법으로 잡음을 확대하는 것입니다. 각 노이즈 셀에 대해 4 포인트 샘플링하면 노이즈의 부드러움을 볼 수 있습니다. 당신이 당신의 배열에 모든 4 값을 반복받을 이유

참고 또한 노이즈 구현 (noise()의 첫 번째 줄을 볼 각 방향의 크기 256의 타일로 반복하도록 설계되어있다.입니다.

+0

내가 모든 것을 당신이 시도 나는 z를 비 int 값으로 만들었고 같은 결과를 얻었습니다. 노이즈 (j/4, i/4, z)를 제안하면서도 같은 결과를 얻었으므로 노이즈를 스케일링 해 보았습니다. 다른 모든 제안 또한 크기가 256x256 인 타일 또는 256 타일을 보유하고있는 배열을 의미합니까? – theDazzler

+0

마지막 단락에서 만들려고했던 점은 노이즈 함수가 모든 256 (x, y 및 z에서) 반복된다는 것입니다. (1, 3)의 값은 (257, 259) 또는 (1,769) 또는 일반적으로 (x + 256n, y + 256m)와 동일합니다. 1024 및 768은 물론 두 번째 배열은 첫 번째 배열과 일치합니다. –

+0

집에 도착하면 확인해 보겠습니다. 어쨌든 FBM 함수입니다. 테스트 용으로이 함수를 사용했습니다. 나는 어제 밤 몇 가지 변화를 일으켜서 일하게 만들었지 만 이상적이라고는 생각하지 않는다. – theDazzler

관련 문제