진선웅 유저수만큼다양한섬을만들자 공개용

108
유저 수만큼 다양한 섬을 만들자! <야생의 땅: 듀랑고>의 절차적인 섬 생성 기법 What! Studio 진선웅

Upload: sunwung-jin

Post on 23-Jun-2015

6.921 views

Category:

Engineering


10 download

DESCRIPTION

[NDC 2014] 유저 수만큼 다양한 섬을 만들자 의 절차적인 섬 생성 기법 발표장에서 시간이 없어서 답변드리지 못했던 Q&A 내용들을 뒷 부분에 추가하였습니다. GIF 가 포함된 부분은 잘 나오지 않으므로 궁금하시면 직접 다운로드 받아서 보시기 바랍니다. - http://goo.gl/UUKmjL

TRANSCRIPT

Page 1: 진선웅 유저수만큼다양한섬을만들자 공개용

유저 수만큼 다양한 섬을 만들자! <야생의 땅: 듀랑고>의 절차적인 섬 생성 기법

What! Studio

진선웅

Page 2: 진선웅 유저수만큼다양한섬을만들자 공개용

발표 내용

• Voronoi Diagram + Fractal Noise를 통한 절차적인 섬 생성

• 공개된 Polygon map generation 방법 기반

• 실제 알고리즘 구현을 통한 툴 제작

• <야생의 땅 : 듀랑고>에 적용하기 위해 여러 가지 개선사항

Page 3: 진선웅 유저수만큼다양한섬을만들자 공개용

목차

• 절차적 섬 생성의 필요성

• 절차적 생성 방법

• 실제 구현

• 정리

Page 4: 진선웅 유저수만큼다양한섬을만들자 공개용

절차적 섬 생성의 필요성

Page 5: 진선웅 유저수만큼다양한섬을만들자 공개용

<야생의 땅: 듀랑고> 초기 비전

원시 야생 행성에 던져진 현대인이나 원주민이 되어,

공룡이나 차량을 타고 개척과 마을 건설을

플레이하는 크로스플랫폼 지원 MMORPG

원시 야생행성

현대인

원주민 공룡 공룡

차량

마을건설

개척

어떻게 표현 할 것인가?

Page 6: 진선웅 유저수만큼다양한섬을만들자 공개용

디렉터 님: 우리 게임의 배경은 제주도 같은 아열대 화산섬이다!

제주도 백록담 (photo)

Page 7: 진선웅 유저수만큼다양한섬을만들자 공개용

그 섬의 크기는 매우 크다 (10km x 10km)

© Blizzard

Page 8: 진선웅 유저수만큼다양한섬을만들자 공개용

예쁜 강과 호수, 바다가 있어야 하며

• 게임에서 물은 매우 중요 자원

• 오픈 월드 곳곳에 흐르는 물의 묘사가 필요

한반도의 공룡 (TV film)

Page 9: 진선웅 유저수만큼다양한섬을만들자 공개용

다양한 동/식물도 살고 있다

• 자연스러운 생물 군계 시스템이 필요

http://world-visits.blogspot.kr/ www.wikispaces.com

Page 10: 진선웅 유저수만큼다양한섬을만들자 공개용

그러한 섬들이 굉장히 많이 있고,

http://www.bibletour.net/956

Page 11: 진선웅 유저수만큼다양한섬을만들자 공개용

섬들의 모습은 전부 다르게 표현하고 싶다!

Page 12: 진선웅 유저수만큼다양한섬을만들자 공개용

어떻게 구현하지?

• 한 두 개도 아니고

• 손으로 만들다간 출시 불가

• 게다가 모바일!

이렇게 된 이상 절차적 생성으로 간다!

Page 13: 진선웅 유저수만큼다양한섬을만들자 공개용

혹시 World Machine 으로 안되나요

• 클릭 몇 번으로 그럴듯한 섬 데이터 생성 가능

Page 14: 진선웅 유저수만큼다양한섬을만들자 공개용

• 여러 가지 요구 사항에 대응하는 만능 툴은 아님

World Machine 이 매우 좋은 툴 이지만

rakuten.com

Page 15: 진선웅 유저수만큼다양한섬을만들자 공개용

요구 사항: 생물 군계 데이터 필요

• 단순 Height Map (x)

• 온도 / 습도에 따른 생물 군계

• 어떻게 후처리 잘 하면?

Page 16: 진선웅 유저수만큼다양한섬을만들자 공개용

요구 사항: 강 / 호수 / 바다의 표현

• Flow 데이터론 쉽지 않음

Palouse Falls Washington United States

Page 17: 진선웅 유저수만큼다양한섬을만들자 공개용

요구 사항: 서버 연동

• 서버 상황에 따른 실시간 생성

• 수 천 / 수 만개의 섬

• 자동화된 생성 과정 필요

Page 18: 진선웅 유저수만큼다양한섬을만들자 공개용

요구 사항: 다양한 기획 대응

• 여러 가지 요구 조건 증가 • 섬 크기 균일하게 • 생물 군계 분포 일정하게 • 자투리 섬 안 생기게 • 섬 모양이 이상해요

• 게임에 필요한 데이터 변화

• 빠르게 툴 수정해서 기민하게 대응

Page 19: 진선웅 유저수만큼다양한섬을만들자 공개용

그래서 절차적 섬 생성을 위한 툴을 직접 만들기로 했습니다!

Page 20: 진선웅 유저수만큼다양한섬을만들자 공개용

절차적 생성 방법

Page 22: 진선웅 유저수만큼다양한섬을만들자 공개용

Polygon Map Generation

• 원하는 기능이 전부 여기에...

• Flash로 된 오픈 소스제공(MIT License)

• 친절한 알고리즘 설명

이것부터

알아 봅시다

Page 23: 진선웅 유저수만큼다양한섬을만들자 공개용

일단 기본 용어 정의

• Node : 다각형

• Edge : 다각형 모서리

• Corner : 다각형 꼭짓점

• Center : 다각형 중심점

Corner

Node

Edge

Center

Page 24: 진선웅 유저수만큼다양한섬을만들자 공개용

다각형 데이터 구조 - Edge

• Edge • Corner 1 • Corner 2

Page 25: 진선웅 유저수만큼다양한섬을만들자 공개용

• Node • List of Nodes • List of Corners • List of Edges

다각형 데이터 구조 - Node

Node

Nodes

Node

Corners

Node

Edges

Page 26: 진선웅 유저수만큼다양한섬을만들자 공개용

• Corner • List of Nodes • List of Corners • List of Edges

다각형 데이터 구조 - Corner

Node

Node Node

Corners Edges

Page 27: 진선웅 유저수만큼다양한섬을만들자 공개용

시작: 다각형 데이터(Node) 생성

• 섬을 표현하기 위한 가장 기초적인 데이터

• 다양한 형태의 다각형(Node) 데이터 필요

• 다각형 생성(Node)을 위해선? • 사각형 공간 내에 무작위 점의 집합 생성 • 해당 점들을 통해서 Voronoi Diagram 생성

• Voronoi Diagram?

Page 28: 진선웅 유저수만큼다양한섬을만들자 공개용

Voronoi Diagram

• 주어진 점들로부터 거리에 따른 영역 분할

• 각 점들이 가지고 있는 일종의 영향력

• 무작위 점의 집합을 이용해서 다양한 모습의 다각형(Node) 생성 가능

• 생성된 다각형의 편차가 너무 큰 점이 문제

Page 29: 진선웅 유저수만큼다양한섬을만들자 공개용

Lloyd’s algorithm

• 각 다각형의 중심점(Node Center)을 인자로 사용

Voronoi Diagram 다시 생성 • 적당히 균일한 상태가 될 때까지 반복

(15회 반복)

해당 중심점들을 이용해서 Voronoi Diagram 다시 생성

Page 30: 진선웅 유저수만큼다양한섬을만들자 공개용

Lloyd’s algorithm

Page 31: 진선웅 유저수만큼다양한섬을만들자 공개용

Normalize Edge Length

• Edge를 좀 더 균일한 길이로 만들기 위해서

• Corner 위치를 이웃 Node Center의 평균값 으로 변경

Node

Node

Node

이웃 Node Center 들의 평균값으로 Corner 재배치

Page 32: 진선웅 유저수만큼다양한섬을만들자 공개용

Normalize Edge Length

Page 33: 진선웅 유저수만큼다양한섬을만들자 공개용

기본 섬 모양 생성

• 모든 Corner 의 ‘땅’ / ‘물’ 여부 결정 • Corner의 위치에 대응되는 Noise값 사용 • 특정 값 이상이면 ‘땅’ / 이하이면 ‘물’

• 모든 Node의 ‘땅’/ ‘물’ 결정 • Node를 구성하는 Corner들의 ‘물’ 비율에 따라서 ‘땅’ / ‘물’ 결정

물 물

Corner

땅 물

Page 34: 진선웅 유저수만큼다양한섬을만들자 공개용

기본 섬 모양 생성

Page 35: 진선웅 유저수만큼다양한섬을만들자 공개용

바다 생성

• 일단 사각형 가장자리에 있는 Node를 ‘바다’로 설정

• ‘바다’ Node의 이웃 Node로 전파 • 이웃 Node가 ‘물’일 경우 : ‘바다’ Node, 반복

Page 36: 진선웅 유저수만큼다양한섬을만들자 공개용

해변 생성

• ‘해변’ Node 설정 • 주변 Node의 일부가 ‘바다’ / 일부가 ‘땅’ 일 때

Page 37: 진선웅 유저수만큼다양한섬을만들자 공개용

섬의 높이 설정

• 만들려는 섬의 모습 • 섬의 중심이 가장 높고 가장자리로 갈수록 낮아짐

• 섬의 높이 = 해변으로부터의 거리에 비례

• 일단 가장자리에 있는 Corner 부터 높이 설정

• 이웃한 Corner 로 이동하면서 높이 증가시킴

• 이웃한 Corner가 ‘땅’일 때만 높이 값 증가 • 호수를 주위에서 가장 낮은 지역으로 만들기 위해서

해변 해변 중심

Hanauma bay

Page 38: 진선웅 유저수만큼다양한섬을만들자 공개용
Page 39: 진선웅 유저수만큼다양한섬을만들자 공개용
Page 40: 진선웅 유저수만큼다양한섬을만들자 공개용

섬의 높이 재분배

• 기존 높이값을 우리가 원하는 분포로 설정 • 기존 값은 어느 정도 경향은 있지만 Random

• Corner를 높이 순서대로 정렬 • 순서에 따라서 0~1 사이의 값을 설정 • 제일 높은 곳은 1, 중간 높이는 0.5, 가장 낮은 곳은 0

• 적당한 분포 함수를 적용해서 새로운 높이 할당 • 새로운 높이 = f( k / n ) • k 는 정렬 순서, n 은 전체 Corner 개수

Page 41: 진선웅 유저수만큼다양한섬을만들자 공개용

높이 분포 함수

yy

x

a

acbbxyxx

xxxxxy

112

)442(

)2

4(,02

2)21(1)1(1

22

222• y = 1-(x-1)^2

• 위쪽이 볼록한 2차 함수

• 해당 부분을 90도 회전한 모양

• 역함수를 구해서 적용

Page 42: 진선웅 유저수만큼다양한섬을만들자 공개용

높이 분포 함수

• y = x^2

• 사실 큰 차이는 안 남

• 취향대로 (...)

Page 43: 진선웅 유저수만큼다양한섬을만들자 공개용

섬의 높이 재분배

Page 44: 진선웅 유저수만큼다양한섬을만들자 공개용

강의 생성

• 물의 성질: 높은 곳에서 낮은 곳으로 흐름 • 산 정상에서 해안가로

• Corner의 높이 활용 • 모든 Corner가 인접한 가장 낮은 Corner를 알고 있음 • 가장 낮은 Corner를 따라가면 결국 해안가

www.scienceall.com

Page 45: 진선웅 유저수만큼다양한섬을만들자 공개용
Page 46: 진선웅 유저수만큼다양한섬을만들자 공개용

강의 생성

• 적당한 개수의 강 시작지점 선택 • 일정 높이 이상

• 여러 물줄기가 만나는 경우 강의 폭 증가

• 근처에 호수가 있을 경우 자연스럽게 호수 쪽으로 • 호수를 주위에서 가장 낮은 지역으로 처리했음

Page 47: 진선웅 유저수만큼다양한섬을만들자 공개용
Page 48: 진선웅 유저수만큼다양한섬을만들자 공개용

습도 설정

• 생물 군계 데이터를 생성 하는데 필요

• 기후 시뮬레이션? • 복잡한 계산 없이 그냥 강,호수 데이터 이용

• 강, 호수로부터의 거리에 따라서 상대 습도 값 설정 • 강, 호수 같이 ‘물’ 속성을 가진 Corner에 기본 습도 값 k 할당 • 주위 Corner 로 1보다 작은 값을 곱해서 전달 (ex: k * 0.9) • 반복!

Fig1 in Krahn 2004

Page 49: 진선웅 유저수만큼다양한섬을만들자 공개용
Page 50: 진선웅 유저수만큼다양한섬을만들자 공개용

습도 재분배

• 강 / 호수의 모양에 따라서 습도의 총 합이 달라짐 • 섬마다 총 습도의 합은 동일하게 유지되길 원함

• 모든 Corner를 습도 값으로 정렬

• 높이 재분배 할 때랑 같은 방식 • 순서에 따라 Corner에 1~0 사이의 습도 값 재 설정 • 제일 습도가 높았던 곳은 1, 중간은 0.5, 가장 낮았던 곳은 0

• 따로 분포 함수는 적용하지 않았음 • 그냥 f(x) = x 인 함수

이 부분의 합이 섬마다 달라짐

Page 51: 진선웅 유저수만큼다양한섬을만들자 공개용
Page 52: 진선웅 유저수만큼다양한섬을만들자 공개용

생물 군계 설정

• 습도 / 온도에 따른 생물 군계 • 다양한 동/식물 표현에 필요

• 온도는 높이를 이용해서 계산 • 높은 곳일수록 저온

• 이렇게 작은 섬에 저런 데이터가? • 게임적 허용 (...)

Page 53: 진선웅 유저수만큼다양한섬을만들자 공개용

생물 군계 설정

습도 온도

Page 55: 진선웅 유저수만큼다양한섬을만들자 공개용

섬 만들기 요약

Page 56: 진선웅 유저수만큼다양한섬을만들자 공개용

잠이 옵니다…

Page 57: 진선웅 유저수만큼다양한섬을만들자 공개용

여기까지는 전부 사이트에 있는 내용

• 짤방은 한땀 한땀 제가 만들긴 했지만...

• 설명이 부족하셨다면 사이트 방문을 권해드립니다

• 여기서 다루지 않는 몇 가지 추가사항

• Edge noise • Lava, Road 생성 • 필요하시면 역시 사이트 방문을 추천

Page 58: 진선웅 유저수만큼다양한섬을만들자 공개용

실제 구현

Page 59: 진선웅 유저수만큼다양한섬을만들자 공개용

Windows Form을 통한 툴 제작

• C#으로 쾌속 개발!

• 알고리즘 자체는 Flash code 가 제공되므로 간단

• Voronoi Diagram / Noise 생성 • 외부 라이브러리로 해결

• Rendering이 문제

• GDI+ 로 어떻게든 해결 • 그래도 힘든 건 Per Pixel 연산

Youtube: Top Ten Fastest Animals In The World

Page 60: 진선웅 유저수만큼다양한섬을만들자 공개용

Voronoi Diagram 생성

• Fortune’s algorithm 이용

• 위키에 잘 설명되어 있지만 직접 만들려니 (...)

Page 61: 진선웅 유저수만큼다양한섬을만들자 공개용

Fortune’s Voronoi algorithm

• Code Project 에 있는 C#용 Library 사용 • Fortune’s Voronoi algorithm implemented in C#

• 간편하게 사용 가능

• List<Vector> 로 입력 데이터 전달 • List <Edge> , Dictionary<Vector, Node> 로 데이터 출력 • Corner 데이터는 Edge / Node 모음을 통해서 생성

• MPL License • 원본 코드를 고칠 일은 없음 • 공개 배포 되는 프로그램도 아님

Page 62: 진선웅 유저수만큼다양한섬을만들자 공개용

Noise 생성

• 섬 생성 및 데이터 출력에 고품질의 Noise 필요 • 섬의 모양 생성 • 생물 군계 데이터

• LibNoise for .Net 이용 • A portable, open-source, coherent noise-generating library • 고품질의 다양한 Noise 지원 • libnoisedotnet.codeplex.com

• MIT License

Page 63: 진선웅 유저수만큼다양한섬을만들자 공개용

LibNoise for .Net

• 다양한 Noise 생성 방법 지원

• 3D Gradient Noise (Coherent Noise)

Coherent Non-Coherent

Perlin Ridged Billow Turbulence

Page 64: 진선웅 유저수만큼다양한섬을만들자 공개용

LibNoise for .Net

• Fractal Noise 생성 지원 • 자연적으로 많이 보이는 패턴과 유사

Freq=5 Freq=10 Freq=20

Freq=40 Freq=80

위 Noise를 전부 더해줌 (값은 고주파로 갈수록 작게)

Page 65: 진선웅 유저수만큼다양한섬을만들자 공개용

GDI+ Rendering

• 원하는 사이즈의 Bitmap 생성

• Graphics 객체를 이용해서 Node / Edge Rendering

• Bitmap 에서 Graphics 객체 가져오기 Graphics canvas = Graphics.FromImage(srcBMP);

• 기본 바탕색 설정 canvas.FillRectangle(clearBrush, 0, 0, srcWidth, srcHeight);

Page 66: 진선웅 유저수만큼다양한섬을만들자 공개용

Node Rendering

• Graphics.FillPolygon(Brush brush, PointF[] points) 사용

• Node에 미리 저장된 Corners 값 사용

• 기본적인 섬 Rendering 용도

Node

Corners

Page 67: 진선웅 유저수만큼다양한섬을만들자 공개용

Edge Rendering

• Graphics.DrawLine(Pen pen, PointF pt1, PointF pt2) 사용

• 주로 강 Rendering에 사용

• 그 외 디버깅 용도

• 섬의 윤곽 • 각 Node 구분

Page 68: 진선웅 유저수만큼다양한섬을만들자 공개용

Heightmap Rendering

• 기존 Node Rendering 방식 사용 불가 • Node 윤곽이 그대로 보임 • 각 Corner에 저장된 높이 값을 이용한 Gradient Rendering 필요

Page 69: 진선웅 유저수만큼다양한섬을만들자 공개용

Gradient Rendering

• Drawing2D.PathGradientBrush 사용

• PathGradientBrush(PointF[] points) • gradientBrush.CenterPoint • gradientBrush.CenterColor

• Node가 가지고 있는 높이 값 사용

• gradientBrush.SurroundColors • Corners가 가지고 있는 높이 값 사용

• Graphics.FillPolygon(gradientBrush, pointArray)

Brush 생성시 Node에 속한 Corners 값 넣어줌

Corners

Center

Page 70: 진선웅 유저수만큼다양한섬을만들자 공개용

Pixel Operation

• Bitmap을 Pixel 단위로 Read/Write 필요 • 최종 결과물에 Noise 적용, Mask 생성

• GetPixel, SetPixel 함수 사용 불가 • 믿을 수 없을 만큼 느림

• LockBits / unsafe block 이용 Rectangle rect = new Rectangle(0, 0, width, height); BitmapData data = bmp.LockBits(rect, ImageLockMode. ReadWrite, PixelFormat.Format32bppPArgb); unsafe { byte* origin = (byte*)data.Scan0.ToPointer(); } bmp.UnlockBits(data);

Page 71: 진선웅 유저수만큼다양한섬을만들자 공개용

그 외 환경설정 작업

• 게임에 쓰일 섬의 적절한 Preset을 찾기 위해서 필요 • 추후 Random Seed만 바꿔서 섬 대량 생산

• Random Seed 값 설정

• 섬의 크기 설정

• 점의 개수 설정

• 강의 개수/넓이 설정

• Noise 생성 옵션

Page 72: 진선웅 유저수만큼다양한섬을만들자 공개용

초기 모습

• 개발 초기 결과물 • 512x512, 점 10000개

• 섬이 좀... • 너무 고주파 Noise 사용 • Noise 설정 변경 필요

Page 73: 진선웅 유저수만큼다양한섬을만들자 공개용

중기 모습

• 새 Noise 적용 • 생물 군계 적용

• 강 추가

• 끝?

Page 74: 진선웅 유저수만큼다양한섬을만들자 공개용

Node 밀도 증가

• 게임에는 좀 더 디테일 한 모습 필요 • Node 형태 안 보이게

• 점 40000개 적용 • 밀도 2배

• 문제발생

의도했던 디테일은 증가하지 않고

오히려 전체적인 모양만 단순해짐

Page 75: 진선웅 유저수만큼다양한섬을만들자 공개용

고밀도 Node 문제

• 고밀도 Node 사이즈 소형화 • Node 배치에 따른 변화 량이 작아짐 • 섬의 외곽선이 점점 단순화

• Node 단위 작업

• 해변이 점점 짧아짐

• 생물군계 분포 • 점점 패턴이 보임 • Random 필요!

Page 76: 진선웅 유저수만큼다양한섬을만들자 공개용

해변이 짧아짐

• 일단 첫 번째 해변 Node 계산

• 그 후 해변 Node 주위의 Node를 해변으로 변경

• Node 밀도에 비례해서 반복 • 점 개수의 제곱근에 비례 • 10000개 1번 • 40000개 2번

Page 77: 진선웅 유저수만큼다양한섬을만들자 공개용

섬의 외곽선 단순화

• 저밀도 섬의 모양 미리 계산 • ‘땅’ / ‘물’ 여부를 Mask Map으로 저장

• 고밀도에서 앞의 Mask Map을 읽어서 ‘땅’ / ‘물’ 결정 • 저밀도에서 큰 폭의 변화 그대로 유지 • 저주파 데이터 + 고주파 데이터로 Detail : 일종의 Fractal

‘땅’ / ‘물’ 결정

Mask Map

Page 78: 진선웅 유저수만큼다양한섬을만들자 공개용

섬의 외곽선 단순화

Page 79: 진선웅 유저수만큼다양한섬을만들자 공개용

생물 군계 단순화

• 고밀도가 될수록 생물 군계 패턴이 단순해짐

• 생물 군계 계산시 Noise 적용

• Node의 Center 해당하는 위치에서 Noise 값 가져옴

• 기존 습도 / 온도에 Noise값 더해서 생물 군계 결정

습도 / 온도에 더해줌

Page 80: 진선웅 유저수만큼다양한섬을만들자 공개용

생물 군계 단순화

Page 81: 진선웅 유저수만큼다양한섬을만들자 공개용

One more thing!

• 생물 군계의 경계 부분이 아쉽다!

• 확대해서 보면 Node 모습으로 분리

• 실제 자연은 저렇게 칼같이 떨어지지 않음

• Pixel 단위로 섞어주면 어떨까?

Page 82: 진선웅 유저수만큼다양한섬을만들자 공개용

Pixel 단위 섞기

• 일정 범위 안의 Random한 Pixel과 교환

• 고주파 Noise를 이용해서 교환 Pixel 결정

(3) 교환

(2) Noise 값을 이용 일정 범위에서 교환할 Pixel 선택

(1) 현재 Pixel 위치에 해당하는 Noise 선택

Page 83: 진선웅 유저수만큼다양한섬을만들자 공개용

Pixel 단위 섞기 호수 / 바다는 따로 Mask 사용 섞이지 않게 해야 함

Page 84: 진선웅 유저수만큼다양한섬을만들자 공개용

참 쉽죠?

Page 85: 진선웅 유저수만큼다양한섬을만들자 공개용

추가 구현 내용

• 지금까진 주로 아티스트의 의도만 반영 • 일단 보기 좋게 만들자

• 게임 디자이너의 의도 역시 반영 되어야 한다!

• 디자인 요구사항

• 생성되는 땅의 면적 조절 기능 • 생물 군계의 비율 조절 기능 • 자투리 섬 생성 안되게 • 봉우리 개수 조절 가능하게

Page 86: 진선웅 유저수만큼다양한섬을만들자 공개용

생성되는 땅의 면적 조절기능

• Noise에 따라 달라지는 땅의 면적

• 섬마다 땅의 면적이 너무 차이 나면 문제

• 땅의 총 면적이 원하는 값이 되도록 “기준 값”수정

물 물

Corner

이쯤에서 섬 생성 로직 다시 리뷰 Corner의 위치에 해당하는 Noise값을 이용 “기준 값” 이상이면 ‘땅’ / 이하이면 ‘물’

Page 87: 진선웅 유저수만큼다양한섬을만들자 공개용

생성되는 땅의 면적 조절기능

• 알맞은 “기준 값” 을 찾기 위한 방법 • 땅의 면적은 기준 값의 크기에 따라 정렬 • 기준 값 땅의 면적 Binary Search

• 요구 면적에 근접할 때 까지 반복 • 땅의 면적 : 모든 ‘땅’ Node 면적의 합 • 그냥 모든 ‘땅’ Node 개수의 합으로 근사

Best

기준 값

땅의 면적

기준 값

요구 면적

Page 88: 진선웅 유저수만큼다양한섬을만들자 공개용

• 땅의 비율이 55% 정도가 되도록 기준 값 자동 조절

• 섬모양의 변화는 유지

• 땅의 면적은 비슷하게

• 고정된 기준 값

• 섬마다 땅의 면적 차이 발생

Before

After

Page 89: 진선웅 유저수만큼다양한섬을만들자 공개용

생물 군계의 비율 설정

결국 원화는 비율이 되도록 “기준 값“ (온도 A,B / 습도 I,K,M) 을 수정!

• 생성되는 생물 군계의 비율은 Random = 그때 그때 달라요!

• Seed 가 변해도 기획자가 설정한 생물 군계 비율은 유지되게!

생물 군계 설정 방법

if(온도 < A) if(습도 > I) = 설원 else = 툰드라

else if(온도 < B) = 온대림 else

if(습도 > K ) = 열대림 else if(습도 > M) = 초원 else = 사막

Page 90: 진선웅 유저수만큼다양한섬을만들자 공개용

생물 군계의 비율 설정

• 땅의 면적 조절 기능과 거의 비슷함

• (설원 + 툰드라) / 나머지는 온도 A로 구분

• 온도 A를 Binary search • 계산된 온도 A값을 확정 • 설원 / 툰드라를 구분하는 습도 I 계산

• 동일하게 B, K,M 을 계산 • 온도 B = 온대림 / (열대림 + 초원 +사막) • 습도 K = 열대림 / (초원 + 사막) • 습도 M = 초원 / 사막

온도 A

(설원 + 툰드라) Node 개수

온도 기준

요구 개수

Page 91: 진선웅 유저수만큼다양한섬을만들자 공개용
Page 92: 진선웅 유저수만큼다양한섬을만들자 공개용

여기까지가 현재 구현된 내용

• 그럭저럭 볼만한 섬 생성 가능

• 아직 서버 연동은 (...)

• 계산 시간

• 1024x1024, 40000개 기준 5초 정도 • 4096x4096, 640000개 기준 1분 이상 • Voronoi Diagram 생성에 많은 시간사용

Page 93: 진선웅 유저수만큼다양한섬을만들자 공개용

앞으로 개선할 사항

• 자투리 섬 생기지 않게 • 섬마다 개수 / 크기가 제각각 • 사실상 죽은 땅 • 본토 섬으로 병합처리 필요

• 호수의 면적이 일정하지 않음 • 지금은 땅의 면적만 일정하게 유지 • 호수가 너무 크거나 작으면 문제 • 일단 동일하게 섬 생성 과정 처리 그 후 섬 안에서 다시 호수 생성 하면?

Page 94: 진선웅 유저수만큼다양한섬을만들자 공개용

앞으로 개선할 사항

• 좀 더 자연스러운 강의 표현 필요 • 삼각주 / 곡류 / 선상지 등의 표현 • 좀 더 S라인이 되어야 할 듯?

www.scienceall.com

Page 95: 진선웅 유저수만큼다양한섬을만들자 공개용

정리

Page 96: 진선웅 유저수만큼다양한섬을만들자 공개용

다양한 모습의 디테일한 섬이 필요

• 서버 –

• 마을

서버 섬 크기 大

전체 서버 수 만큼 존재 미리 생산 가능

마을 섬 크기 中

유저 그룹만큼 존재

유저 개인 섬 크기 小

유저 수만큼 존재

서버와 연동해서 동적 생산 필요

Page 97: 진선웅 유저수만큼다양한섬을만들자 공개용

툴을 통한 사전작업

• 섬의 고유 속성 설정 • 기획자 / 아티스트를 통해서

• 다양한 설정 가능 • Seed, 점의 개수, 맵의 크기 • 강 개수, 넓이 • Noise • 생태 군계 비율 • 땅 비율 • 데이터 출력 옵션

Page 98: 진선웅 유저수만큼다양한섬을만들자 공개용

필요한 개수 만큼 생성 생성된 섬마다 Unique한 모습을 가지면서

미리 설정한 섬의 고유 속성 유지

Seed 변경

Page 99: 진선웅 유저수만큼다양한섬을만들자 공개용

생성된 지형 데이터 게임에 적용

생물 군계 데이터 바다/강/호수 데이터 높이 데이터

Page 100: 진선웅 유저수만큼다양한섬을만들자 공개용

생물 군계 데이터

• 생물 군계 별 바닥 처리

• 생물 군계 별 식생 배치

Page 101: 진선웅 유저수만큼다양한섬을만들자 공개용

바다/강/호수 데이터

물론 이 사이에 많은 처리가 필요합니다(…)

Page 102: 진선웅 유저수만큼다양한섬을만들자 공개용

높이 데이터

모바일은 흑흑

Bing map

Page 103: 진선웅 유저수만큼다양한섬을만들자 공개용

결론은 자동생성 좋아요

• 이미 많은 게임들에서 자동 생성되는 컨텐츠를 사용 중 • Minecraft, 디아블로, 마비노기 • Realm of the mad god

• 최대한 컴퓨터가 할 수 있는 일은 컴퓨터가 하게 • 사람은 좀 더 창의적이고 도전적인 일을 하자!

• 이런 자동생성 작업이 상당히 재미있음

• 결과를 바로 바로 눈으로 확인 가능 • 아주 약간은 신이 된 기분 • 하지만 아트 센스가 없다면 어떨까(...)

• 우리모두 함께 해요

Page 104: 진선웅 유저수만큼다양한섬을만들자 공개용

Q&A (발표 할 때 올라온 질문들)

• Q. 좋은 맵이 어떤 것인가에 대한 평가 기준을 정하는 것이 어려울 것 같은데, 그 부분에 대한 고려가 궁금합니다.

• A. 저희 프로젝트 기준으로 말씀 드리자면, 첫 번째로 일단 생성된 섬을 눈으로 봤을 때 패턴이나 인공적인 느낌이 들지 않고 실제 자연에 있을법한 섬의 모습을 가져야 합니다. 이건 수치로 평가하긴 힘들고 눈으로 직접 확인하고 게임 내에서도 테스트 해봐야 되겠지요.

• 두 번째로 첫 번째 조건을 만족하면서도 게임의 기획 의도에 따른 특성을 만족시켜야 합니다. 앞에서 말씀 드렸던 섬의 크기, 생물 군계의 비율 등이 될 수 있겠네요. 게임마다 필요한 필수요소 들이 있을 테니 그걸 잘 파악하시는 것이 중요할 것 같습니다.

Page 105: 진선웅 유저수만큼다양한섬을만들자 공개용

• Q. 노이즈맵을 생성해서 만개의 맵을 만든다고 하셨는데 만개의 노이즈맵의 용량이 상당하지 않나요?

• A. 일단 섬의 생성 개수에 대해서 말씀 드리자면 만개의 맵을 만드는 것은 아니고 게임에 필요한 개수 만큼 동적으로 생성하는 것이 목표입니다. 그리고 노이즈 자체도 따로 맵으로 만드는 것이 아니고 일반 Random 함수처럼 좌표 값을 넣으면 Seed + 수식계산을 통해서 그 좌표에 해당하는 노이즈 값을 알아오는 방식이기 때문에 따로 메모리나 하드에 미리 노이즈맵 파일을 생성하거나 하지는 않습니다.

• Q. 해안 절벽 같은 건 없나요?

• A. 아직 해안 절벽에 대한 고려는 해보지 않았습니다. 프로젝트에 필요하다면 연구를 해야겠지만 어떻게 처리할지는 아직 잘 모르겠네요

Page 106: 진선웅 유저수만큼다양한섬을만들자 공개용

• Q. 알고리즘 기반으로 만들어진 섬에 기획의도와 다른 결과물이 나오면 알고리즘을 수정하게 될 텐데, 그러면 기존에 생성된 섬 데이터는 수정이 불가능하지 않은지? 또한 그런 원치 않는 요소는 실제로 출현하기 전까지 알고리즘의 문제로 노출되지 않을 수도 있는데 결과물은 어떤 방식으로 검증하셨는지?

• A. 이미 만들어진 섬은 당연히 수정이 쉽지 않습니다. 아주 미세한 수정이고 기존에 만들었던 섬 데이터의 Seed와 각종 설정 값을 저장하고 있다면 그걸 바탕으로 새로 만든 섬으로 변경이 불가능한 것은 아니지만 여러 가지 부작용(예를 들어 섬의 모습이 바뀌어서 땅 위에 지어놓은 집이 물 위에 있다거나)이 생길 수 있으니 게임에 이미 쓰이고 있던 섬의 수정은 최대한 지양해야 합니다.

• 따라서 일단 기획의도와 다르게 만들어진 섬은 처음부터 게임에 쓰이지 않도록 생성시 제대로 검증을 해야 합니다. 알고리즘 자체를 수학적으로 엄밀히 검증하기는 힘들지만 결과물이 수학적 기획의도 대로 나오는지의 여부는 쉽게 검증할 수 있습니다. (예를 들어서 땅의 비율, 생물 군계의 비율, 섬의 경사도 등) 하지만 섬의 모양이 자연스럽지 않다거나 생물군계의 패턴이 보기에 단순하다 등의 비주얼적인 측면은 자동 검증이 힘들기 때문에 최대한 많이 만들어보고 경험적으로 확인하는 수 밖엔 없을 것 같습니다.

Page 107: 진선웅 유저수만큼다양한섬을만들자 공개용

긴 시간 감사합니다

Page 108: 진선웅 유저수만큼다양한섬을만들자 공개용