2014-04-24 9 views
4

지형의 절차 생성을 구현하고 싶습니다. 철저한 연구 끝에 필자는 Perlin Noise 알고리즘과 같은 그래디언트 (일관된) 노이즈 생성 알고리즘 중 하나로 구현되어야한다는 결론을 내 렸습니다. 그러나 세대가 완전히 무작위 인 것은 원치 않습니다. 나는 몇 가지 제약 조건을 적용하고 싶다. (산맥이 어디인지, 저지대가되어야하는지 등).제한된 랜드 스케이프의 절차 생성

질문 : 예를 들어

좀 풍경 요소를 나타내는 곡선을 가지고있다. 커브는 점들의 배열입니다. 이 곡선을 ​​따라 노이즈 ( 간략화를 위해, 또는, 값 0) 값의 바람직한 범위가되도록

  • 방법 I은 Perlin 노이즈 알고리즘을 개선 할 수 있는가?
  • 또는 Perlin Noise 알고리즘 (2 차원 배열)의 출력이있는 텍스처를 가지고있는 경우 어떻게하면 을 원하는 노이즈 (곡선의 영향을 받음)로 변환 할 수 있습니까? 이 곡선을 따라 잡음 (간략화를 위해, 또는, 값 0) 값의 바람직한 범위가되도록

답변

10

방법 I은 Perlin 노이즈 알고리즘을 개선 할 수 있는가?

이것은지도의 각 픽셀을 간단한 p -> f(p) 수학 함수를 통해 변환하여 얻을 수 있습니다.

자주색 선을 파란색 곡선으로 매핑하는 함수를 고려해보십시오.이 함수는 높이가 낮은 높이와 높이가 높은 높이를 강조하지만 가파른 점 사이의 전환을 만듭니다 (이 예는 곡선을 만드는 코사인 함수입니다. 덜 매끄러운 것이 변형을 더 두드러지게 만듭니다).

Cosine value transform

판매용 선명 피크를 만드는 곡선의 하반부를 사용할 수 있고, 평탄한 (따라서 더 플레이) 위치 영역을 하향 조정한다. 곡선

Cosine value transform II

"선명도"이 용이하게 (더욱 극적인 효과를 만들) 또는 제곱근 (효과 감소) 파워로 변조 될 수있다. 이것의

enter image description here

구현 (당신은 코사인 함수를 사용하는 경우 특히) 실제로 매우 간단합니다 - 그냥 맵의 각 픽셀에 기능을 적용 할 수 있습니다. 함수가 수학적으로 그렇게 쉽지 않다면, 룩업 테이블은 잘 동작합니다 (테이블 값 사이의 3 차 보간, 선형 보간은 아티팩트를 만듭니다). (another question 내 aswer에서 복사)

당신이 필요로하는 모든 알려진 값 범위 (같은이 -1.0로 생성 된 노이즈를 변환하는 경우

-1.0),이 알고리즘을 사용

function scaleValuesTo(heightMap, newMin, newMax) 
{ 
    var min = min(heightMap); 
    var range = max(heightMap) - min; 
    var newRange = newMax - newMin; 

    for each coordinate x, y do: 
     hrightMap[x, y] = newMin + (heightMap[x, y] - min) * newRange/range; 
    end for 
} 

내가 산 범위이어야한다, 또는 어디 저지 등을 있어야 할 곳에 같은 (일부 제약 조건을 적용 할).

산이있는 곳을 지정해야하기 때문에 이것은 좀 더 복잡합니다. 가장 쉬운 해결책은 원하는 높이의 거친 모양을 가진 별도의 높이지도를 만드는 것입니다 (절차 적으로 또는 비트 맵에서로드 할 수 있음, 문제가되지 않음). 그런 다음 노이즈 맵과 함께 추가하십시오. 몇 가지 유의해야 할 점이 있습니다.

1) 템플릿지도에 날카로운 모서리가 없어야합니다 (지도가 결합 된지도에 표시 될 수 있음). 가우시안 블러와 같은보다 복잡한 필터가 더 나은 결과를 제공하지만 박스 블러는 일반적으로이 목적으로 충분합니다 (경우에 따라 상자 흐림은지도에서 날카로운 모서리를 보존합니다).

2) 높은 고도에서 노이즈 맵을 높이고 낮은 고도에서 낮은 우선 순위를 부여 할 수 있습니다. 이는 다음과 같이하면 쉽게 실현할 수 있습니다 : combinedMap[x, y] = templateMap[x, y] + (0.2 + 0.8 * templateMap[x, y]) * noiseMap[x, y]. 당신은이 그림에이 방법을 볼 수 있습니다

는 :

http://matejz.wz.cz/scheme.jpg

내가 찾았 정확히 무엇을 그

+0

(나는 내 ​​자신의 terrain generation project이를 만들었습니다)! 철저하고 종합적인 답변에 감사드립니다! 매우 강력하고 유연한 솔루션처럼 보입니다. 내 자신의 프로젝트에서 이러한 기술을 사용할 수 있기를 기대합니다. – meltedspark