SlideShare une entreprise Scribd logo
1  sur  108
Télécharger pour lire hors ligne
유저 수만큼 다양한 섬을 만들자!
<야생의 땅: 듀랑고>의 절차적인 섬 생성 기법
What! Studio
진선웅
발표 내용
• Voronoi Diagram + Fractal Noise를 통한 절차적인 섬 생성
• 공개된 Polygon map generation 방법 기반
• 실제 알고리즘 구현을 통한 툴 제작
• <야생의 땅 : 듀랑고>에 적용하기 위해 여러 가지 개선사항
목차
• 절차적 섬 생성의 필요성
• 절차적 생성 방법
• 실제 구현
• 정리
절차적 섬 생성의 필요성
<야생의 땅: 듀랑고> 초기 비전
원시 야생 행성에 던져진 현대인이나 원주민이 되어,
공룡이나 차량을 타고 개척과 마을 건설을
플레이하는 크로스플랫폼 지원 MMORPG
원시 야생행성
현대인
원주민
공룡 공룡
차량
마을건설
개척
어떻게 표현 할 것인가?
디렉터 님: 우리 게임의 배경은
제주도 같은 아열대 화산섬이다!
제주도 백록담 (photo)
그 섬의 크기는 매우 크다 (10km x 10km)
© Blizzard
예쁜 강과 호수, 바다가 있어야 하며
• 게임에서 물은 매우 중요 자원
• 오픈 월드 곳곳에 흐르는 물의 묘사가 필요
한반도의 공룡 (TV film)
다양한 동/식물도 살고 있다
• 자연스러운 생물 군계 시스템이 필요
http://world-visits.blogspot.kr/
www.wikispaces.com
그러한 섬들이 굉장히 많이 있고,
http://www.bibletour.net/956
섬들의 모습은 전부 다르게 표현하고 싶다!
어떻게 구현하지?
• 한 두 개도 아니고
• 손으로 만들다간 출시 불가
• 게다가 모바일!
이렇게 된 이상
절차적 생성으로
간다!
혹시 World Machine 으로 안되나요
• 클릭 몇 번으로 그럴듯한 섬 데이터 생성 가능
• 여러 가지 요구 사항에 대응하는 만능 툴은 아님
World Machine 이 매우 좋은 툴 이지만
rakuten.com
요구 사항: 생물 군계 데이터 필요
• 단순 Height Map (x)
• 온도 / 습도에 따른 생물 군계
• 어떻게 후처리 잘 하면?
요구 사항: 강 / 호수 / 바다의 표현
• Flow 데이터론 쉽지 않음
Palouse Falls Washington United States
요구 사항: 서버 연동
• 서버 상황에 따른 실시간 생성
• 수 천 / 수 만개의 섬
• 자동화된 생성 과정 필요
요구 사항: 다양한 기획 대응
• 여러 가지 요구 조건 증가
• 섬 크기 균일하게
• 생물 군계 분포 일정하게
• 자투리 섬 안 생기게
• 섬 모양이 이상해요
• 게임에 필요한 데이터 변화
• 빠르게 툴 수정해서 기민하게 대응
그래서 절차적 섬 생성을 위한 툴을
직접 만들기로 했습니다!
절차적 생성 방법
어떻게 만드나
• 바닥부터 만들려니 (...)
• 그때 디렉터 님이 공유해주신 링크
http://www-cs-students.stanford.edu/~amitp/game-
programming/polygon-map-generation/
이거다!olleh!
Polygon Map Generation
• 원하는 기능이 전부 여기에...
• Flash로 된 오픈 소스제공
(MIT License)
• 친절한 알고리즘 설명
이것부터
알아 봅시다
일단 기본 용어 정의
• Node : 다각형
• Edge : 다각형 모서리
• Corner : 다각형 꼭짓점
• Center : 다각형 중심점
Corner
Node
Edge
Center
다각형 데이터 구조 - Edge
• Edge
• Corner 1
• Corner 2
• Node
• List of Nodes
• List of Corners
• List of Edges
다각형 데이터 구조 - Node
Node
Nodes
Node
Corners
Node
Edges
• Corner
• List of Nodes
• List of Corners
• List of Edges
다각형 데이터 구조 - Corner
Node
Node
Node
Corners Edges
시작: 다각형 데이터(Node) 생성
• 섬을 표현하기 위한 가장 기초적인 데이터
• 다양한 형태의 다각형(Node) 데이터 필요
• 다각형 생성(Node)을 위해선?
• 사각형 공간 내에 무작위 점의 집합 생성
• 해당 점들을 통해서 Voronoi Diagram 생성
• Voronoi Diagram?
Voronoi Diagram
• 주어진 점들로부터 거리에 따른 영역 분할
• 각 점들이 가지고 있는 일종의 영향력
• 무작위 점의 집합을 이용해서 다양한 모습의
다각형(Node) 생성 가능
• 생성된 다각형의 편차가 너무 큰 점이 문제
Lloyd’s algorithm
• 각 다각형의 중심점(Node Center)을 인자로 사용
 Voronoi Diagram 다시 생성
• 적당히 균일한 상태가 될 때까지 반복
(15회 반복)
해당 중심점들을 이용해서
Voronoi Diagram 다시 생성
Lloyd’s algorithm
Normalize Edge Length
• Edge를 좀 더 균일한 길이로 만들기 위해서
• Corner 위치를 이웃 Node Center의 평균값 으로 변경
Node
Node
Node
이웃 Node Center 들의
평균값으로 Corner 재배치
Normalize Edge Length
기본 섬 모양 생성
• 모든 Corner 의 ‘땅’ / ‘물’ 여부 결정
• Corner의 위치에 대응되는 Noise값 사용
• 특정 값 이상이면 ‘땅’ / 이하이면 ‘물’
• 모든 Node의 ‘땅’/ ‘물’ 결정
• Node를 구성하는 Corner들의 ‘물’ 비율에
따라서 ‘땅’ / ‘물’ 결정
물 물
Corner
땅 물
기본 섬 모양 생성
바다 생성
• 일단 사각형 가장자리에 있는 Node를 ‘바다’로 설정
• ‘바다’ Node의 이웃 Node로 전파
• 이웃 Node가 ‘물’일 경우 : ‘바다’ Node, 반복
해변 생성
• ‘해변’ Node 설정
• 주변 Node의 일부가 ‘바다’ / 일부가 ‘땅’ 일 때
섬의 높이 설정
• 만들려는 섬의 모습
• 섬의 중심이 가장 높고 가장자리로 갈수록 낮아짐
• 섬의 높이 = 해변으로부터의 거리에 비례
• 일단 가장자리에 있는 Corner 부터 높이 설정
• 이웃한 Corner 로 이동하면서 높이 증가시킴
• 이웃한 Corner가 ‘땅’일 때만 높이 값 증가
• 호수를 주위에서 가장 낮은 지역으로 만들기 위해서
해변 해변중심
Hanauma bay
섬의 높이 재분배
• 기존 높이값을 우리가 원하는 분포로 설정
• 기존 값은 어느 정도 경향은 있지만 Random
• Corner를 높이 순서대로 정렬
• 순서에 따라서 0~1 사이의 값을 설정
• 제일 높은 곳은 1, 중간 높이는 0.5, 가장 낮은 곳은 0
• 적당한 분포 함수를 적용해서 새로운 높이 할당
• 새로운 높이 = f( k / n )
• k 는 정렬 순서, n 은 전체 Corner 개수
높이 분포 함수
y
y
x
a
acbb
xyxx
xxxxxy






11
2
)442(
)
2
4
(,02
2)21(1)1(1
2
2
222
• y = 1-(x-1)^2
• 위쪽이 볼록한 2차 함수
• 해당 부분을 90도 회전한 모양
• 역함수를 구해서 적용
높이 분포 함수
• y = x^2
• 사실 큰 차이는 안 남
• 취향대로 (...)
섬의 높이 재분배
강의 생성
• 물의 성질: 높은 곳에서 낮은 곳으로 흐름
• 산 정상에서 해안가로
• Corner의 높이 활용
• 모든 Corner가 인접한 가장 낮은 Corner를 알고 있음
• 가장 낮은 Corner를 따라가면 결국 해안가
www.scienceall.com
강의 생성
• 적당한 개수의 강 시작지점 선택
• 일정 높이 이상
• 여러 물줄기가 만나는 경우 강의 폭 증가
• 근처에 호수가 있을 경우 자연스럽게 호수 쪽으로
• 호수를 주위에서 가장 낮은 지역으로 처리했음
습도 설정
• 생물 군계 데이터를 생성 하는데 필요
• 기후 시뮬레이션?
• 복잡한 계산 없이 그냥 강,호수 데이터 이용
• 강, 호수로부터의 거리에 따라서 상대 습도 값 설정
• 강, 호수 같이 ‘물’ 속성을 가진 Corner에 기본 습도 값 k 할당
• 주위 Corner 로 1보다 작은 값을 곱해서 전달 (ex: k * 0.9)
• 반복!
Fig1 in Krahn 2004
습도 재분배
• 강 / 호수의 모양에 따라서 습도의 총 합이 달라짐
• 섬마다 총 습도의 합은 동일하게 유지되길 원함
• 모든 Corner를 습도 값으로 정렬
• 높이 재분배 할 때랑 같은 방식
• 순서에 따라 Corner에 1~0 사이의 습도 값 재 설정
• 제일 습도가 높았던 곳은 1, 중간은 0.5, 가장 낮았던 곳은 0
• 따로 분포 함수는 적용하지 않았음
• 그냥 f(x) = x 인 함수
이 부분의 합이 섬마다 달라짐
생물 군계 설정
• 습도 / 온도에 따른 생물 군계
• 다양한 동/식물 표현에 필요
• 온도는 높이를 이용해서 계산
• 높은 곳일수록 저온
• 이렇게 작은 섬에 저런 데이터가?
• 게임적 허용 (...)
생물 군계 설정
습도 온도
생물 군계 설정
• 습도 / 온도에 따른 2차원 테이블
• Node의 습도/ 온도  생물 군계 생성
http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/
섬 만들기 요약
잠이 옵니다…
여기까지는 전부 사이트에 있는 내용
• 짤방은 한땀 한땀 제가 만들긴 했지만...
• 설명이 부족하셨다면 사이트 방문을 권해드립니다
• 여기서 다루지 않는 몇 가지 추가사항
• Edge noise
• Lava, Road 생성
• 필요하시면 역시 사이트 방문을 추천
실제 구현
Windows Form을 통한 툴 제작
• C#으로 쾌속 개발!
• 알고리즘 자체는 Flash code 가 제공되므로 간단
• Voronoi Diagram / Noise 생성
• 외부 라이브러리로 해결
• Rendering이 문제
• GDI+ 로 어떻게든 해결
• 그래도 힘든 건 Per Pixel 연산
Youtube: Top Ten Fastest Animals In The World
Voronoi Diagram 생성
• Fortune’s algorithm 이용
• 위키에 잘 설명되어 있지만 직접 만들려니 (...)
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
• 원본 코드를 고칠 일은 없음
• 공개 배포 되는 프로그램도 아님
Noise 생성
• 섬 생성 및 데이터 출력에 고품질의 Noise 필요
• 섬의 모양 생성
• 생물 군계 데이터
• LibNoise for .Net 이용
• A portable, open-source, coherent noise-generating library
• 고품질의 다양한 Noise 지원
• libnoisedotnet.codeplex.com
• MIT License
LibNoise for .Net
• 다양한 Noise 생성 방법 지원
• 3D Gradient Noise (Coherent Noise)
Coherent Non-Coherent
Perlin Ridged Billow Turbulence
LibNoise for .Net
• Fractal Noise 생성 지원
• 자연적으로 많이 보이는 패턴과 유사
Freq=5 Freq=10 Freq=20
Freq=40 Freq=80
위 Noise를 전부 더해줌
(값은 고주파로 갈수록 작게)
GDI+ Rendering
• 원하는 사이즈의 Bitmap 생성
• Graphics 객체를 이용해서 Node / Edge Rendering
• Bitmap 에서 Graphics 객체 가져오기
Graphics canvas = Graphics.FromImage(srcBMP);
• 기본 바탕색 설정
canvas.FillRectangle(clearBrush, 0, 0, srcWidth, srcHeight);
Node Rendering
• Graphics.FillPolygon(Brush brush, PointF[] points) 사용
• Node에 미리 저장된 Corners 값 사용
• 기본적인 섬 Rendering 용도
Node
Corners
Edge Rendering
• Graphics.DrawLine(Pen pen, PointF pt1, PointF pt2) 사용
• 주로 강 Rendering에 사용
• 그 외 디버깅 용도
• 섬의 윤곽
• 각 Node 구분
Heightmap Rendering
• 기존 Node Rendering 방식 사용 불가
• Node 윤곽이 그대로 보임
• 각 Corner에 저장된 높이 값을 이용한 Gradient Rendering 필요
Gradient Rendering
• Drawing2D.PathGradientBrush 사용
• PathGradientBrush(PointF[] points)
• gradientBrush.CenterPoint
• gradientBrush.CenterColor
• Node가 가지고 있는 높이 값 사용
• gradientBrush.SurroundColors
• Corners가 가지고 있는 높이 값 사용
• Graphics.FillPolygon(gradientBrush, pointArray)
Brush 생성시 Node에 속한
Corners 값 넣어줌
Corners
Center
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);
그 외 환경설정 작업
• 게임에 쓰일 섬의 적절한 Preset을 찾기 위해서 필요
• 추후 Random Seed만 바꿔서 섬 대량 생산
• Random Seed 값 설정
• 섬의 크기 설정
• 점의 개수 설정
• 강의 개수/넓이 설정
• Noise 생성 옵션
초기 모습
• 개발 초기 결과물
• 512x512, 점 10000개
• 섬이 좀...
• 너무 고주파 Noise 사용
• Noise 설정 변경 필요
중기 모습
• 새 Noise 적용
• 생물 군계 적용
• 강 추가
• 끝?
Node 밀도 증가
• 게임에는 좀 더 디테일 한 모습 필요
• Node 형태 안 보이게
• 점 40000개 적용
• 밀도 2배
• 문제발생
의도했던 디테일은 증가하지 않고
오히려 전체적인 모양만 단순해짐
고밀도 Node 문제
• 고밀도 Node 사이즈 소형화
• Node 배치에 따른 변화 량이 작아짐
• 섬의 외곽선이 점점 단순화
• Node 단위 작업
• 해변이 점점 짧아짐
• 생물군계 분포
• 점점 패턴이 보임
• Random 필요!
해변이 짧아짐
• 일단 첫 번째 해변 Node 계산
• 그 후 해변 Node 주위의 Node를
해변으로 변경
• Node 밀도에 비례해서 반복
• 점 개수의 제곱근에 비례
• 10000개  1번
• 40000개  2번
섬의 외곽선 단순화
• 저밀도 섬의 모양 미리 계산
• ‘땅’ / ‘물’ 여부를 Mask Map으로 저장
• 고밀도에서 앞의 Mask Map을 읽어서 ‘땅’ / ‘물’ 결정
• 저밀도에서 큰 폭의 변화 그대로 유지
• 저주파 데이터 + 고주파 데이터로 Detail : 일종의 Fractal
‘땅’ / ‘물’ 결정
Mask Map
섬의 외곽선 단순화
생물 군계 단순화
• 고밀도가 될수록 생물 군계 패턴이 단순해짐
• 생물 군계 계산시 Noise 적용
• Node의 Center 해당하는 위치에서 Noise 값 가져옴
• 기존 습도 / 온도에 Noise값 더해서 생물 군계 결정 습도 / 온도에 더해줌
생물 군계 단순화
One more thing!
• 생물 군계의 경계 부분이 아쉽다!
• 확대해서 보면 Node 모습으로 분리
• 실제 자연은 저렇게 칼같이 떨어지지 않음
• Pixel 단위로 섞어주면 어떨까?
Pixel 단위 섞기
• 일정 범위 안의 Random한 Pixel과 교환
• 고주파 Noise를 이용해서 교환 Pixel 결정
(3) 교환
(2) Noise 값을 이용
일정 범위에서 교환할 Pixel 선택
(1) 현재 Pixel 위치에
해당하는 Noise 선택
Pixel 단위 섞기 호수 / 바다는 따로 Mask 사용
섞이지 않게 해야 함
참 쉽죠?
추가 구현 내용
• 지금까진 주로 아티스트의 의도만 반영
• 일단 보기 좋게 만들자
• 게임 디자이너의 의도 역시 반영 되어야 한다!
• 디자인 요구사항
• 생성되는 땅의 면적 조절 기능
• 생물 군계의 비율 조절 기능
• 자투리 섬 생성 안되게
• 봉우리 개수 조절 가능하게
생성되는 땅의 면적 조절기능
• Noise에 따라 달라지는 땅의 면적
• 섬마다 땅의 면적이 너무 차이 나면 문제
• 땅의 총 면적이 원하는 값이 되도록
“기준 값”수정
물 물
Corner
이쯤에서 섬 생성 로직 다시 리뷰
Corner의 위치에 해당하는 Noise값을 이용
“기준 값” 이상이면 ‘땅’ / 이하이면 ‘물’
생성되는 땅의 면적 조절기능
• 알맞은 “기준 값” 을 찾기 위한 방법
• 땅의 면적은 기준 값의 크기에 따라 정렬
• 기준 값 땅의 면적
 Binary Search
• 요구 면적에 근접할 때 까지 반복
• 땅의 면적 : 모든 ‘땅’ Node 면적의 합
• 그냥 모든 ‘땅’ Node 개수의 합으로 근사
Best
기준 값
땅의 면적
기준 값
요구
면적
• 땅의 비율이 55% 정도가
되도록 기준 값 자동 조절
• 섬모양의 변화는 유지
• 땅의 면적은 비슷하게
• 고정된 기준 값
• 섬마다 땅의 면적 차이 발생
Before
After
생물 군계의 비율 설정
결국 원화는 비율이 되도록 “기준 값“
(온도 A,B / 습도 I,K,M) 을 수정!
• 생성되는 생물 군계의 비율은 Random = 그때 그때 달라요!
• Seed 가 변해도 기획자가 설정한 생물 군계 비율은 유지되게!
생물 군계 설정 방법
if(온도 < A)
if(습도 > I) = 설원
else = 툰드라
else if(온도 < B) = 온대림
else
if(습도 > K ) = 열대림
else if(습도 > M) = 초원
else = 사막
생물 군계의 비율 설정
• 땅의 면적 조절 기능과 거의 비슷함
• (설원 + 툰드라) / 나머지는 온도 A로 구분
• 온도 A를 Binary search
• 계산된 온도 A값을 확정
• 설원 / 툰드라를 구분하는 습도 I 계산
• 동일하게 B, K,M 을 계산
• 온도 B = 온대림 / (열대림 + 초원 +사막)
• 습도 K = 열대림 / (초원 + 사막)
• 습도 M = 초원 / 사막
온도 A
(설원 + 툰드라) Node 개수
온도 기준
요구
개수
여기까지가 현재 구현된 내용
• 그럭저럭 볼만한 섬 생성 가능
• 아직 서버 연동은 (...)
• 계산 시간
• 1024x1024, 40000개 기준 5초 정도
• 4096x4096, 640000개 기준 1분 이상
• Voronoi Diagram 생성에 많은 시간사용
앞으로 개선할 사항
• 자투리 섬 생기지 않게
• 섬마다 개수 / 크기가 제각각
• 사실상 죽은 땅
• 본토 섬으로 병합처리 필요
• 호수의 면적이 일정하지 않음
• 지금은 땅의 면적만 일정하게 유지
• 호수가 너무 크거나 작으면 문제
• 일단 동일하게 섬 생성 과정 처리
 그 후 섬 안에서 다시 호수 생성 하면?
앞으로 개선할 사항
• 좀 더 자연스러운 강의 표현 필요
• 삼각주 / 곡류 / 선상지 등의 표현
• 좀 더 S라인이 되어야 할 듯?
www.scienceall.com
정리
다양한 모습의 디테일한 섬이 필요
• 서버 –
• 마을
서버 섬
크기 大
전체 서버 수 만큼 존재
미리 생산 가능
마을 섬
크기 中
유저 그룹만큼 존재
유저 개인 섬
크기 小
유저 수만큼 존재
서버와 연동해서
동적 생산 필요
툴을 통한 사전작업
• 섬의 고유 속성 설정
• 기획자 / 아티스트를 통해서
• 다양한 설정 가능
• Seed, 점의 개수, 맵의 크기
• 강 개수, 넓이
• Noise
• 생태 군계 비율
• 땅 비율
• 데이터 출력 옵션
필요한 개수 만큼 생성
생성된 섬마다 Unique한 모습을 가지면서
미리 설정한 섬의 고유 속성 유지
Seed 변경
생성된 지형 데이터 게임에 적용
생물 군계 데이터 바다/강/호수 데이터 높이 데이터
생물 군계 데이터
• 생물 군계 별 바닥 처리
• 생물 군계 별 식생 배치
바다/강/호수 데이터
물론 이 사이에 많은
처리가 필요합니다(…)
높이 데이터
모바일은 흑흑
Bing map
결론은 자동생성 좋아요
• 이미 많은 게임들에서 자동 생성되는 컨텐츠를 사용 중
• Minecraft, 디아블로, 마비노기
• Realm of the mad god
• 최대한 컴퓨터가 할 수 있는 일은 컴퓨터가 하게
• 사람은 좀 더 창의적이고 도전적인 일을 하자!
• 이런 자동생성 작업이 상당히 재미있음
• 결과를 바로 바로 눈으로 확인 가능
• 아주 약간은 신이 된 기분
• 하지만 아트 센스가 없다면 어떨까(...)
• 우리모두 함께 해요 
Q&A (발표 할 때 올라온 질문들)
• Q. 좋은 맵이 어떤 것인가에 대한 평가 기준을 정하는 것이 어려울 것 같
은데, 그 부분에 대한 고려가 궁금합니다.
• A. 저희 프로젝트 기준으로 말씀 드리자면, 첫 번째로 일단 생성된 섬을
눈으로 봤을 때 패턴이나 인공적인 느낌이 들지 않고 실제 자연에 있을법
한 섬의 모습을 가져야 합니다. 이건 수치로 평가하긴 힘들고 눈으로 직
접 확인하고 게임 내에서도 테스트 해봐야 되겠지요.
• 두 번째로 첫 번째 조건을 만족하면서도 게임의 기획 의도에 따른 특성을
만족시켜야 합니다. 앞에서 말씀 드렸던 섬의 크기, 생물 군계의 비율 등
이 될 수 있겠네요. 게임마다 필요한 필수요소 들이 있을 테니 그걸 잘 파
악하시는 것이 중요할 것 같습니다.
• Q. 노이즈맵을 생성해서 만개의 맵을 만든다고 하셨는데 만개의 노이즈
맵의 용량이 상당하지 않나요?
• A. 일단 섬의 생성 개수에 대해서 말씀 드리자면 만개의 맵을 만드는 것
은 아니고 게임에 필요한 개수 만큼 동적으로 생성하는 것이 목표입니다.
그리고 노이즈 자체도 따로 맵으로 만드는 것이 아니고 일반 Random 함
수처럼 좌표 값을 넣으면 Seed + 수식계산을 통해서 그 좌표에 해당하는
노이즈 값을 알아오는 방식이기 때문에 따로 메모리나 하드에 미리 노이
즈맵 파일을 생성하거나 하지는 않습니다.
• Q. 해안 절벽 같은 건 없나요?
• A. 아직 해안 절벽에 대한 고려는 해보지 않았습니다. 프로젝트에 필요하
다면 연구를 해야겠지만 어떻게 처리할지는 아직 잘 모르겠네요 
• Q. 알고리즘 기반으로 만들어진 섬에 기획의도와 다른 결과물이 나오면 알고
리즘을 수정하게 될 텐데, 그러면 기존에 생성된 섬 데이터는 수정이 불가능하
지 않은지? 또한 그런 원치 않는 요소는 실제로 출현하기 전까지 알고리즘의
문제로 노출되지 않을 수도 있는데 결과물은 어떤 방식으로 검증하셨는지?
• A. 이미 만들어진 섬은 당연히 수정이 쉽지 않습니다. 아주 미세한 수정이고 기
존에 만들었던 섬 데이터의 Seed와 각종 설정 값을 저장하고 있다면 그걸 바
탕으로 새로 만든 섬으로 변경이 불가능한 것은 아니지만 여러 가지 부작용(예
를 들어 섬의 모습이 바뀌어서 땅 위에 지어놓은 집이 물 위에 있다거나)이 생
길 수 있으니 게임에 이미 쓰이고 있던 섬의 수정은 최대한 지양해야 합니다.
• 따라서 일단 기획의도와 다르게 만들어진 섬은 처음부터 게임에 쓰이지 않도
록 생성시 제대로 검증을 해야 합니다. 알고리즘 자체를 수학적으로 엄밀히 검
증하기는 힘들지만 결과물이 수학적 기획의도 대로 나오는지의 여부는 쉽게
검증할 수 있습니다. (예를 들어서 땅의 비율, 생물 군계의 비율, 섬의 경사도
등) 하지만 섬의 모양이 자연스럽지 않다거나 생물군계의 패턴이 보기에 단순
하다 등의 비주얼적인 측면은 자동 검증이 힘들기 때문에 최대한 많이 만들어
보고 경험적으로 확인하는 수 밖엔 없을 것 같습니다.
긴 시간 감사합니다 
진선웅 유저수만큼다양한섬을만들자 공개용

Contenu connexe

Tendances

멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
NDC 2011 영웅전 런칭팀 박영준
NDC 2011 영웅전 런칭팀 박영준NDC 2011 영웅전 런칭팀 박영준
NDC 2011 영웅전 런칭팀 박영준영준 박
 
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템WooSung Jeon
 
[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인
[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인
[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인승명 양
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들MinGeun Park
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다Lee Dustin
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들Jubok Kim
 
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계Imseong Kang
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1Hong-Gi Joe
 
NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅
NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅
NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅Eunseok Yi
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipelinechangehee lee
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현MinGeun Park
 
[ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인
[ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인 [ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인
[ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인 Jungsoo Lee
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
1. 아이디어에서 컨셉을 증명하기까지
1. 아이디어에서 컨셉을 증명하기까지1. 아이디어에서 컨셉을 증명하기까지
1. 아이디어에서 컨셉을 증명하기까지Suyeong Park
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011devCAT Studio, NEXON
 
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화Eunseok Yi
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현Bongseok Cho
 

Tendances (20)

멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
NDC 2011 영웅전 런칭팀 박영준
NDC 2011 영웅전 런칭팀 박영준NDC 2011 영웅전 런칭팀 박영준
NDC 2011 영웅전 런칭팀 박영준
 
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
2D RPG 개발 이론 + 티뮤리티 개발 포스트모템
 
[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인
[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인
[NDC14] 모바일 게임의 다음 혁신 - 야생의 땅 듀랑고의 계산 프로세스 중심 게임 디자인
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들
 
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1
 
NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅
NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅
NDC 2011 이은석 - 마비노기 영웅전 아트 디렉팅
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipeline
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
 
[ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인
[ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인 [ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인
[ NDC 14 ] 가죽 장화를 먹게 해주세요 - [ 야생의 땅 : 듀랑고 ] 의 자유도 높은 아이템 시스템 디자인
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
1. 아이디어에서 컨셉을 증명하기까지
1. 아이디어에서 컨셉을 증명하기까지1. 아이디어에서 컨셉을 증명하기까지
1. 아이디어에서 컨셉을 증명하기까지
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
 
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
NDC 2016 이은석 - 돌죽을 끓입시다: 창의적 게임개발팀을 위한 왓 스튜디오의 업무 문화
 
게임 디렉팅 튜토리얼
게임 디렉팅 튜토리얼게임 디렉팅 튜토리얼
게임 디렉팅 튜토리얼
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
 

En vedette

Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계tcaesvk
 
NDC2014 코인박스@NDC 치킨럽포스트모템
NDC2014 코인박스@NDC 치킨럽포스트모템NDC2014 코인박스@NDC 치킨럽포스트모템
NDC2014 코인박스@NDC 치킨럽포스트모템gon
 
NDC 2014) 별바람의 기묘한 모험 1991-2014
NDC 2014) 별바람의 기묘한 모험 1991-2014NDC 2014) 별바람의 기묘한 모험 1991-2014
NDC 2014) 별바람의 기묘한 모험 1991-2014KwangSam Kim
 
[NDC14] A Mass of Dead 스팀 입성 성공기
[NDC14] A Mass of Dead 스팀 입성 성공기[NDC14] A Mass of Dead 스팀 입성 성공기
[NDC14] A Mass of Dead 스팀 입성 성공기Mingu Heo
 
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기Jinuk Kim
 
[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람
[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람
[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람Wooram Hwang
 
NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]
NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]
NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]Imseong Kang
 
바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법
바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법
바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법Lee Sangkyoon (Kay)
 
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기zupet
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기Jong Wook Kim
 
[NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래
[NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래 [NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래
[NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래 Hwang Sang Hun
 
NDC14 창업을결정하기전3가지자기검증
NDC14 창업을결정하기전3가지자기검증NDC14 창업을결정하기전3가지자기검증
NDC14 창업을결정하기전3가지자기검증Byunglim Park
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기Miyu Park
 
[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션
[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션
[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션Nexon Korea
 
THE_NPCMASTER_PUBLIC
THE_NPCMASTER_PUBLICTHE_NPCMASTER_PUBLIC
THE_NPCMASTER_PUBLICkhalbora
 
[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNS
[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNS[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNS
[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNSYounger Jo
 
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀Young Keun Choe
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 
[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅
[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅
[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅Kloud Kim
 

En vedette (20)

Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
 
NDC2014 코인박스@NDC 치킨럽포스트모템
NDC2014 코인박스@NDC 치킨럽포스트모템NDC2014 코인박스@NDC 치킨럽포스트모템
NDC2014 코인박스@NDC 치킨럽포스트모템
 
NDC 2014) 별바람의 기묘한 모험 1991-2014
NDC 2014) 별바람의 기묘한 모험 1991-2014NDC 2014) 별바람의 기묘한 모험 1991-2014
NDC 2014) 별바람의 기묘한 모험 1991-2014
 
[NDC14] A Mass of Dead 스팀 입성 성공기
[NDC14] A Mass of Dead 스팀 입성 성공기[NDC14] A Mass of Dead 스팀 입성 성공기
[NDC14] A Mass of Dead 스팀 입성 성공기
 
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
 
[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람
[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람
[NDC14] (공개용)게임 QA에 적용할 수 있는 테스팅 기법과 패턴 활용_황우람
 
NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]
NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]
NDC 2014 [48시간 만에 게임 만들기: '수줍은 메두사' 포스트모템과 게임 개발의 왕도]
 
바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법
바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법
바라는 대로 라이터가 쓰게 만드는 시나리오 디렉팅 기법
 
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 
[NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래
[NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래 [NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래
[NDC 2014] 시나리오라이터의 과거와 현재, 그리고 미래
 
NDC14 창업을결정하기전3가지자기검증
NDC14 창업을결정하기전3가지자기검증NDC14 창업을결정하기전3가지자기검증
NDC14 창업을결정하기전3가지자기검증
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
 
[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션
[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션
[NDC 14] '미쿠미쿠하게 해줄게' - MMD MV 제작 사례와 매력적인 캐릭터 애니메이션
 
THE_NPCMASTER_PUBLIC
THE_NPCMASTER_PUBLICTHE_NPCMASTER_PUBLIC
THE_NPCMASTER_PUBLIC
 
[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNS
[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNS[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNS
[NDC14] 타임라인 던전 포스트모템 - 스마트폰 시대의 머드게임과 SNS
 
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅
[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅
[NDC 14] 게임 개발사에서 개발PM(팀장)의 역할과 책임-김영웅
 

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

  • 1. 유저 수만큼 다양한 섬을 만들자! <야생의 땅: 듀랑고>의 절차적인 섬 생성 기법 What! Studio 진선웅
  • 2. 발표 내용 • Voronoi Diagram + Fractal Noise를 통한 절차적인 섬 생성 • 공개된 Polygon map generation 방법 기반 • 실제 알고리즘 구현을 통한 툴 제작 • <야생의 땅 : 듀랑고>에 적용하기 위해 여러 가지 개선사항
  • 3. 목차 • 절차적 섬 생성의 필요성 • 절차적 생성 방법 • 실제 구현 • 정리
  • 5. <야생의 땅: 듀랑고> 초기 비전 원시 야생 행성에 던져진 현대인이나 원주민이 되어, 공룡이나 차량을 타고 개척과 마을 건설을 플레이하는 크로스플랫폼 지원 MMORPG 원시 야생행성 현대인 원주민 공룡 공룡 차량 마을건설 개척 어떻게 표현 할 것인가?
  • 6. 디렉터 님: 우리 게임의 배경은 제주도 같은 아열대 화산섬이다! 제주도 백록담 (photo)
  • 7. 그 섬의 크기는 매우 크다 (10km x 10km) © Blizzard
  • 8. 예쁜 강과 호수, 바다가 있어야 하며 • 게임에서 물은 매우 중요 자원 • 오픈 월드 곳곳에 흐르는 물의 묘사가 필요 한반도의 공룡 (TV film)
  • 9. 다양한 동/식물도 살고 있다 • 자연스러운 생물 군계 시스템이 필요 http://world-visits.blogspot.kr/ www.wikispaces.com
  • 10. 그러한 섬들이 굉장히 많이 있고, http://www.bibletour.net/956
  • 11. 섬들의 모습은 전부 다르게 표현하고 싶다!
  • 12. 어떻게 구현하지? • 한 두 개도 아니고 • 손으로 만들다간 출시 불가 • 게다가 모바일! 이렇게 된 이상 절차적 생성으로 간다!
  • 13. 혹시 World Machine 으로 안되나요 • 클릭 몇 번으로 그럴듯한 섬 데이터 생성 가능
  • 14. • 여러 가지 요구 사항에 대응하는 만능 툴은 아님 World Machine 이 매우 좋은 툴 이지만 rakuten.com
  • 15. 요구 사항: 생물 군계 데이터 필요 • 단순 Height Map (x) • 온도 / 습도에 따른 생물 군계 • 어떻게 후처리 잘 하면?
  • 16. 요구 사항: 강 / 호수 / 바다의 표현 • Flow 데이터론 쉽지 않음 Palouse Falls Washington United States
  • 17. 요구 사항: 서버 연동 • 서버 상황에 따른 실시간 생성 • 수 천 / 수 만개의 섬 • 자동화된 생성 과정 필요
  • 18. 요구 사항: 다양한 기획 대응 • 여러 가지 요구 조건 증가 • 섬 크기 균일하게 • 생물 군계 분포 일정하게 • 자투리 섬 안 생기게 • 섬 모양이 이상해요 • 게임에 필요한 데이터 변화 • 빠르게 툴 수정해서 기민하게 대응
  • 19. 그래서 절차적 섬 생성을 위한 툴을 직접 만들기로 했습니다!
  • 21. 어떻게 만드나 • 바닥부터 만들려니 (...) • 그때 디렉터 님이 공유해주신 링크 http://www-cs-students.stanford.edu/~amitp/game- programming/polygon-map-generation/ 이거다!olleh!
  • 22. Polygon Map Generation • 원하는 기능이 전부 여기에... • Flash로 된 오픈 소스제공 (MIT License) • 친절한 알고리즘 설명 이것부터 알아 봅시다
  • 23. 일단 기본 용어 정의 • Node : 다각형 • Edge : 다각형 모서리 • Corner : 다각형 꼭짓점 • Center : 다각형 중심점 Corner Node Edge Center
  • 24. 다각형 데이터 구조 - Edge • Edge • Corner 1 • Corner 2
  • 25. • Node • List of Nodes • List of Corners • List of Edges 다각형 데이터 구조 - Node Node Nodes Node Corners Node Edges
  • 26. • Corner • List of Nodes • List of Corners • List of Edges 다각형 데이터 구조 - Corner Node Node Node Corners Edges
  • 27. 시작: 다각형 데이터(Node) 생성 • 섬을 표현하기 위한 가장 기초적인 데이터 • 다양한 형태의 다각형(Node) 데이터 필요 • 다각형 생성(Node)을 위해선? • 사각형 공간 내에 무작위 점의 집합 생성 • 해당 점들을 통해서 Voronoi Diagram 생성 • Voronoi Diagram?
  • 28. Voronoi Diagram • 주어진 점들로부터 거리에 따른 영역 분할 • 각 점들이 가지고 있는 일종의 영향력 • 무작위 점의 집합을 이용해서 다양한 모습의 다각형(Node) 생성 가능 • 생성된 다각형의 편차가 너무 큰 점이 문제
  • 29. Lloyd’s algorithm • 각 다각형의 중심점(Node Center)을 인자로 사용  Voronoi Diagram 다시 생성 • 적당히 균일한 상태가 될 때까지 반복 (15회 반복) 해당 중심점들을 이용해서 Voronoi Diagram 다시 생성
  • 31. Normalize Edge Length • Edge를 좀 더 균일한 길이로 만들기 위해서 • Corner 위치를 이웃 Node Center의 평균값 으로 변경 Node Node Node 이웃 Node Center 들의 평균값으로 Corner 재배치
  • 33. 기본 섬 모양 생성 • 모든 Corner 의 ‘땅’ / ‘물’ 여부 결정 • Corner의 위치에 대응되는 Noise값 사용 • 특정 값 이상이면 ‘땅’ / 이하이면 ‘물’ • 모든 Node의 ‘땅’/ ‘물’ 결정 • Node를 구성하는 Corner들의 ‘물’ 비율에 따라서 ‘땅’ / ‘물’ 결정 물 물 Corner 땅 물
  • 35. 바다 생성 • 일단 사각형 가장자리에 있는 Node를 ‘바다’로 설정 • ‘바다’ Node의 이웃 Node로 전파 • 이웃 Node가 ‘물’일 경우 : ‘바다’ Node, 반복
  • 36. 해변 생성 • ‘해변’ Node 설정 • 주변 Node의 일부가 ‘바다’ / 일부가 ‘땅’ 일 때
  • 37. 섬의 높이 설정 • 만들려는 섬의 모습 • 섬의 중심이 가장 높고 가장자리로 갈수록 낮아짐 • 섬의 높이 = 해변으로부터의 거리에 비례 • 일단 가장자리에 있는 Corner 부터 높이 설정 • 이웃한 Corner 로 이동하면서 높이 증가시킴 • 이웃한 Corner가 ‘땅’일 때만 높이 값 증가 • 호수를 주위에서 가장 낮은 지역으로 만들기 위해서 해변 해변중심 Hanauma bay
  • 38.
  • 39.
  • 40. 섬의 높이 재분배 • 기존 높이값을 우리가 원하는 분포로 설정 • 기존 값은 어느 정도 경향은 있지만 Random • Corner를 높이 순서대로 정렬 • 순서에 따라서 0~1 사이의 값을 설정 • 제일 높은 곳은 1, 중간 높이는 0.5, 가장 낮은 곳은 0 • 적당한 분포 함수를 적용해서 새로운 높이 할당 • 새로운 높이 = f( k / n ) • k 는 정렬 순서, n 은 전체 Corner 개수
  • 41. 높이 분포 함수 y y x a acbb xyxx xxxxxy       11 2 )442( ) 2 4 (,02 2)21(1)1(1 2 2 222 • y = 1-(x-1)^2 • 위쪽이 볼록한 2차 함수 • 해당 부분을 90도 회전한 모양 • 역함수를 구해서 적용
  • 42. 높이 분포 함수 • y = x^2 • 사실 큰 차이는 안 남 • 취향대로 (...)
  • 44. 강의 생성 • 물의 성질: 높은 곳에서 낮은 곳으로 흐름 • 산 정상에서 해안가로 • Corner의 높이 활용 • 모든 Corner가 인접한 가장 낮은 Corner를 알고 있음 • 가장 낮은 Corner를 따라가면 결국 해안가 www.scienceall.com
  • 45.
  • 46. 강의 생성 • 적당한 개수의 강 시작지점 선택 • 일정 높이 이상 • 여러 물줄기가 만나는 경우 강의 폭 증가 • 근처에 호수가 있을 경우 자연스럽게 호수 쪽으로 • 호수를 주위에서 가장 낮은 지역으로 처리했음
  • 47.
  • 48. 습도 설정 • 생물 군계 데이터를 생성 하는데 필요 • 기후 시뮬레이션? • 복잡한 계산 없이 그냥 강,호수 데이터 이용 • 강, 호수로부터의 거리에 따라서 상대 습도 값 설정 • 강, 호수 같이 ‘물’ 속성을 가진 Corner에 기본 습도 값 k 할당 • 주위 Corner 로 1보다 작은 값을 곱해서 전달 (ex: k * 0.9) • 반복! Fig1 in Krahn 2004
  • 49.
  • 50. 습도 재분배 • 강 / 호수의 모양에 따라서 습도의 총 합이 달라짐 • 섬마다 총 습도의 합은 동일하게 유지되길 원함 • 모든 Corner를 습도 값으로 정렬 • 높이 재분배 할 때랑 같은 방식 • 순서에 따라 Corner에 1~0 사이의 습도 값 재 설정 • 제일 습도가 높았던 곳은 1, 중간은 0.5, 가장 낮았던 곳은 0 • 따로 분포 함수는 적용하지 않았음 • 그냥 f(x) = x 인 함수 이 부분의 합이 섬마다 달라짐
  • 51.
  • 52. 생물 군계 설정 • 습도 / 온도에 따른 생물 군계 • 다양한 동/식물 표현에 필요 • 온도는 높이를 이용해서 계산 • 높은 곳일수록 저온 • 이렇게 작은 섬에 저런 데이터가? • 게임적 허용 (...)
  • 54. 생물 군계 설정 • 습도 / 온도에 따른 2차원 테이블 • Node의 습도/ 온도  생물 군계 생성 http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/
  • 57. 여기까지는 전부 사이트에 있는 내용 • 짤방은 한땀 한땀 제가 만들긴 했지만... • 설명이 부족하셨다면 사이트 방문을 권해드립니다 • 여기서 다루지 않는 몇 가지 추가사항 • Edge noise • Lava, Road 생성 • 필요하시면 역시 사이트 방문을 추천
  • 59. Windows Form을 통한 툴 제작 • C#으로 쾌속 개발! • 알고리즘 자체는 Flash code 가 제공되므로 간단 • Voronoi Diagram / Noise 생성 • 외부 라이브러리로 해결 • Rendering이 문제 • GDI+ 로 어떻게든 해결 • 그래도 힘든 건 Per Pixel 연산 Youtube: Top Ten Fastest Animals In The World
  • 60. Voronoi Diagram 생성 • Fortune’s algorithm 이용 • 위키에 잘 설명되어 있지만 직접 만들려니 (...)
  • 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 • 원본 코드를 고칠 일은 없음 • 공개 배포 되는 프로그램도 아님
  • 62. Noise 생성 • 섬 생성 및 데이터 출력에 고품질의 Noise 필요 • 섬의 모양 생성 • 생물 군계 데이터 • LibNoise for .Net 이용 • A portable, open-source, coherent noise-generating library • 고품질의 다양한 Noise 지원 • libnoisedotnet.codeplex.com • MIT License
  • 63. LibNoise for .Net • 다양한 Noise 생성 방법 지원 • 3D Gradient Noise (Coherent Noise) Coherent Non-Coherent Perlin Ridged Billow Turbulence
  • 64. LibNoise for .Net • Fractal Noise 생성 지원 • 자연적으로 많이 보이는 패턴과 유사 Freq=5 Freq=10 Freq=20 Freq=40 Freq=80 위 Noise를 전부 더해줌 (값은 고주파로 갈수록 작게)
  • 65. GDI+ Rendering • 원하는 사이즈의 Bitmap 생성 • Graphics 객체를 이용해서 Node / Edge Rendering • Bitmap 에서 Graphics 객체 가져오기 Graphics canvas = Graphics.FromImage(srcBMP); • 기본 바탕색 설정 canvas.FillRectangle(clearBrush, 0, 0, srcWidth, srcHeight);
  • 66. Node Rendering • Graphics.FillPolygon(Brush brush, PointF[] points) 사용 • Node에 미리 저장된 Corners 값 사용 • 기본적인 섬 Rendering 용도 Node Corners
  • 67. Edge Rendering • Graphics.DrawLine(Pen pen, PointF pt1, PointF pt2) 사용 • 주로 강 Rendering에 사용 • 그 외 디버깅 용도 • 섬의 윤곽 • 각 Node 구분
  • 68. Heightmap Rendering • 기존 Node Rendering 방식 사용 불가 • Node 윤곽이 그대로 보임 • 각 Corner에 저장된 높이 값을 이용한 Gradient Rendering 필요
  • 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
  • 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);
  • 71. 그 외 환경설정 작업 • 게임에 쓰일 섬의 적절한 Preset을 찾기 위해서 필요 • 추후 Random Seed만 바꿔서 섬 대량 생산 • Random Seed 값 설정 • 섬의 크기 설정 • 점의 개수 설정 • 강의 개수/넓이 설정 • Noise 생성 옵션
  • 72. 초기 모습 • 개발 초기 결과물 • 512x512, 점 10000개 • 섬이 좀... • 너무 고주파 Noise 사용 • Noise 설정 변경 필요
  • 73. 중기 모습 • 새 Noise 적용 • 생물 군계 적용 • 강 추가 • 끝?
  • 74. Node 밀도 증가 • 게임에는 좀 더 디테일 한 모습 필요 • Node 형태 안 보이게 • 점 40000개 적용 • 밀도 2배 • 문제발생 의도했던 디테일은 증가하지 않고 오히려 전체적인 모양만 단순해짐
  • 75. 고밀도 Node 문제 • 고밀도 Node 사이즈 소형화 • Node 배치에 따른 변화 량이 작아짐 • 섬의 외곽선이 점점 단순화 • Node 단위 작업 • 해변이 점점 짧아짐 • 생물군계 분포 • 점점 패턴이 보임 • Random 필요!
  • 76. 해변이 짧아짐 • 일단 첫 번째 해변 Node 계산 • 그 후 해변 Node 주위의 Node를 해변으로 변경 • Node 밀도에 비례해서 반복 • 점 개수의 제곱근에 비례 • 10000개  1번 • 40000개  2번
  • 77. 섬의 외곽선 단순화 • 저밀도 섬의 모양 미리 계산 • ‘땅’ / ‘물’ 여부를 Mask Map으로 저장 • 고밀도에서 앞의 Mask Map을 읽어서 ‘땅’ / ‘물’ 결정 • 저밀도에서 큰 폭의 변화 그대로 유지 • 저주파 데이터 + 고주파 데이터로 Detail : 일종의 Fractal ‘땅’ / ‘물’ 결정 Mask Map
  • 79. 생물 군계 단순화 • 고밀도가 될수록 생물 군계 패턴이 단순해짐 • 생물 군계 계산시 Noise 적용 • Node의 Center 해당하는 위치에서 Noise 값 가져옴 • 기존 습도 / 온도에 Noise값 더해서 생물 군계 결정 습도 / 온도에 더해줌
  • 81. One more thing! • 생물 군계의 경계 부분이 아쉽다! • 확대해서 보면 Node 모습으로 분리 • 실제 자연은 저렇게 칼같이 떨어지지 않음 • Pixel 단위로 섞어주면 어떨까?
  • 82. Pixel 단위 섞기 • 일정 범위 안의 Random한 Pixel과 교환 • 고주파 Noise를 이용해서 교환 Pixel 결정 (3) 교환 (2) Noise 값을 이용 일정 범위에서 교환할 Pixel 선택 (1) 현재 Pixel 위치에 해당하는 Noise 선택
  • 83. Pixel 단위 섞기 호수 / 바다는 따로 Mask 사용 섞이지 않게 해야 함
  • 85. 추가 구현 내용 • 지금까진 주로 아티스트의 의도만 반영 • 일단 보기 좋게 만들자 • 게임 디자이너의 의도 역시 반영 되어야 한다! • 디자인 요구사항 • 생성되는 땅의 면적 조절 기능 • 생물 군계의 비율 조절 기능 • 자투리 섬 생성 안되게 • 봉우리 개수 조절 가능하게
  • 86. 생성되는 땅의 면적 조절기능 • Noise에 따라 달라지는 땅의 면적 • 섬마다 땅의 면적이 너무 차이 나면 문제 • 땅의 총 면적이 원하는 값이 되도록 “기준 값”수정 물 물 Corner 이쯤에서 섬 생성 로직 다시 리뷰 Corner의 위치에 해당하는 Noise값을 이용 “기준 값” 이상이면 ‘땅’ / 이하이면 ‘물’
  • 87. 생성되는 땅의 면적 조절기능 • 알맞은 “기준 값” 을 찾기 위한 방법 • 땅의 면적은 기준 값의 크기에 따라 정렬 • 기준 값 땅의 면적  Binary Search • 요구 면적에 근접할 때 까지 반복 • 땅의 면적 : 모든 ‘땅’ Node 면적의 합 • 그냥 모든 ‘땅’ Node 개수의 합으로 근사 Best 기준 값 땅의 면적 기준 값 요구 면적
  • 88. • 땅의 비율이 55% 정도가 되도록 기준 값 자동 조절 • 섬모양의 변화는 유지 • 땅의 면적은 비슷하게 • 고정된 기준 값 • 섬마다 땅의 면적 차이 발생 Before After
  • 89. 생물 군계의 비율 설정 결국 원화는 비율이 되도록 “기준 값“ (온도 A,B / 습도 I,K,M) 을 수정! • 생성되는 생물 군계의 비율은 Random = 그때 그때 달라요! • Seed 가 변해도 기획자가 설정한 생물 군계 비율은 유지되게! 생물 군계 설정 방법 if(온도 < A) if(습도 > I) = 설원 else = 툰드라 else if(온도 < B) = 온대림 else if(습도 > K ) = 열대림 else if(습도 > M) = 초원 else = 사막
  • 90. 생물 군계의 비율 설정 • 땅의 면적 조절 기능과 거의 비슷함 • (설원 + 툰드라) / 나머지는 온도 A로 구분 • 온도 A를 Binary search • 계산된 온도 A값을 확정 • 설원 / 툰드라를 구분하는 습도 I 계산 • 동일하게 B, K,M 을 계산 • 온도 B = 온대림 / (열대림 + 초원 +사막) • 습도 K = 열대림 / (초원 + 사막) • 습도 M = 초원 / 사막 온도 A (설원 + 툰드라) Node 개수 온도 기준 요구 개수
  • 91.
  • 92. 여기까지가 현재 구현된 내용 • 그럭저럭 볼만한 섬 생성 가능 • 아직 서버 연동은 (...) • 계산 시간 • 1024x1024, 40000개 기준 5초 정도 • 4096x4096, 640000개 기준 1분 이상 • Voronoi Diagram 생성에 많은 시간사용
  • 93. 앞으로 개선할 사항 • 자투리 섬 생기지 않게 • 섬마다 개수 / 크기가 제각각 • 사실상 죽은 땅 • 본토 섬으로 병합처리 필요 • 호수의 면적이 일정하지 않음 • 지금은 땅의 면적만 일정하게 유지 • 호수가 너무 크거나 작으면 문제 • 일단 동일하게 섬 생성 과정 처리  그 후 섬 안에서 다시 호수 생성 하면?
  • 94. 앞으로 개선할 사항 • 좀 더 자연스러운 강의 표현 필요 • 삼각주 / 곡류 / 선상지 등의 표현 • 좀 더 S라인이 되어야 할 듯? www.scienceall.com
  • 96. 다양한 모습의 디테일한 섬이 필요 • 서버 – • 마을 서버 섬 크기 大 전체 서버 수 만큼 존재 미리 생산 가능 마을 섬 크기 中 유저 그룹만큼 존재 유저 개인 섬 크기 小 유저 수만큼 존재 서버와 연동해서 동적 생산 필요
  • 97. 툴을 통한 사전작업 • 섬의 고유 속성 설정 • 기획자 / 아티스트를 통해서 • 다양한 설정 가능 • Seed, 점의 개수, 맵의 크기 • 강 개수, 넓이 • Noise • 생태 군계 비율 • 땅 비율 • 데이터 출력 옵션
  • 98. 필요한 개수 만큼 생성 생성된 섬마다 Unique한 모습을 가지면서 미리 설정한 섬의 고유 속성 유지 Seed 변경
  • 99. 생성된 지형 데이터 게임에 적용 생물 군계 데이터 바다/강/호수 데이터 높이 데이터
  • 100. 생물 군계 데이터 • 생물 군계 별 바닥 처리 • 생물 군계 별 식생 배치
  • 101. 바다/강/호수 데이터 물론 이 사이에 많은 처리가 필요합니다(…)
  • 103. 결론은 자동생성 좋아요 • 이미 많은 게임들에서 자동 생성되는 컨텐츠를 사용 중 • Minecraft, 디아블로, 마비노기 • Realm of the mad god • 최대한 컴퓨터가 할 수 있는 일은 컴퓨터가 하게 • 사람은 좀 더 창의적이고 도전적인 일을 하자! • 이런 자동생성 작업이 상당히 재미있음 • 결과를 바로 바로 눈으로 확인 가능 • 아주 약간은 신이 된 기분 • 하지만 아트 센스가 없다면 어떨까(...) • 우리모두 함께 해요 
  • 104. Q&A (발표 할 때 올라온 질문들) • Q. 좋은 맵이 어떤 것인가에 대한 평가 기준을 정하는 것이 어려울 것 같 은데, 그 부분에 대한 고려가 궁금합니다. • A. 저희 프로젝트 기준으로 말씀 드리자면, 첫 번째로 일단 생성된 섬을 눈으로 봤을 때 패턴이나 인공적인 느낌이 들지 않고 실제 자연에 있을법 한 섬의 모습을 가져야 합니다. 이건 수치로 평가하긴 힘들고 눈으로 직 접 확인하고 게임 내에서도 테스트 해봐야 되겠지요. • 두 번째로 첫 번째 조건을 만족하면서도 게임의 기획 의도에 따른 특성을 만족시켜야 합니다. 앞에서 말씀 드렸던 섬의 크기, 생물 군계의 비율 등 이 될 수 있겠네요. 게임마다 필요한 필수요소 들이 있을 테니 그걸 잘 파 악하시는 것이 중요할 것 같습니다.
  • 105. • Q. 노이즈맵을 생성해서 만개의 맵을 만든다고 하셨는데 만개의 노이즈 맵의 용량이 상당하지 않나요? • A. 일단 섬의 생성 개수에 대해서 말씀 드리자면 만개의 맵을 만드는 것 은 아니고 게임에 필요한 개수 만큼 동적으로 생성하는 것이 목표입니다. 그리고 노이즈 자체도 따로 맵으로 만드는 것이 아니고 일반 Random 함 수처럼 좌표 값을 넣으면 Seed + 수식계산을 통해서 그 좌표에 해당하는 노이즈 값을 알아오는 방식이기 때문에 따로 메모리나 하드에 미리 노이 즈맵 파일을 생성하거나 하지는 않습니다. • Q. 해안 절벽 같은 건 없나요? • A. 아직 해안 절벽에 대한 고려는 해보지 않았습니다. 프로젝트에 필요하 다면 연구를 해야겠지만 어떻게 처리할지는 아직 잘 모르겠네요 
  • 106. • Q. 알고리즘 기반으로 만들어진 섬에 기획의도와 다른 결과물이 나오면 알고 리즘을 수정하게 될 텐데, 그러면 기존에 생성된 섬 데이터는 수정이 불가능하 지 않은지? 또한 그런 원치 않는 요소는 실제로 출현하기 전까지 알고리즘의 문제로 노출되지 않을 수도 있는데 결과물은 어떤 방식으로 검증하셨는지? • A. 이미 만들어진 섬은 당연히 수정이 쉽지 않습니다. 아주 미세한 수정이고 기 존에 만들었던 섬 데이터의 Seed와 각종 설정 값을 저장하고 있다면 그걸 바 탕으로 새로 만든 섬으로 변경이 불가능한 것은 아니지만 여러 가지 부작용(예 를 들어 섬의 모습이 바뀌어서 땅 위에 지어놓은 집이 물 위에 있다거나)이 생 길 수 있으니 게임에 이미 쓰이고 있던 섬의 수정은 최대한 지양해야 합니다. • 따라서 일단 기획의도와 다르게 만들어진 섬은 처음부터 게임에 쓰이지 않도 록 생성시 제대로 검증을 해야 합니다. 알고리즘 자체를 수학적으로 엄밀히 검 증하기는 힘들지만 결과물이 수학적 기획의도 대로 나오는지의 여부는 쉽게 검증할 수 있습니다. (예를 들어서 땅의 비율, 생물 군계의 비율, 섬의 경사도 등) 하지만 섬의 모양이 자연스럽지 않다거나 생물군계의 패턴이 보기에 단순 하다 등의 비주얼적인 측면은 자동 검증이 힘들기 때문에 최대한 많이 만들어 보고 경험적으로 확인하는 수 밖엔 없을 것 같습니다.