지도 생성을위한 랜덤 시드 기능?


28

(지도를 통해) 맵 변경의 시각적 경계로 임의의 타일 기반 맵을 생성하는 함수를 찾고 있습니다. 나는지도가 무한대로 크고 미로와 같은 구조를 원합니다.

그러나 세계가 무한하다면 플레이어가 이전에 있었던 곳으로 돌아 가면 문제가 발생합니다. 게임은 거기에있는 모든 것이 실제로 어떻게 생겼는지 기억해야합니다.

그래서, 나는 생각했다- "Minecraft는 어떻게이 문제를 해결합니까?" 그리고 나는 그들이 종자와 함께 임의의 종류의 난수 함수를 사용해야한다고 생각했습니다.이 함수는 앞으로 나올 수도 있고 뒤로 할 수도 있습니다. 그런 식으로 오래된 타일을 그대로 원래대로 재생성합니다.

이것에 대한 당신의 생각은 무엇입니까?


내 대답은 +5이지만 어떻게 질문은 +2입니까? 이것은 현재 첫 페이지에서 가장 좋은 질문 중 하나입니다.

2
마인 크래프트는 이미 방문 / 수정 한 청크를 저장 하지 않습니까?
FxIII

@FxIII : 풍경을 수정할 수 있기 때문에 Minecraft가 있어야합니다. 그렇게 할 수 없다면, 청크를 저장하는 것은 아마도 낭비이거나 적어도 과도한 합병증 일 것입니다.

@Joe Wreschnig : Ok, Ok ... 정말 큰 것을 놓친 것이 두려웠습니다!
FxIII

답변:


20

눈에 띄는 것은 난수 생성기노이즈 함수의 차이 입니다. 난수 생성기는 호출 할 때마다 다른 숫자를 추출합니다. 노이즈 함수는 맵 x와 y와 같은 몇 가지 인수를 취하여 임의의 통계적 속성을 갖는 숫자를 뱉지 만 매번 같은 인수에 대해 동일한 값을가집니다 . 즉, 적절한 수학 함수입니다.

이 두 가지는 매우 밀접한 관련이 있습니다. 노이즈 함수는 매번 다른 값 (예 : noise(1)등) 을 전달하여 난수 생성기를 시뮬레이션 할 수 있습니다 noise(2). 그리고 거대한 테이블에 덤핑 된 난수 생성기는 노이즈 함수로 작동 할 수 있습니다. 두 경우 모두 작업에 잘못된 도구를 사용하고 있습니다.

마인 크래프트는 특히 사용 펄린 노이즈 , 저렴한 컴퓨팅에, 그리고 존재의 바람직한 특성이 소음의 유형 연속 당신이 필요로하는 많은 차원으로의를 - 당신이 그래프 경우 f(x)에는 f(x + 1), 갑작스런 점프가되지 않습니다. 이것은 텍스처 변조, 체적 구름과 가스, 지형 생성과 같은 많은 것들에 매우 유용합니다.

구현을 찾고있는 Ken Perlin의 개선 된 Perlin 노이즈 생성기 는 가장 간단한 구현 중 하나입니다.


3
많은 난수 생성기는 시드를 사용하며 동일한 시드에 대해 동일한 수의 세트를 생성합니다.
thedaian

3
@thedaian : 모든 숫자를 재생성하지 않는 한이 경우 특히 유용하지 않습니다. 노이즈 함수를 사용하면 그 전에 499를 생성하지 않고도 500 번째 숫자를 얻을 수 있습니다.

Perlin Noise 알고리즘이 주어지면이를 교정 할 수 있습니까? 알고리즘이 벽 타일 팩을 생성 한 다음 공간 타일 팩을 생성 할 가능성이 더 높기를 원합니다.
Mathias Lykkegaard Lorenzen

3
당신은 내가 6 분 안에 준 링크를 읽고 이해하지 못했습니다.

1
이 답변은 노치의 블로그 게시물에 완료했을 : notch.tumblr.com/post/3746989361/terrain-generation-part-1
deceleratedcaviar

3

Minecraft가 세대를 제어하는 ​​방법은 게임의 모든 난수 생성을 시드하는 데 사용되는 수준 시드를 만드는 것입니다. 청크가 요청 될 때 디스크에 존재하지 않으면 레벨의 시드를 기반으로 Notch의 생성 기능을 사용하여 청크가 생성됩니다 . 그런 다음 나중에 디스크저장됩니다 .

비슷한 행동을하려는 것처럼 들리므로 안전한 방법입니다.


2

Joe가 지적했듯이 해시 함수를 찾고 있습니다. 일반적으로 랜덤 함수는 마지막으로 반환 된 숫자로 시드 된 해시 함수입니다. 따라서 Random()반환 Hash(seed)=1234되면 두 번째 호출 Random()은 계속 반환 Hash(1234)합니다.

의사 난수에 대한 간단한 해싱 함수를 찾고 있다면 MurMurHash를 확인하십시오 . C #으로 구현했으며 관심이 있다면 어딘가에 게시 할 수 있습니다. 이러한 해시 함수를 사용하는 Perlin Noise에 대한 자세한 정보는 here 에서 찾을 수 있으며 C #에서의 구현은 here 입니다.

이 모든 정보는 1 년 전에 여기 에서 Overflow에 대해 묻는 질문에서 비롯되었습니다 . 당신이 찾고있는 것을 절차 적 콘텐츠 생성이라고합니다. 더 많은 정보가 필요하면 검색하십시오. 행복한 지형 생성!


-1. Perlin noise의 해시는 MMH 또는 기타 암호화 해싱 루틴에 사용 된 기술과 유사하지 않습니다. C # 코드는 임의 값 사이에서 선형 보간을 수행하는 것처럼 보이는 가비지입니다. 적절한 Perlin 노이즈보다 훨씬 많은 메모리가 필요하며 느리게 실행될 수 있습니다.

1
@Joe-Perlin Noise 구현에 대해 매우 유감스럽게 생각합니다. Perlin Noise 자체는 해시 함수를 연속 노이즈 함수로 바꾸는 개념입니다. MurMurHash를 사용하여 많은 Perlin Noise를 매우 효과적으로 생성했습니다. C # 코드는 2D Perlin Noise에서 단일 점의 값을 프로그래밍 방식으로 결정하는 방법의 예입니다. 나는 그것을 프로덕션 환경에서 사용하지 않을 것이지만 내 의견으로는 게시 한 코드보다 걷는 것이 더 쉽다고 생각합니다.
dlras2

1
OP에는 노이즈 또는 해싱에 대한 지식이 없었기 때문에 필요한 것을 구현하는 방법을 스스로 조사하고 결정하기를 희망하는 참고 문헌을 제공하려고 시도했습니다.
dlras2

"Perlin Noise 자체는 해시 함수를 연속 노이즈 함수로 바꾸는 개념입니다." 아닙니다. Perlin 노이즈는 Ken Perlin이 발명 한 연속 노이즈 기능 중 하나입니다 (그리고 그가 "단순 노이즈"라고 부르는 기능은 아닙니다). 모든 연속 소음 기능이 Perlin 소음인 것은 아닙니다. 모든 연속 노이즈 함수가 그래디언트 노이즈 인 것은 아니며 Perlin 노이즈가 특정 예입니다. 당신이 연결 한 것은 그래디언트 노이즈가 아니라 가치 노이즈입니다.

링크의 코드는 Perlin 노이즈가 아니기 때문에 "보행하기가 더 쉽습니다". 부드럽 지 않습니다. 훨씬 더 많은 리소스를 사용합니다. 요컨대, 어둡기 때문에 걷기가 더 쉽습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.