2021.04.26 위키아 기반으로 내용 보강/수정됨
출처: https://valheim.fandom.com/wiki/Building_Stability
1. 개요
발하임의 건축 시스템에는 사실적인 면을 더하기 위해 '안정성(Stability)'이란 요소가 있습니다. 설치한 부품의 안정성이 확보되지 않는다면, 그 부품은 무너집니다.
이 안정성이란 녀석은 부품의 재료, 위치와 방위, 그리고 붙어있는 부품들에 의해 결정됩니다. 게임 내적으로 이 안정성은 '지지값(Support)'라는 숫자로 표현됩니다. 어떤 부품이 무너질지 그 자리에 서 있을지는 이 지지값이 결정하는 것이죠. 그러면 부품들의 지지값이 구체적으로 어떻게 결정되는지, 본 글에서 살펴보겠습니다.
2. 재료에 따른 지지값 결정변수
종류 |
접두사 Prefixes |
최대지지값 MaxSupport |
최소지지값 MinSupport |
수직상실 VerticalLoss |
수평상실 HorizontalLoss |
목재Wood |
나무, 초가지붕 |
100 |
10 |
0.125 (=1/8) |
0.2 (=1/5) |
석재Stone |
돌 |
1000 |
100 |
0.125 |
1 |
철재Iron |
철제, 나무 쇠 |
1500 |
20 |
0.07692308 (=1/13) |
0.07692308 |
단단한 목재 Hardwood |
통나무 |
140 |
10 |
0.1 |
0.16666667 (=1/6) |
최대지지값 |
해당 부품이 가질 수 있는 최대의 지지값을 뜻합니다. 보통 지면, 나무, 돌처럼 자연물에 설치한 부품이 가집니다. |
최소지지값 |
해당 부품이 무너지지 않기 위해 지켜야 하는 최소한의 지지값입니다. 어떤 부품의 설치 후 지지값 계산 결과가 최소지지값 '이하'라면, 무너집니다. |
수직상실 |
부품의 세로방향 지지값 상실을 계산할 때 사용하는 상수입니다. |
수평상실 |
부품의 가로방향 지지값 상실을 계산할 때 사용하는 상수입니다. |
3. 지지값 계산식
우선 용어부터 확실히 하고 넘어가죠. 한 부품 A의 어떠한 곳이라도 다른 부품이나 자연물 B의 표면에 닿은 상태를, 해당 부품 A는 부품 B와 '접촉했다' 라고 정의합시다.
부품이 지면이나 자연물에 직접 접촉한 경우 지지값은 재료의 최대지지값으로 고정됩니다. 만약 부품이 어떠한 곳이라도 접촉하지 않았다면 지지값은 0이 될 것이고, 부품은 무너질 겁니다. 만약 부품이 다른 건설 부품 - "부모"로 불리는 - 이랑만 접촉 중이라면, 지지값은 다음의 요소를 고려한 계산식에 의해 정해집니다.
- 재료
- 각 부모의 지지값
- 부모로부터의 거리
- 부모를 기준으로 해당 부품의 방위
3.1 부모가 하나일 때
어떤 부품을 지지하는 부모가 하나인 상황이 가장 기본적일 겁니다.
이 때는 부모가 부품을 지지하는 '지지점(Support point)'에 기반하여, '거리(Distance)'와 '각손실(AngledLoss)'을 계산해서 최종 지지값이 도출됩니다.
3.1.1. 거리 계산
거리 계산은 피타고라스식에 오차 보정(fudge factor) 0.1m 를 더한 식으로 계산됩니다. 그러니까... 아래 식이요.
예시를 들어서 설명해보겠습니다.
사진과 같이 4m 통나무 기둥에 2m 통나무 들보가 지어져 있습니다. 통나무 기둥의 (너비, 높이)는 (0,4)고, 통나무 들보는 (2,0)입니다.
이걸 위 식에 대입해보면 루트 5, 대략 2.236m 가 나옵니다. 여기에 오차 보정 0.1m를 더하면 거리는 2.336m로 결정됩니다.
3.1.2. 각도, 각손실 계산
각손실을 결정하기 이전에 먼저 각도를 계산해야 합니다. 각도는 부품의 중간점과 지지점으로 계산되는데 중간점은 말 그대로 부품의 중간 지점(혹은 무게 중심), 지지점은 부모와 부품이 접촉한 지점으로 정의됩니다.
* 지지점까지의 거리를 계산할 때는 오차 보정을 하지 않습니다. 즉, 0.1을 더하지 않습니다
각도를 알았다면 다음은 각손실을 계산해야 합니다. 다음 공식을 따릅니다.
3.1.3. 지지값 계산
자 이제 거리와 각손실 모두를 계산 할 수 있게 되었으니, 최종 지지값이 어떻게 변화하는 지도 구할 수 있습니다!
실제 예제를 통해 지지값이 어떻게 변하는 지를 알아봅시다.
지면에 2m 나무 기둥이 박혀있고 그 위에 2m 나무 기둥이 지어져 있다. 이 때 위에 있는 나무 기둥의 지지값을 구하시오(4점)
풀이
아래의 기둥을 '부모'로, 위의 기둥을 '부품'으로 볼 수 있겠습니다. 부품의 '중간점'은 기둥의 1m 높이 한가운데겠고, 부모-부품 간의 지지점은 그냥 부품 맨 아래입니다. 위 공식을 이용하면 다음과 같은 결과가 나옵니다.
즉, 나무 기둥 위에 나무 기둥을 얹으면 대략 지지값이 26.25%씩 줄어들게 되네요. 이 과정을 반복한다면, 지지값은 언제 최소지지값(10) 아래로 떨어질까요?
표로 만들면 아래와 같습니다.
층 | 부모 지지값 | 부품 지지값 |
1 | 100 | 73.75 |
2 | 73.75 | 54.39 |
3 | 54.39 | 40.11 |
4 | 40.11 | 29.58 |
5 | 29.58 | 21.82 |
6 | 21.82 | 16.09 |
7 | 16.09 | 11.87 |
8 | 11.87 | 8.75(붕괴) |
즉 나무 기둥을 8층(16m) 까지 쌓으면, 그 위로 나무 기둥을 쌓는 순간 지지값은 최소지지값인 10을 만족하지 못하기 때문에 무너집니다.
지지값 계산식을 보시면 아시겠지만, 부품의 지지값을 계산하는 데 부모의 지지값을 사용합니다. 그렇기 때문에 부모가 될 부품들을 최대지지값이 높은 부품으로 써야 안정적인 건축이 가능해집니다.
철재 부품들은 높은 최대지지값과 낮은 수평/수직손실 덕분에 엄청나게 안정적인 부품입니다. 무엇보다 수평지지값과 수직지지값이 똑같아서 어느 방향으로 짓던 같은 수준의 지지값 하락을 기대할 수 있습니다.
석재 부품들은 최소지지값이 목재의 최대지지값과 같다는 점에 주목할 만 합니다. 즉, 석재가 어디에 위치해있던 일단 목재가 석재와 접촉한 상태라면, 해당 목재는 지면에 접촉한 목재 바로 위에 지어지는 것 이상의 지지값을 가질 수 있습니다. 동시에 석재의 수평손실이 1이라는 점에 주목해야 합니다. 돌을 옆으로 붙이는 것은 정말 힘든 일입니다(...)
3.2 부모가 여럿일 때
그러게요.
...아무튼; 한 부품을 여러 개의 부품이 지탱한다는 것은 다음의 조건을 만족할 때 성립됩니다.
1. 각 부모가 부품의 중간점 아래에 위치할 때
2. 부품 기준으로, 각 부모의 지지점이 100도 이상 틀어져 있을 때
이 조건을 만족하는 모든 부모는 부품을 '상호 지지(Mutually Support)'합니다. 부모들이 부품을 상호 지지하는 상황에서는 부품의 지지값 계산식이 좀 달라집니다. 각 부모와 부품의 지지값 계산은 3.1에서 소개한 대로 각각 수행한 후에, 수직손실만을 이용해서 평균을 내는 것이죠.
가장 간단하게 부모 A와 부모 B가 상호 지지 하는 상황에서의 부품의 지지값 계산을 수식으로 나타내면 아래와 같습니다.
3.3 지지값의 최종 결정
부품의 최종 지지값은 각 부모의 지지값과, 상호 지지값이 모두 계산된 후에 제일 높은 지지값이 선택됩니다. 만약 최종지지값이 부품의 최대지지값보다 높다면 최대지지값을 가지게 됩니다.
예를 들어 나무 바닥을 나무 기둥 1개로 지지하는 것과 나무 기둥 4개로 지지할 때를 비교해봅시다. 계산은 복잡하니 패스하더라도 나무 기둥 4개의 상호 지지값이 더 높음을 어림짐작할 수 있습니다. 이 경우 최종지지값은 나무 기둥 4개의 상호 지지값이 됩니다.
그리고 옆에 바위에 나무 쇠 들보를 박아서 나무 바닥의 옆에다가 꽂아넣었다고 칩시다. 이 경우 나무 쇠 들보의 지지값은 1500이고, 정 가운데로 연결했다고 칩시다. 그러면
1500*(1-2.1*0.2) = 870 정도의 지지값을 가집니다. 따라서 이 경우 최종지지값은 나무 쇠 들보 단독 870 이 되는데 나무 바닥의 최대지지값은 100이므로, 최종적으로 100의 지지값을 갖게 됩니다.
4. 동적 안정성
엉터리 지지를 하더라도 부품의 안정성은 바로바로 적용되는 것이 아닙니다. 반복적인 지지값 계산을 통해, 최종 값을 얻어내고, 그 최종 지지값이 최소지지값보다 아래라면, 무너지겠죠.
부품이 처음 지어질 때, 부품은 최대지지값을 가지게 됩니다. 그리고 매 0.5초마다 최종적인 지지값에 도달할 때까지 반복해서 계산합니다. 그래서 부품이 무어냐에 따라서 부모의 지지값이 한순간 올라가는 경우도 생깁니다. 그리고 계산을 반복하면서, 결과적으로 부품은 부모보다 아래의 지지값을 가지게 되는 것이죠.
건물 2층 이상에서 화로 등을 설치해보려 하셨던 분들은 아마 겪어보셨을 건데 부실한 지지대 위에 설치한 화로가 처음에는 파란색으로 표시되고, 색이 변하는 것도 목재보다 느려서 설치 되는가보다 하고 잠깐 신경 끄고 있으면 어느샌가 시뻘게지더니 파괴되는 경우가 있는데 이게 동적 안정성을 체감할 수 있는 사례입니다.
5. 안정성 실험 예시
물론 매 건축 때마다 요런 안정성을 우리가 머리 터지게 계산하면서 할 수는 없는 노릇입니다. 그래서 각 재료의 안정성을 한 눈에 보기 좋도록 발하임 레딧의 'ToddGeorgeKelly' 라는 유저가 제작한 안정성 실험 스샷을 첨부합니다.
이건 제가 다리 건설에 참고하기 위해 실험했던 스샷입니다.
특기할만한 사항으로는 석재 층 수가 하나씩 내려갈수록 옆으로 붙이는 석재의 수도 정확하게 하나씩 늘어난다는 게 있습니다. 그리고 철재 들보 2개가 석재를 '상호 지지' 하기 때문에, 들보를 하나만 쓸 때와 비교해서 돌 바닥을 하나 더 붙일 수 있습니다. 만약 들보를 한줄만 쓰실거라면 예를 들어 8층에선 7개가 아니라 6개까지 바닥을 깔 수 있습니다.
건축하시는 분들 도움이 되셨으면 좋겠습니다.
그나저나 다리를 만들겠다는 패기는 음...접어야 하나 싶네요 지반 공사 해서 6층 말고 4층 쌓는다 쳐도 주탑에만 철이 32개에 10칸 이을때마다 철 40개 =-=;;
평범한 다리는 몰라도 선박이 통과할 수 있을 정도의 다리는 좀 힘들죠ㅎㅎ;; 특히나 바닐라로 하려면 물 깊이가 조금만 깊어도 기둥조차 못 박는 지형이 허다해서 거의 불가능에 가깝죠...
저도 철기 직전에 다리 최대한 높게 지엇는데 저게 한계.. 롱쉽은 저 밑으로 못지나가요. 지금은 다시 지어야 되긴 하는데 일단 철이 충분히 안모여서 당분간 보류하고 이런저런거 실험하면서 짓는 중이네요.
아 아무래도 이게 데미지 쪽인갑다 짐작은 하고 있었는데 위키 가보니깐 stability 관련해서 아예 수식적으로 정리가 되어 있었네요. 이 글은 그거 기반으로 해서 다시 수정하겠습니다.