2010-06-28 2 views
13

나는 무작위로지도 생성기를 쓰고 놀고 있는데, 현실감 넘치는 풍경을 무작위로 생성하는 방법을 잘 모르겠습니다. 나는 로컬 스케일 맵 these sorts과 함께 일하고 있는데, 흥미로운 문제가있다.무작위 클러스터 및 경로를 생성하는 좋은 방법은 무엇입니까?

    Sparse Medium Dense 
Typical trees  50%  70%  80% 
Massive trees  —  10%  20% 
Light undergrowth 50%  70%  50% 
Heavy undergrowth —  20%  50% 

나무와 같은 공간에 존재할 수 덤불, 그래서 평균 드문 드문 숲이 25 % 전형적인 나무와 빛 덤불, 25 % 전형적인 나무를 가지고, 25 : 간단한 경우

하나는 forest입니다 경량 덤불 및 25 % 열린 공간. 중형 및 고밀도 삼림은 조금 더 생각할 것이지만, 문제가있는 부분이 아니라 전체가 균등하게 분산되어 있습니다.

내 문제는 퍼센트 제약 조건을 유지하면서 클러스터 및 경로 생성에 있습니다.

    Moor Swamp 
Shallow bog   20% 40% 
Deep bog   5% 20% 
Light undergrowth 30% 20% 
Heavy undergrowth 10% 20% 

깊은 수렁 사각형은 일반적으로 함께 클러스터링과 얕은 늪지 사각형의 불규칙한 링에 둘러싸여 있습니다 : Marshes이의 좋은 예이다.

추가지도 요소 인 hedgerow와 늪지를 가로지르는 열린 땅의 경로가있을 수도 있습니다. 지도의 전체 구성에는 요소의 X %가 포함되어야하지만 이러한 유형의지도 요소 (클러스터 및 경로)는 문제를 나타냅니다. 그러나 균등하게 분산되지는 않습니다. 스트림, pond, quicksand와 같은 다른 요소는 클러스터 또는 경로 유형 생성도 필요합니다.

이러한 제약 조건에서 현실적인 맵을 생성하는 데 사용할 수있는 기법은 무엇입니까?


나는 참고로, C#을 사용하고 있습니다 (그러나 이것은 C의 # - 특정 질문이 아니다.)

+0

그리드 기반 맵입니까? 귀하의 설명이나 링크에서 명확하지 않습니다. – academicRobot

+0

예, 그리드 기반, 아마도 20x20보다 작지는 않습니다 (더 큰 가능성이 있지만 약 50x50ish?) – dlras2

답변

21

현실적인 "임의"분포가 종종 Perlin Noise을 사용하여 수행을 할 수있는 당신이 언급 한 것처럼 "덩어리"를 가진 배포판을 제공하는 데 사용되었습니다. 이는 무작위 데이터 포인트의 선형 보간 값의 여러 레이어를 합산/결합하여 작동합니다. 각 레이어 (또는 "옥타브")는 마지막 데이터 포인트보다 두 배 많은 데이터 포인트를 가지며 더 좁은 범위의 값으로 제한됩니다. 결과는 임의의 질감을 보는 "사실적인"것입니다.

다음은 Hugo Elias의 the theory behind Perlin Noise의 아름다운 데모입니다.

여기 내가 처음 발견 한 것은 Perlin Noise in C#입니다.

당신이 할 수있는 일은 펄린 노이즈 이미지를 생성하고 "임계 값"을 설정하는 것입니다. 값 위에있는 것이 모두 "켜짐"이고 그 아래의 모든 것은 "꺼짐"입니다. 당신이 끝낼 것 인 것은 불규칙하고 굉장하게 보이는 문지방 위에 물건이있는 덩어리입니다. 임계 값보다 높은 지형 기능을 원하는 위치에 지정하기 만하면됩니다.

Here is a demonstration 프로그램이 Perlin Noise 비트 맵을 생성하고 시간이 지남에 따라 차단 임계 값을 조정하는 경우. 명확한 "clumping"이 보입니다. 그것은 당신이 원하는 것일 수 있습니다.

임계 값이 높으면 그 위에있는 점이 거의없고 스파 스가 있습니다. 그러나 임계 값이 낮아짐에 따라 이러한 포인트가 (펠린 노이즈의 특성에 따라) 덩어리로 성장하고, 이러한 덩어리 중 일부는 서로 결합하여 기본적으로 매우 자연스럽고 지형과 같은 것을 만듭니다.

기본적으로 PN 기능의 최고점과 최저점을 강조하는 Perlin Noise 기능의 "난기류"를 설정하여 "덩어리 요소"또는 기능의 덩어리를 설정할 수도 있습니다. 가까이 다가 가라.

이제 임계 값을 설정할 위치는? 임계 값이 높을수록 최종지도에서 지형지 물의 비율이 낮아집니다. 임계 값이 낮을수록 비율이 높아집니다. 당신은 그들과 어울릴 수 있습니다.당신은 아마도 약간의 수학으로 주위를 둘러 보면서 정확한 백분율을 구할 수 있습니다 (값의 분포가 Normal Distribution을 따르는 것 같아요, 틀릴 수 있습니다). 조정할 때까지 조정하십시오.

EDIT 주석에서 지적했듯이 누적 막대 그래프 (임계 값 미만의지도의 % 인덱스)를 작성하여 정확한 비율을 찾을 수 있습니다. 당신에게 필요한 퍼센트를 줄 수 있습니다.

여기서 가장 멋진 점은, 습지 기능과 같은 특정 기능 (예 : 습지 기능)을 주변에 집중시키는 기능을 만들 수 있다는 것입니다. 동일한 Perlin Noise지도를 두 번 사용합니다. 두 번째로 임계 값을 낮 춥니 다. 첫 번째는 덩어리가되고 두 ​​번째 것은 동일한 영역에서 덩어리가 될 것입니다. 그러나 덩어리가 확대됩니다 (앞서 게시 한 플래시 애니메이션 참조).

hedgerows와 같은 다른 기능의 경우 회전보다 직선으로 이동하는 경향이 큰 간단한 random walk 행을 모델링하여 페르 린 기반지도에 임의의 위치에 배치 할 수 있습니다.


샘플 여기

은 샘플 50 × 50 타일 스파 스 숲지도입니다. 덤불은 갈색이며 나무는 푸른 색 (미안)으로 어느 것이 어느 것이 명확하게 보이게됩니다.

나는 정확한 임계 값이 50 % 일치하지 않은이지도를 들면

Sparse Forest http://img688.imageshack.us/img688/7005/forestmap.png

; 나는 임계 값을 최대 값의 50 %로 설정했다. 통계적으로 이것은 매번 정확하게 정확히 50 %로 평균화됩니다. 그러나 그것은 당신의 목적을 위해 충분하지 않을 수도 있습니다. 이 작업을 수행하는 방법에 대한 이전 참고 사항을 참조하십시오. 그래서,

Marshes http://img202.imageshack.us/img202/5092/marshdemo.png

이 단지 50 × 50이다 : 여기


다시 회색과 깊은 습지, 얕은 습지와 습지 기능 (명확성을 위해, 덤불을 포함하지 않음)의 데모입니다 거기에서 유물이 있지만 깊이있는 습지에서 얕은 습지를 쉽게 자랄 수있는 방법을 볼 수 있습니다 - 동일한 Perlin 맵에서 임계 값을 조정하기 만하면됩니다. 이 중 가장 눈을 즐겁게하는 결과를주기 위해 임계점 수준에 눈을 돌 렸습니다. 그러나 자신의 목적에 따라 이전에 언급 한 것을 할 수 있습니다. 여기

같은 펄린 노이즈 맵에서 생성 된 습지지도이지만, 대신에 250x250 크기의 타일을지도 밖으로 뻗어 : 당신은 Voronoi 패턴 영역의 특정 유형에 대한 약간의 성공이있을 수 있습니다

Marshes 250x250 http://img251.imageshack.us/img251/2867/marshdemo250.png

+0

임계 값은 주어진 perlin 노이즈 비트 맵에 대해 정확히 계산 될 수 있습니다. 히스토그램을 만들고 히스토그램에서 분포에 상관없이 임의의 백분율로 나타나는 컷 오프 포인트 (유지할 범위)를 계산할 수 있습니다. 당신은 여러 가지 방법으로 이것을 할 수 있습니다. – Unreason

+0

Unreason - thanks; 나는 질문자가 ** 전체 비율 ** 대신에 전체 기능 **의 ** 비율 **을 원한다고 생각하는 질문을 완전히 오해 한 것 같습니다. ** 나는 나의 대답 =을 업데이트 할 것이다.) –

+0

나는 샘플을 좋아한다! 내가 올바르게 이해한다면 숲에 대한 두 개의 Perlin Noise 맵을 생성했습니다 (하나는 브러시 용이고 다른 하나는 나무 용입니다). 그런 다음 습지에 대해 하나의 맵을 생성하고 약간 다른 임계 값을 사용 했습니까? [gutgames] (http://www.gutgames.com/post/Perlin-Noise.aspx)의 코드를 사용 했습니까? 그렇다면 옥타브의 목적이 무엇인지 아십니까? 내가 찾은 다른 Perlin Noise 코드에는 그와 같은 루프가 없으므로 알아낼 수 없습니다. – dlras2

2

내가 이런 종류의 물건을 해본 적이 없다,하지만 여기에 몇 가지 생각이 있습니다.

임의 선택을 해당 유형의 기존 요소에 가까운 그리드 위치에 바이어 싱하여 클러스터를 얻을 수 있습니다. 모든 사각형에 기본값 1을 할당하십시오. 기존의 클러스터 된 요소가있는 사각형의 경우 인접한 사각형에 클러스터링 값을 추가합니다 (클러스터링 값이 높을수록 클러스터링이 강해집니다). 그런 다음 모든 사각형의 확률 분포 함수에서 그 유형의 다음 요소에 대해 무작위 선택을하십시오.

경로의 경우 경로가 단계적으로 확장된다는 점을 제외하고는 비슷한 절차를 수행 할 수 있습니다. 경로의 끝 옆에 사각형이 있고 그 밖의 모든 곳에 0이 표시됩니다. 방향 경로는 경로 방향으로 선택 확률을 높이면 수행 할 수 있습니다. 구불 구불 한 경로는 임의의 확장 과정에서 변경되는 방향을 가질 수 있습니다 (new_direction = mf * old_direction + (1-mf) * rand_direction, 여기서 mf는 0과 1 사이의 모멘텀 요소 임).

0

here 링크를 읽기 시작할 수 있습니다. 훨씬 더 나은 문서를보고 기억합니다. 내가 그것을 발견하면 게시 할 것입니다 (그것은 또한 L- 시스템을 기반으로했습니다).

하지만 일반적인 측면입니다. 당신이 직면하고있는 특정 문제에 당신이

  • 비율
  • 다른 규칙 (클러스터 및 경로)의 관점에서 모델링해야 추측

점은 비록 당신이 방법을 모르는 것입니다 주어진 속성으로 맵을 구성하려면 속성 (클러스터링 비율, 경로 니스)을 평가하고 점수를 매기면 무력을 사용하거나 다른 문제 공간을 횡단 할 수 있습니다.

여전히 생성적인 접근 방식을 원할 경우 생성 규칙을 좀 더 자세히 조사해야합니다. 여기에 내가

  • 다른 지형과
  • 같은 방법으로 패턴을 만드는 'clusterness', 'pathness'또는 균일 특성을 요구 한 지형 커버의 패턴을 만들 추구 할 생각입니다 그 깊은의 값 늪지는 신중하지 않고 확률 값을 할당합니다. 패턴은 당신이 그것을 커버의 요구 비율 함께
  • 혼합 다른 패턴을 생성 할 것이다 그런 방법이 확률을 정상화 할 수 생성 된 후
0

. 나는지도를 만드는 데 사용되는 것을 본 적이 없지만 여러 유사한 분야에서 사용되는 것을 보았습니다.

1

academicrobot의 의견을 확장하려면 일부 표 셀에서 기본 습지 또는 포리스트 시드로 시작하고 상관 된 임의 번호를 사용하여 원본에서 성장 시키십시오. 예를 들어 늪지대는 8 개의 인접 그리드 셀을 가질 수 있는데, 각각은 90 % 확률로 늪지이지만 10 % 확률이 될 수 있습니다. 시드에서 생태계 양식을 허용하고 올바른 것으로 나타날 때까지 상관 관계를 조정할 수 있습니다. 스프레드 시트에서도 쉽게 구현할 수 있습니다.

관련 문제