viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cec86fa11d0283110260b998d7cfa8997b92765238b1b72e7a2b00c9903c348f38bc464071617a39e5172311c556aade3d28d49f4011971bfead9

진짜 없어보이네 ㅋㅋ 


Poisson disc를 사용했는데,

그냥 일정한 거리를 유지하면서, 불규칙하게 점을 찍는 알고리즘임


이러한 작업을 하는 방법에는 

1. 단순한 랜덤생성 - 랜덤 점 선택 후, 기존의 모든 나무와 거리 비교 후 너무 가까우면 취소

2. Jittered grid - 그리드를 생성 후, 각 그리드의 점을 랜덤으로 조금씩 비틀어주기

3. Poisson disc - 그리드를 생성했을 때, 각 그리드 사각형 안에는 나무가 1개 또는 0개만 존재할 수 있음. 이 그리드의 사각형을 앞으로 그냥 사각형이라 부를거임.

나무와 나무사이의 최소거리가 r일 때, 그리드 한칸의 길이는 r / 루트2가 됨.

이는 사각형에 나무가 0~1개만 존재할 수 있도록 보장해주는 규칙이기도 함.


랜덤으로 한 점을 선택 후, 리스트에 넣어줌.

-----반복문 --- 점이 들어가있는 리스트에서 while로 점이 모두 사라질때까지 반복

리스트의 점을 기준으로 r ~ 2 x r 만큼 떨어진 위치의 새로운 점을 구함 - 반드시 다른 사각형 안의 점이면서, 근처에 있는 점

해당 점이 속할 사각형에 나무가 존재한다면 패스,

존재하지 않는다면 주변(둘러싼) 사각형들의 나무와 비교해서 최소거리가 r 이상일 때, 해당 점을 유효하다고 판단하고 반복문에 추가함.

근처의 새로운 점을 여러번 찾아본 후, 리스트에서 제거


모든 나무와 비교하는게 아니라 근처 나무하고만 비교한다는 점이 포인트

근처 나무와만 비교한다는 점과, 전체 공간에 골고루 퍼뜨려진다는 점이 핵심인듯


2D좌표계 위에 점들을 생성했으니 실제월드에 옮기기 위해 땅의 높이를 구해서 3D좌표계로 옮겨서 적용시켜줌.




나는 무한맵을 생성중이고, 이런 알고리즘은 제한된 좌표 안에서만 유효함. 

당연히, 구역별로 나누어서 생성해야 함.


만약 각 청크별로 따로따로 나무를 배치해주면, 청크의 나무와 옆 청크의 나무사이의 거리는 고려할 수가 없음.

그리고 청크의 끝자락에는 나무를 배치해줄 수가 없음. 옆 청크로 넘어가니깐.

가능은 한데, 병렬로 청크를 로드해주고 있어서 내 상황에서는 불가능함.


그래서 저번 글에서도 말했듯이 region별로 (256x256x256) 기본 지형이 아닌 구조물들은 한번에 로드해주고 있음.

위와 마찬가지로 region의 나무와 옆 region의 나무사이의 거리는 고려할 수 없지만, 워낙 region이 크다보니 눈치 못챌거임.

나중에 상황봐서 512x512x512로 바꾸거나, 여러 region을 한번에 로드가 가능하게 만들어, 초 거대 구조물도 추가 가능하게 할지도


256x256크기의 좌표에 나무들을 추가해서, region의 데이터에 추가해줌.


정리하자면

1. region을 새로 생성함

2. 한번도 생성한 적 없는 region임

3. 이 때 일괄적으로 모든 구조물을 한번에 생성해줌. 데이터는 region전체를 한 파일로 저장하니깐 문제없음

핵심은 청크 로드 여부와 관계없이, 데이터를 직접 수정할 수 있어야 한다는 점.


프리셋 만드는 툴도 있으니깐, 이제 구조물을 추가할 때 집 같은것도 추가해줄 수 있음.




그리고 저번에 블록회전시 텍스쳐를 어떻게 입히지에 대해 끙끙 앓았는데, 내가 멍청이였음.

uv좌표를 90도 돌려서 입히려 하니깐 헷갈리지. 

버텍스를 추가해 주는 순서를 바꾸는 식으로 가면 안헷갈림.

이를테면 왼쪽으로 넘어졌다면, 오른쪽 면이 윗면으로 갈 때, 기존의 오른쪽 면의 버텍스 추가 순서를 윗면의 버텍스 추가 순서로 지정하는거지.

아무튼 미리 규칙을 지정해야 한다는 점에선 같은데, 이게 훨씬 직관적인듯.


아니면 편법으로 그냥 옆으로 넘어진 블록은 아예 다른 종류의 블록으로 따로 추가하던지.




사실 그동안 한건 치명적이였던 버그 해결이랑 이거 둘 뿐인듯

자꾸 하루 사이사이에 강의 들어야 해서 하기가 싫어짐.


이제 동굴/자원 생성, 반블록, 오브젝트(꽃 등), 용암, 밤/낮, 그림자 추가할 계획

아직도 UI, 인벤토리 부분은 하나도 작업 못함


오랜만에 하루 알차게 보냈다.


빨리 화산 폭발, 운석충돌 같은거 구현할 단계로 넘어가면 좋겠다.