땅을 파고 들어갈 수 있게 하려면, 겉모습만 있는 땅으로는 부족했습니다. 지표 아래를 칸·층 단위의 3D 복셀로 채우고, 그 복셀에서 메시를 뽑아 땅이 판 모양 그대로 자연스럽게 패이도록 만들었습니다.
지표 아래를 복셀로
세계의 모든 기둥은 맨 위 땅 높이를 그대로 갖고, 그 아래는 (가로, 세로, 층) 칸마다 고체와 공기를 가진 복셀로 채웠습니다. 지표를 쓰던 수많은 이동·배치 계산은 그대로 두고, 땅속만 진짜 3D가 되게 한 것이 핵심이었습니다.
땅속에는 시드로 정해지는 개미굴이 있습니다. 감기는 세계에 맞춘 값 노이즈 두 장이 동시에 0에 가까운 곳을 벌레 굴로, 셋째 노이즈가 큰 곳을 넓은 방으로 팝니다. 같은 시드면 누구의 세계에서도 같은 굴이 나옵니다. 가장 아래 기반암은 팔 수 없습니다.
듀얼 컨투어링으로 메시 뽑기
복셀을 그대로 상자로 그리면 파낸 자리가 계단처럼 보입니다. 땅을 0~255의 밀도로 저장하고, 듀얼 컨투어링(Dual Contouring of Hermite Data)으로 메시를 만듭니다. 표본 여덟 개로 이루어진 작은 칸마다, 밀도가 경계값을 지나는 모서리의 교점과 법선을 모아 작은 최소 제곱 문제(QEF)를 풀고, 그 해에 정점 하나를 둡니다.
평평한 곳에서는 정점이 교점의 평균에 머물러 매끄럽고, 두 면·세 면이 만나는 곳에서는 정점이 정확히 모서리선과 꼭짓점에 섭니다. 그래서 손대지 않은 땅은 또렷한 블록 모서리를 유지하고, 파낸 곳은 둥글게 이어집니다. 청크 경계의 칸은 이웃 청크와 같은 입력으로 다시 계산해 정점이 똑같이 나오므로 틈이 생기지 않습니다. 계산은 Burst 잡으로 돌립니다.
둥글게 패이는 흙
삽이나 곡괭이로 치면, 겨눈 곳을 가운데로 한 원 안의 칸들이 한 번에 깎입니다. 가운데는 많이, 가장자리로 갈수록 거리의 제곱에 따라 적게 깎이기 때문에, 숟가락으로 뜬 것 같은 자국이 남고 구덩이 비탈은 매끄럽게, 테두리는 구불구불하게 생깁니다. 바뀐 밀도에 닿은 조각만 다시 메시를 뽑습니다.
파낸 벽에는 깊이에 따라 다른 지층이 드러납니다. 겉은 그 지역의 흙, 조금 아래는 흙과 모래, 더 깊이는 돌입니다. 반대로 쌓는 블록은 반듯한 네모로 두어, 자연스럽게 파인 땅과 사람이 쌓은 것이 한눈에 구분되게 했습니다.


0.2초의 멈춤과 국소 갱신
한때 땅 한 칸을 팔 때마다 화면이 0.2초 넘게 멈췄습니다. 원인은 계산 자체가 아니라 구조였습니다. 땅이 바뀌면 "세계 판 번호"가 하나 오르고, 그 번호를 보던 화면과 캐시들이 세계 전체를 처음부터 다시 계산했습니다.
세계를 구역으로 나누고, 바뀐 칸이 속한 구역에만 알림을 보내게 바꿨습니다. 화면과 캐시는 자기 구역에 알림이 왔을 때만 그 부분을 다시 만듭니다. 이후로는 행동 하나마다 프레임 시간을 재서 멈춤이 없는지 확인합니다. "작은 변화는 작은 갱신"이 이 시기에 생긴 가장 중요한 규칙입니다.
