방법 I은 Perlin 노이즈 알고리즘을 개선 할 수 있는가?
이것은지도의 각 픽셀을 간단한 p -> f(p)
수학 함수를 통해 변환하여 얻을 수 있습니다.
자주색 선을 파란색 곡선으로 매핑하는 함수를 고려해보십시오.이 함수는 높이가 낮은 높이와 높이가 높은 높이를 강조하지만 가파른 점 사이의 전환을 만듭니다 (이 예는 곡선을 만드는 코사인 함수입니다. 덜 매끄러운 것이 변형을 더 두드러지게 만듭니다).
판매용 선명 피크를 만드는 곡선의 하반부를 사용할 수 있고, 평탄한 (따라서 더 플레이) 위치 영역을 하향 조정한다. 곡선
"선명도"이 용이하게 (더욱 극적인 효과를 만들) 또는 제곱근 (효과 감소) 파워로 변조 될 수있다. 이것의
구현 (당신은 코사인 함수를 사용하는 경우 특히) 실제로 매우 간단합니다 - 그냥 맵의 각 픽셀에 기능을 적용 할 수 있습니다. 함수가 수학적으로 그렇게 쉽지 않다면, 룩업 테이블은 잘 동작합니다 (테이블 값 사이의 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]
. 당신은이 그림에이 방법을 볼 수 있습니다
는 :
내가 찾았 정확히 무엇을 그
(나는 내 자신의 terrain generation project이를 만들었습니다)! 철저하고 종합적인 답변에 감사드립니다! 매우 강력하고 유연한 솔루션처럼 보입니다. 내 자신의 프로젝트에서 이러한 기술을 사용할 수 있기를 기대합니다. – meltedspark