Cloth Simulation으로 깃발과 머리카락을 자연스럽게 움직이는 법

Cloth Simulation의 질량-스프링과 Position Based Dynamics 원리를 바탕으로 깃발과 머리카락의 흔들림을 설계한다. 고정점, 충돌, 감쇠, 서브스텝, LOD를 조정해 자연스러움과 성능을 함께 확보하는 실전 가이드.

✓ 복사 완료!
챕터일반 가이드
난이도중급
상태● 검토 완료
대상 엔진
Unity
최종 업데이트
Cloth Simulation으로 깃발과 머리카락을 자연스럽게 움직이는 법

핵심 요약

깃발과 머리카락의 자연스러운 물리 반응은 메시 정점 또는 본 체인을 입자로 보고 거리 제약을 반복적으로 보정하는 Position Based Dynamics(PBD) 방식으로 구현할 수 있다. 핵심은 움직이면 안 되는 고정점, 바람·관성 같은 외력, 감쇠, 충돌 그리고 프레임 안정성을 위한 서브스텝을 대상별로 분리해 조절하는 것이다.

Cloth Simulation은 왜 깃발과 머리카락에 적합한가?

Cloth Simulation은 천을 구성하는 여러 점을 서로 연결하고 연결 길이와 충돌 조건을 지키도록 반복 보정하는 물리 시뮬레이션이다. 깃발은 정점 기반의 넓은 천 메시로 머리카락은 가닥 또는 헤어 본 체인으로 표현하면 된다.

실시간 게임에서는 강체 물리처럼 힘을 엄밀하게 적분하는 방식보다 PBD가 자주 쓰인다. 제한된 반복 횟수에서도 제약을 안정적으로 유지하기 쉽고 아티스트가 강성이나 감쇠를 직관적으로 조절할 수 있기 때문이다.

대상주된 고정점중요한 외력우선순위가 높은 제약
깃발깃대에 붙은 가장자리 정점방향성 바람, 돌풍구조 거리, 굽힘, 깃대 충돌
긴 머리카락두피·헤어 루트캐릭터 이동 관성, 바람본 길이, 머리·어깨 충돌
짧은 앞머리두피 주변 루트미세한 관성짧은 거리 제약, 감쇠

깃대에 고정된 정점과 바람 방향, 천의 처짐을 보여 주는 Cloth Simulation 구성

질량-스프링과 PBD의 차이는 무엇인가?

질량-스프링 모델은 스프링 힘을 계산한 뒤 속도와 위치를 적분한다. 반면 PBD는 먼저 입자를 예상 위치로 이동시키고 목표 조건을 어긴 만큼 위치를 직접 보정한다.

거리 제약은 두 입자 위치를 xi\mathbf{x}_i, xj\mathbf{x}_j, 목표 길이를 dd라고 할 때 다음과 같이 정의할 수 있다.

C(xi,xj)=∥xi−xj∥−dC(\mathbf{x}_i, \mathbf{x}_j) = \lVert\mathbf{x}_i - \mathbf{x}_j\rVert - d

C=0C = 0이 되도록 반복 보정하면 연결된 두 입자가 원래 길이를 유지한다. 반복 횟수가 많을수록 천과 머리카락은 더 단단해 보이지만 연산 비용도 증가한다.

깃발 Cloth Simulation은 어떻게 구현할까?

Step 1. 메시와 고정점을 설계한다

깃발 메시는 가로·세로 분할이 너무 낮으면 각진 움직임이 드러나고 너무 높으면 제약 계산 비용이 증가한다. 일반적인 중거리 오브젝트는 16×10 또는 24×16 정도부터 시작해 화면 점유율과 플랫폼 성능을 기준으로 조정한다.

깃대에 붙는 세로 가장자리의 정점은 역질량을 0으로 둔다. 역질량이 0인 입자는 외력과 제약 보정의 영향을 받지 않으므로 안정적인 고정점이 된다.

Step 2. 구조·전단·굽힘 제약을 연결한다

정점 격자에는 최소 세 종류의 연결이 필요하다.

  1. 구조(Structural) 제약: 상하·좌우 이웃 정점의 간격을 유지한다.
  2. 전단(Shear) 제약: 대각선 정점을 연결해 사각형이 마름모로 무너지는 현상을 줄인다.
  3. 굽힘(Bend) 제약: 두 칸 떨어진 정점을 연결하거나 인접 삼각형의 각도를 제한해 종이처럼 접히는 모습을 완화한다.

깃발은 구조 제약만으로도 움직이지만 바람을 받았을 때 면이 과도하게 늘어나거나 접히기 쉽다. 전단과 굽힘 제약을 추가한 뒤 굽힘 강성은 구조 강성보다 낮게 시작하는 편이 천의 부드러움을 유지하기 좋다.

Step 3. 바람을 일정한 힘이 아닌 변화하는 장으로 만든다

항상 같은 방향과 크기의 힘을 주면 깃발이 반복 애니메이션처럼 보인다. 월드 위치, 시간, 법선을 함께 사용해 바람 세기를 변화시키면 더 설득력 있는 결과를 얻을 수 있다.

// Unity C#: 정점 또는 입자마다 적용할 예시 바람 가속도
Vector3 GetWindAcceleration(Vector3 worldPosition, float time)
{
    float gust = Mathf.PerlinNoise(
        worldPosition.x * 0.18f + time * 0.35f,
        worldPosition.z * 0.18f
    );

    Vector3 baseWind = new Vector3(1.0f, 0.08f, 0.25f).normalized;
    return baseWind * Mathf.Lerp(1.5f, 6.0f, gust);
}

바람은 면의 법선과 바람 방향이 마주 볼 때 더 크게 적용하는 것이 좋다. 바람 방향 w\mathbf{w}와 삼각형 법선 n\mathbf{n}의 내적을 사용하면 다음처럼 압력을 근사할 수 있다.

Fwind=k⋅A⋅max⁡(0,n⋅w^)⋅wF_{wind} = k \cdot A \cdot \max(0, \mathbf{n} \cdot \hat{\mathbf{w}}) \cdot \mathbf{w}

여기서 AA는 삼각형 면적, kk는 바람 세기 계수다. 양면 깃발이라면 법선 방향에 따라 힘이 사라지지 않도록 절댓값 또는 양면 판정을 별도로 설계한다.

머리카락 물리는 왜 천과 다르게 조정해야 하는가?

머리카락은 넓은 면이 아니라 가는 선의 집합이며 캐릭터의 빠른 회전과 이동에서 생기는 관성이 주요한 시각 요소다. 같은 Cloth Simulation 원리를 쓰더라도 충돌과 감쇠의 비중이 훨씬 크다.

헤어 루트 고정, 본 체인 거리 제약, 머리와 어깨 충돌 볼륨을 설명하는 머리카락 물리 구성

헤어 루트와 본 체인을 분리한다

헤어 루트는 스킨드 메시 또는 머리 본에 고정하고 그 아래 본만 시뮬레이션한다. 루트까지 흔들리면 두피에서 머리카락이 미끄러지는 듯한 인상이 생긴다.

파라미터깃발 권장 방향머리카락 권장 방향시각적 결과
강성중간길이에 따라 중간~높음높을수록 원래 형태 유지
감쇠낮음~중간중간~높음높을수록 잔떨림 감소
중력명확하게 적용약하게 적용 또는 가이드 형태로 보정처짐의 정도 결정
충돌 반경깃대 중심머리·목·어깨 볼륨관통 방지
서브스텝바람이 강할 때 증가빠른 동작에서 증가프레임 안정성 향상

긴 포니테일이나 양 갈래 머리는 각 가닥을 독립적으로만 풀면 서로 관통할 수 있다. 모든 가닥 간 충돌은 비용이 크므로 우선 머리와 어깨에 구·캡슐 콜라이더를 배치하고 필요할 때만 대표 가닥 사이의 간단한 분리 제약을 추가한다.

관성은 캐릭터 로컬 공간에서 다룬다

캐릭터가 급회전할 때 머리카락이 반대 방향으로 늦게 따라오는 반응은 시뮬레이션 공간을 캐릭터 로컬 공간으로 유지하면 제어하기 편하다. 프레임 간 루트의 위치·회전 변화를 계산해 가속도 보정으로 넣되 순간이동이나 텔레포트에서는 이전 위치를 현재 위치로 초기화해야 폭발적인 흔들림을 막을 수 있다.

// 위치 기반 적분의 간단한 형태
Vector3 predicted = currentPosition
    + (currentPosition - previousPosition) * (1.0f - damping)
    + acceleration * (deltaTime * deltaTime);

previousPosition = currentPosition;
currentPosition = predicted;

이 코드는 Verlet 적분의 기본 형태다. 이후 거리 제약과 충돌 제약을 여러 번 수행하고 마지막 위치 차이로 다음 프레임의 속도 성분을 간접적으로 유지한다.

프레임이 흔들리거나 천이 폭발하는 이유는 무엇인가?

대부분의 문제는 큰 시간 간격, 부족한 반복 횟수, 과도한 외력, 불안정한 충돌 보정 중 하나에서 시작된다.

증상흔한 원인우선 조치
깃발이 과도하게 늘어남제약 반복 부족, 강성 부족서브스텝 또는 반복 횟수 증가
머리카락이 떨림충돌면 사이 왕복, 감쇠 부족충돌 반경 조정, 감쇠 증가
캐릭터 회전 때 폭발루트 이동량이 외력으로 과대 적용됨최대 관성 가속도 제한
저프레임에서 관통큰 Δt\Delta t, 한 번의 충돌 검사고정 시간 스텝과 서브스텝 적용
형태가 지나치게 딱딱함굽힘 강성 또는 반복 횟수 과다굽힘 강성부터 낮춤

실시간 업데이트는 가능하면 고정 시간 간격으로 나누어 처리한다. 렌더링 프레임 시간이 Δt\Delta t일 때, 서브스텝 수를 NN으로 두면 각 시뮬레이션 스텝은 다음 시간 간격을 사용한다.

h=ΔtNh = \frac{\Delta t}{N}

모바일이나 다수 NPC가 있는 장면에서는 모든 대상의 NN을 높이는 대신, 화면 크기와 거리에 따라 시뮬레이션 품질을 단계적으로 낮추는 방식이 효과적이다.

자연스러움과 성능을 함께 확보하는 최적화 순서

Step 1. 시뮬레이션 범위를 줄인다

보이지 않는 뒷머리, 카메라 밖의 깃발, 아주 작은 원거리 오브젝트까지 고품질 물리를 계산할 필요는 없다. 카메라 거리와 화면 크기를 기준으로 업데이트 빈도, 입자 수, 제약 반복 횟수를 낮춘다.

Step 2. 충돌체를 단순화한다

머리카락 충돌에 스킨드 메시 삼각형 전체를 사용하면 비용과 불안정성이 빠르게 커진다. 머리에는 구, 목과 팔에는 캡슐 콜라이더를 우선 사용한다. 깃발도 깃대를 캡슐 또는 원기둥에 가까운 간단한 형태로 처리하는 편이 실용적이다.

Step 3. LOD와 애니메이션을 섞는다

근거리에는 PBD 시뮬레이션을 사용하고 중거리에는 본 수를 줄인 단순 시뮬레이션을 사용한다. 원거리에는 셰이더 기반 버텍스 변형이나 루프 애니메이션으로 전환하면 비용을 크게 줄일 수 있다. 전환 시에는 두 결과를 짧게 블렌딩해 갑작스러운 형태 변화를 감춘다.

자주 묻는 질문 (FAQ)

Q. 깃발에 Bone 애니메이션만 써도 되나요?

가능하다. 바람 방향이 제한적이고 반복이 눈에 띄지 않는 원거리 배경이라면 본 애니메이션이나 셰이더 변형이 더 저렴하다. 플레이어 가까이에서 충돌과 변화하는 바람이 보여야 할 때 Cloth Simulation이 유리하다.

Q. 머리카락 가닥끼리 충돌을 꼭 계산해야 하나요?

대부분은 아니다. 머리·목·어깨 충돌만으로도 관통의 상당수를 감출 수 있다. 가닥 간 충돌은 가까운 카메라, 긴 머리, 강한 동작처럼 시각적 이득이 큰 경우에만 제한적으로 적용한다.

Q. 제약 반복 횟수와 서브스텝 중 무엇을 먼저 늘려야 하나요?

저프레임에서 관통하거나 폭발한다면 서브스텝을 먼저 늘린다. 형태가 쉽게 늘어나는 문제라면 제약 반복 횟수와 강성을 먼저 조정한다. 둘을 동시에 크게 올리기보다 문제가 나타나는 상황을 재현하며 하나씩 조절해야 비용을 통제할 수 있다.

마무리

Cloth Simulation의 목표는 물리적으로 완벽한 천이나 머리카락이 아니라 플레이어가 납득할 수 있는 반응을 안정적인 비용으로 만드는 데 있다. 깃발은 바람의 변화와 굽힘을 머리카락은 루트 고정과 관성·충돌을 우선 조정하자. 그 다음 서브스텝, 제약 반복 횟수, LOD를 장면별로 배치하면 자연스러움과 성능 사이의 균형을 잡기 쉬워진다.