천 찢기 시뮬레이터베타
핀으로 고정한 천을 잡아당기고 찢고 바람에 날려 보는 Verlet 물리
이 도구는 아직 안정화 중인 베타 버전입니다. 결과가 예상과 다르면 알려주세요.
천은 점들을 실(거리 제약)로 이은 격자입니다. 각 점은 Verlet 적분으로 이전 위치와 현재 위치의 차이를 속도 삼아 움직이고, 매 프레임 실의 길이를 여러 번 되돌려 천 모양을 유지합니다. 실이 원래 길이의 한계 배율보다 늘어나면 끊어집니다. 「전단 제약」은 칸마다 대각선 실을, 「굽힘 제약」은 한 칸 건너 점끼리 잇는 실을 보이지 않게 더해 천이 찌그러지거나 접히는 것을 줄입니다. 이 실들은 스스로 끊어지지 않고, 기대는 가로·세로 실이 끊어지면 함께 끊어집니다. 캔버스를 눌러 끌면 천을 잡아당기고, 자르기 도구나 마우스 오른쪽 버튼으로 그으면 잘립니다. 무늬를 고르거나 이미지를 넣으면(캔버스에 끌어다 놓아도 됨) 천에 입혀지고, 이미지 비율에 맞춰 천 모양이 바뀝니다. 정밀도를 올리면 점이 많아져 더 매끄럽게 찢어지지만, 늘어지지 않게 하려면 뻣뻣함도 함께 올려 주세요.
처리 중…
0.0
멈춘 것이 아닙니다. 계산이 끝나면 결과가 표시됩니다.
천 찢기 시뮬레이터 소개
이 천은 격자 모양으로 늘어선 점들과 이웃한 점을 잇는 실(거리 제약)로 되어 있다. 점은 속도를 따로 저장하지 않는다. 지금 위치와 직전 위치만 기억하고, 그 차이를 속도로 삼는다. 이런 「속도 없는」 베를레 적분에 제약을 반복해서 맞추는 방식은 Thomas Jakobsen이 2001년 GDC 발표 「Advanced Character Physics」에서 소개했고, IO Interactive의 「Hitman: Codename 47」에서 천, 식물, 쓰러지는 몸(래그돌)을 움직이는 데 쓰였다.
천은 2차원이다. 화면 평면 안에서만 움직이고, 천끼리 겹쳐도 서로 부딪히지 않는다(자기 충돌 없음). 기본으로는 실이 가로·세로 이웃 사이에만 있어서, 한 칸이 마름모꼴로 기울어지는 변형(전단)과 접힘에는 저항이 없다. 「전단 제약」을 켜면 칸마다 대각선 실이, 「굽힘 제약」을 켜면 한 칸 건너 점끼리 잇는 실이 보이지 않게 더해져 이런 변형이 줄어든다. 이 실들은 스스로 끊어지지 않고, 기대는 가로·세로 실이 찢어지거나 잘리면 함께 끊어진다.
한 프레임에 일어나는 일
위치를 직접 옮기는 방식이라, 제약을 맞추느라 점을 옮기면 그 이동이 다음 스텝의 속도에 저절로 반영된다. 속도와 위치가 따로 놀 일이 없어 매우 안정적이다. 반대로 에너지는 조금씩 새는데, 천 흉내에는 오히려 도움이 된다.
- 관성 이동: 새 위치 = 지금 위치 + (지금 위치 − 직전 위치) × 감쇠 + 가속도 × Δt². 감쇠 기본값 0.99는 Jakobsen이 말한 「2를 1.99쯤으로 낮추면 약간의 저항이 생긴다」와 같은 장치다.
- 제약 풀기: 모든 실을 차례로 돌며, 실이 원래 길이보다 길면 두 끝점을 절반씩 당기고 짧으면 민다. 한쪽이 핀으로 고정되었거나 손으로 잡힌 점이면 다른 쪽만 움직인다. 이것을 「뻣뻣함(반복 횟수)」만큼 되풀이한다.
- 찢어짐 판정: 반복이 모두 끝난 뒤, 원래 길이의 「찢어지는 한계」배보다 긴 실을 끊는다.
- 벽·바닥: 화면 밖으로 나간 점을 가장자리로 되돌리고, 바닥에서는 가로 속도를 절반으로 줄여 마찰을 흉내 낸다.
완화법: 왜 반복하면 맞아떨어지나
실 하나를 맞추면 이웃한 실이 다시 틀어진다. 그래도 전체를 여러 번 훑으면 모든 실이 동시에 거의 맞는 상태로 수렴한다. Jakobsen은 이것을 완화법(relaxation, 푸는 방식에 따라 야코비 또는 가우스-자이델 반복)이라 불렀다. 이 도구는 고친 위치를 곧바로 다음 실 계산에 쓰므로 가우스-자이델 쪽이다.
Jakobsen은 보기 좋은 천이면 대부분 한 번의 반복으로 충분하다고 썼다. 하지만 이 도구처럼 점이 수천 개이고 윗줄만 핀으로 걸린 천은 한 번으로는 실이 다 펴지지 않아, 천 전체가 고무처럼 늘어난다. 「뻣뻣함」을 2로 내리면 천이 축 처지고 흔들림이 느려지며, 40 이상으로 올리면 거의 늘어나지 않는 천이 된다. 뻣뻣함은 재질의 물성이 아니라 계산을 얼마나 끝까지 하느냐의 문제라는 점이 이 방식의 특징이다.
격자를 촘촘하게 하면 같은 반복 횟수로는 덜 풀린다. 그래서 점 간격이 약 12픽셀보다 좁아지면 한 프레임을 최대 6개의 부분 스텝으로 나눠 푼다.
찢어짐은 어떻게 퍼지나
실 하나가 끊기면 그 실이 나르던 힘이 이웃 실에 몰린다. 이웃이 더 늘어나 한계를 넘으면 또 끊기고, 이렇게 찢어짐이 한 줄로 번진다. 기본값 2.6이면 간격 12픽셀짜리 실이 31.2픽셀을 넘을 때 끊긴다. 한계를 1.3으로 낮추면 자기 무게만으로도 윗줄 근처가 버티지 못하고, 6으로 올리면 세게 잡아채도 잘 안 찢어진다.
핀 배치가 결과를 크게 바꾼다. 네 칸마다 핀이 박힌 기본 배치는 핀 사이가 늘어지며 물결 모양이 생기고, 양 끝만 고정하면 가운데가 크게 처져 윗부분 실에 무게가 집중된다. 윗줄 전체를 고정하면 무게가 고르게 나뉘어 가장 잘 버틴다.
예시
찢어지는 길이 계산
- 입력
점 간격 12 px, 찢어지는 한계 2.6- 결과
12 × 2.6 = 31.2 px를 넘으면 끊김
판정은 제약을 다 푼 뒤에 한다. 반복 도중의 일시적인 늘어남으로는 끊기지 않는다.
감쇠 0.99가 1초에 남기는 속도
- 입력
초당 60프레임, 부분 스텝 1개 / 6개- 결과
두 경우 모두 0.99⁶⁰ ≈ 0.55
감쇠 값은 60fps 한 프레임 기준이다. 부분 스텝이 n개면 스텝마다 0.99^(1/n)을 곱하므로, 격자를 촘촘하게 해도 흔들림이 잦아드는 빠르기는 같다.
사용 방법
- 캔버스를 누르고 끌어 천을 잡아당긴다.
- 자르기 도구나 오른쪽 버튼으로 그어 천을 자른다.
- 중력·바람·찢어지는 한계·뻣뻣함·핀 배치를 바꿔 본다.
- 무늬나 이미지를 골라 천에 입힌다.
주요 용어
- 베를레 적분(위치 형태)
- x_새 = 2x − x_이전 + aΔt². 속도를 저장하지 않고 두 위치의 차이로 대신한다.
- 거리 제약
- 두 점 사이 거리를 정해진 길이로 유지하라는 조건. 이 천에서 「실」에 해당한다.
- 완화법
- 여러 제약을 하나씩 맞추는 일을 반복해 전체 해에 다가가는 방법.
자주 묻는 질문
천이 너무 늘어나요.
뻣뻣함(반복 횟수)을 올린다. 격자 정밀도를 높였다면 특히 필요하다. 반복이 부족하면 실이 원래 길이로 다 돌아가지 못해 천이 고무처럼 늘어난다.
가만히 두었는데 천이 찢어져요.
찢어지는 한계가 낮거나 뻣뻣함이 낮아 자기 무게로 늘어난 실이 한계를 넘은 것이다. 둘 중 하나를 올리거나 핀을 윗줄 전체로 바꾼다.
게임 속 천도 이렇게 만드나요?
이 방식과 그 후속인 위치 기반 동역학(PBD)은 게임에서 널리 쓰인다. 실제 게임 천은 대각선 실(전단)과 한 칸 건너 잇는 실(굽힘)을 더하고 캐릭터와의 충돌도 처리한다. 이 도구에서도 「전단 제약」「굽힘 제약」을 켜서 그 차이를 볼 수 있다.
출처
- Thomas Jakobsen, Advanced Character Physics, Game Developers Conference 2001 (CMU course mirror)
- L. Verlet, Computer "Experiments" on Classical Fluids. I, Phys. Rev. 159, 98 (1967)
기준일: