이상적인 움직임을 실현하기 위해서는 매개변수 조정이 필수적입니다. 여기에서는 매개변수와 깊이와 밀접한 관계가 있는 기준선 개념과 각 매개변수의 역할을 설명합니다.
기준선 이해하기
매개변수를 설정할 때 기준선 개념을 이해하는 것이 필수적입니다. 기준선은 프록시 메시의 고정 정점에서 시작하여 표면 연결을 따라 이동 정점까지 이어지는 경로입니다.
예를 들어, 다음과 같은 Transform 계층 구조가 있다고 가정합니다.
이 구조에서 [Fixed] 본을 시작점으로 BoneCloth를 생성하면, 기준선이 다음과 같이 할당됩니다.
이 기준선은 기즈모에서 [Base Line]을 활성화하면 확인할 수 있습니다.
MagicaCloth는 이 기준선을 따라 형태를 복원합니다. 그 결과, 2D와 같은 움직임을 유지하면서도 물리적으로 사실적인 움직임을 결합한 2.5D 스타일의 동작을 실현할 수 있습니다.
시작/끝과 깊이
기준선에는 시작점과 끝점, 그리고 깊이 정보가 포함됩니다. 이 정보는 기즈모 설정에서 [Base Line]과 [Depth]를 활성화하면 확인할 수 있습니다. 앞서 예로 든 Transform 구조를 다시 살펴보겠습니다. 흰색 숫자는 깊이를 나타내며, 시작점은 (0.0), 끝점은 (1.0)으로 설정되어 있어 각 정점이 어느 깊이에 해당하는지 확인할 수 있습니다. 이 깊이 값은 매개변수 설정에서 필수적인 지표입니다.
깊이는 자동으로 할당되며, (1.0)은 프록시 메시에서 가장 긴 기준선의 끝으로 설정됩니다.
BoneCloth에서의 기준선
BoneCloth에서는 기준선이 Transform 계층 구조를 기반으로 간단하게 생성됩니다. 즉, Transform 계층 구조와 동일한 방식으로 기준선이 설정됩니다.
MeshCloth에서의 기준선
MeshCloth에서는 기준선이 조금 더 복잡하게 자동 계산됩니다. 기준선은 고정 정점을 중심으로 주변 표면의 연결 상태에 따라 자동으로 생성됩니다. 예를 들어, KAGURA의 치마에서는 기준선이 자동으로 다음과 같이 형성됩니다.
MeshCloth의 기준선은 표면 연결 상태 및 고정 정점의 분포에 따라 다양한 방식으로 변경될 수 있다는 점을 기억하세요.
깊이와 매개변수의 관계
앞에서 설명한 것처럼, 기준선이 생성될 때 각 정점에 깊이가 설정됩니다. 이 정점의 깊이는 매개변수를 조정할 때 중요한 지표가 됩니다. MagicaCloth에는 이 깊이를 기준으로 값을 결정하는 여러 매개변수가 존재합니다.
예를 들어, 각도를 제한하는 Angle Limit을 살펴보겠습니다. Angle Limit은 기준선의 엣지가 휘어질 수 있는 각도를 제한합니다. Angle Limit의 설정 패널은 다음과 같습니다.
현재, 곡선 설정이 꺼져 있어 깊이에 관계없이 60도로 일정하게 설정되어 있습니다. 여기에서 오른쪽의 [C] 버튼을 누릅니다.
그러면 인스펙터가 확장되며, 곡선을 설정할 수 있습니다. 이 기능을 사용하면 각 정점의 깊이에 따라 서로 다른 제한 각도를 설정할 수 있습니다. 설정된 곡선을 확인해 보겠습니다.
가로 축은 깊이(0.0 ~ 1.0), 세로 축은 매개변수의 강도(0.0 ~ 1.0) 입니다.
예제:
깊이 0.0 → 강도 0.2 → 제한 각도: 60 × 0.2 = 12도
깊이 0.5 → 강도 0.6 → 제한 각도: 60 × 0.6 = 36도
깊이 1.0 → 강도 1.0 → 제한 각도: 60 × 1.0 = 60도
이제 앞서 설명한 BoneCloth의 깊이 개념과 결합해 보겠습니다. 각 정점의 깊이 값(0.0~1.0)은 곡선의 가로 축과 직접적으로 연결됩니다. 이것을 통해 각 정점이 받는 제한 각도가 어떻게 결정되는지 이해할 수 있습니다.
이처럼, 곡선 매개변수는 깊이와 연동하여 최종 값을 계산하는 방식으로 작동합니다. 이것이 깊이와 매개변수의 관계입니다. 또한, 모든 매개변수 패널에서 [C] 버튼이 있는 경우, 이 개념이 동일하게 적용된다는 점을 기억하세요.
매개변수 유형
여기에서는 실제로 존재하는 매개변수를 유형별로 소개합니다. 각 매개변수의 기능을 자세히 설명하면 페이지 수가 방대해지므로, 여기에서는 매개변수의 개요와 설정 가이드라인에 중점을 둡니다. 매개변수에 대한 자세한 내용은 별도의 컴포넌트 참조를 확인하세요.
Force
중력(Gravity) 및 공기 저항(Damping)과 같은 힘을 제어합니다. 약간의 중력을 추가하면 움직임이 보다 현실적으로 보입니다. 공기 저항을 낮추면 정점이 쉽게 멈추지 않으며, 반대로 공기 저항을 높이면 상단이 천천히 움직이게 됩니다. Gravity Falloff는 천의 방향에 따라 중력의 영향을 감소시킵니다. 예를 들어, Falloff가 1.0이면 천이 초기 자세와 같은 각도를 유지할 경우 중력이 적용되지 않습니다.
Angle Restoration
기준선의 각 엣지를 원래 위치로 회전시킵니다. 이 Angle Restoration은 움직임을 제어하는 가장 중요한 매개변수입니다. 움직임의 대부분이 여기에서 결정된다고 해도 과언이 아닙니다.
Stiffness는 한 번의 패스에서 수정되는 회전 각도의 크기입니다. 값을 높이면 복원 속도가 빨라집니다.
Velocity Attenuation은 복원 과정에서 정점에 적용되는 속도 감쇠량입니다. 이 값을 낮추면 가속도가 강해지면서 스프링처럼 튕기는 움직임이 발생합니다.
이 두 속성을 조정하는 것은 일정한 숙련도가 필요합니다. 먼저 프리셋을 로드하여 참고하는 것이 좋은 시작점입니다.
Angle Limit
기준선의 각 엣지가 원래 자세에서 휘어질 수 있는 각도를 제한합니다. 앞머리처럼 너무 많이 구부러지지 않도록 할 때 효과적입니다. 치마의 각도를 일정 범위 내로 제한하여 형태를 유지하는 것도 좋은 방법입니다.
Shape Restoration
프록시 메시의 형태를 유지하기 위해 세 가지 동작을 수행합니다.
매개변수 설명 추가 정보
Distance
메시의 신축성을 조절하며, 각 정점과 연결된 정점 간의 거리를 일정하게 유지함.
기본적으로 1.0이 적당하며, 회전하는 치마처럼 외곽이 늘어나 보이도록 설정할 경우 곡선을 사용하여 끝부분의 복원력을 약하게 조정 가능.
Tether
정점이 기준선의 시작점에 얼마나 가까워질 수 있는지를 제한함.
Compression 값을 낮추면 정점이 시작점에 가까워질 수 없음. 값을 높이면 정점이 자유롭게 이동 가능. 일반적으로 0.8 이상 설정 후 필요에 따라 조정하는 것이 권장됨.
Triangle Bending
메시가 구부러지는 저항을 조절하여 인접한 삼각형을 원래 각도로 되돌리려는 역할을 함.
메시의 형태 유지에 중요한 역할을 하며, 보통 1.0으로 설정하면 충분함. 프록시 메시에 삼각형이 없는 경우 설정할 필요 없음.
Inertia
캐릭터의 움직임과 애니메이션이 Cloth에 미치는 영향을 제어합니다. 예를 들어, 캐릭터가 움직일 때 천이 과도하게 흔들린다면 이 값을 낮춰 흔들림의 영향을 줄일 수 있습니다.
Inertia는 월드 관성(World Inertia)과 로컬 관성(Local Inertia)으로 나뉘며, 각각 캐릭터의 이동과 애니메이션에 연동됩니다.
또한 캐릭터가 순간 이동했을 때 이를 감지하여 시뮬레이션을 리셋하거나 그대로 유지할지를 선택할 수 있습니다.
자세한 내용은 Inertia 페이지를 참고하세요.
Movement Limit
프록시 메시 정점의 법선 방향으로 이동을 제한합니다. 이것을 Backstop이라고도 합니다.
위의 다이어그램을 참고하여 작동 방식을 확인하세요. 간단히 말해, 정점은 MaxDistance 범위 내에서만 이동할 수 있으며, BackstopCollision 바깥으로는 나갈 수 없습니다.
예를 들어, T셔츠의 모든 정점 법선이 인체 바깥쪽을 향하고 있다고 가정합니다. 이때, Backstop 기능을 사용하여 정점이 법선의 반대 방향으로 일정 거리 이상 들어가지 못하도록 제한할 수 있습니다. 이 기능을 이용하면 충돌 콜라이더 없이도 T셔츠가 인체 내부로 파고드는 것을 방지할 수 있습니다. 같은 원리로 앞머리가 머리 내부로 들어가는 것을 방지할 수도 있습니다.
중요한 점은 이 값이 프록시 메시의 정점 법선을 기준으로 계산된다는 것입니다. 렌더 메시의 법선과는 관계가 없습니다. 또한 이 제한의 기준이 되는 정점 위치와 법선 방향은 시뮬레이션 실행 전에 스킨된 프록시 메시의 포즈에서 가져옵니다. 그리고 프록시 메시의 법선도 조정할 수 있습니다.
Backstop 설명은 다소 길어지므로, 자세한 내용은 Backstop 설명 페이지를 참고하세요.
Collider Collision
가장 자주 사용되는 충돌 감지 방식으로, Sphere 및 Capsule과 같은 콜라이더를 이용하여 Cloth가 인체 내부로 파고드는 것을 방지합니다. 자세한 내용은 충돌 감지 설정 페이지를 참고하세요.
Self Collision
🚧베타 버전🚧
Cloth 자체가 스스로와 충돌하는 Self-Collision을 설정할 수 있으며, 다른 Cloth 오브젝트와의 충돌을 방지하는 Mutual Collision도 설정할 수 있습니다.
Self-Collision을 활성화하면 천 자체가 위 이미지처럼 충돌 감지를 수행합니다. 그러나 Self-Collision은 대량의 충돌 계산을 필요로 하므로 성능 부하가 매우 높습니다. 따라서 데스크톱 PC나 고성능 콘솔에서만 사용하는 것이 권장됩니다.
또한 Self-Collision은 현재 베타 기능으로, 향후 동작 방식과 설정이 변경될 가능성이 있습니다. 자세한 내용은 Self-Collision 전용 페이지를 참고하세요.
Spring
고정 속성을 가진 정점에 스프링 효과를 적용합니다. 이 기능은 캐릭터의 가슴 흔들림 같은 효과를 구현하는 데 적합합니다. Spring 패널은 BoneSpring에서만 사용할 수 있습니다.
튜닝 팁
지금까지 각 매개변수의 역할을 설명했습니다. 모든 작업은 이상적인 움직임에 가까워지도록 반복적인 시행착오를 거치는 것입니다. 그러나 이 작업은 매우 어렵기 때문에 몇 가지 조정 팁을 소개합니다.
중요한 매개변수부터 조정하기
매개변수의 수는 많지만, 실제로 움직임을 결정하는 것은 몇 가지 항목뿐입니다. 우선 아래 항목부터 조정해 보세요.
매개변수 설명
Force
중력(Gravity) 및 공기 저항(Damping). 정점의 움직임과 크게 관련됨.
Angle Restoration
회전 복원. 전체적인 움직임을 결정하는 가장 중요한 매개변수. 가장 먼저 조정하는 것이 좋음.
Inertia
캐릭터가 뛰거나 달릴 때 천이 과도하게 움직이면 여기에서 조정.
실시간 조정 활용하기
매개변수는 실행 중에도 인스펙터에서 조정할 수 있습니다. 실제로 게임을 플레이하면서 조정하면 시행착오 과정이 더 쉬워집니다.
프리셋 활용하기
프리셋은 매개변수를 설정하는 가장 빠른 방법입니다. 먼저 프리셋을 로드하여 원하는 움직임과 비슷한지 확인하세요. 만약 이상적인 움직임과 유사한 프리셋이 있다면, 개별 매개변수를 조정하여 시간을 절약할 수 있습니다.
프리셋 저장하기
매개변수는 쉽게 원본 프리셋으로 저장할 수 있습니다.
공들여 조정한 매개변수를 프리셋으로 저장하세요. 저장된 프리셋은 Preset 버튼에서 간단하게 불러올 수 있으며, 이를 활용하면 비슷한 움직임을 설정할 때 많은 작업을 줄일 수 있습니다. 실행 중에도 프리셋 저장이 가능합니다.
컴포넌트 복사 기능 활용하기
조정 작업에서 가장 번거로운 점은 실행 중에 인스펙터에서 조정한 내용이 실행 종료 후 모두 초기화된다는 것입니다. 이를 방지하려면 컴포넌트 복사 기능을 활용하세요! 이 기능은 실행 중에 컴포넌트의 “︙” 버튼을 눌러 인스펙터의 내용을 복사하는 기능입니다.
실행 중에 매개변수 조정이 성공적으로 완료되었다면, 이 기능을 사용하여 내용을 복사합니다. 그리고 실행이 끝난 후, 컴포넌트의 “︙” 메뉴에서 Paste를 선택하면 실행 중에 설정한 매개변수를 그대로 복원할 수 있습니다.
이 작업을 통해 실행 중에 조정한 매개변수를 실행 종료 후에도 인스펙터에서 유지할 수 있습니다.
다음 단계는?
지금까지 MagicaCloth의 기본적인 설정 방법을 설명했습니다. 이제까지의 내용을 적용하면 대부분의 Cloth 설정이 가능합니다. 따라서 너무 복잡한 작업이 아니라면, 추가적인 가이드를 읽을 필요가 없습니다.
그러나 아직 백스톱(Backstop) 및 자체 충돌(Self-Collision) 설정과 같은 몇 가지 기능을 자세히 다루지 않았습니다. 이에 대해 더 알고 싶다면 다른 가이드를 계속 참고하세요.
여기에서는 캐릭터 의상을 시뮬레이션할 때 필수적인 인체와의 충돌 감지에 대해 설명합니다. 충돌 감지 설정은 BoneCloth와 MeshCloth에서 공통적으로 사용됩니다.
충돌 감지 유형
MagicaCloth에는 네 가지 충돌 제어 방식이 존재합니다.
충돌 감지 유형 설명
Collider 충돌 감지
구체(Sphere), 캡슐(Capsule), 평면(Plane) 등의 콜라이더와 충돌을 감지하는 방식. 가장 일반적으로 사용되며, 이 페이지에서 설명됩니다.
Backstop
정점의 법선 방향으로 들어갈 수 있는 거리와 반경을 설정하여, 옷이 인체 내부로 파고드는 것을 방지하는 방식.
Self-Collision
자체 충돌 감지. 옷이 자체적으로 접히거나 엉키는 것을 방지함.
Mutual Collision
상호 충돌 감지. 다른 Cloth 오브젝트와 충돌하여 서로 겹치지 않도록 방지함.
이 페이지에서는 Collider 충돌 감지만 설명하며, 다른 충돌 감지 방식에 대한 내용은 전용 가이드 페이지를 참고하세요.
Collider 충돌 감지 원리
Collider 충돌 감지는 매우 간단한 원리로 작동합니다. 정점(Vertex)이 구(Sphere), 캡슐(Capsule) 등의 콜라이더 형태에 침범하지 않도록 밀어내는 방식입니다.
이러한 콜라이더를 인체 형태에 맞게 배치하면, 옷이 캐릭터 몸 안으로 파고드는 현상을 방지할 수 있습니다.
콜라이더 유형
콜라이더는 여러 가지 형태가 있습니다.
Sphere Collider
구형 콜라이더.
Capsule Collider
캡슐형 콜라이더. 시작점과 끝점의 반경 및 길이를 변경할 수 있습니다.
Plane Collider
평면 콜라이더. 크기를 설정할 수 없으며, 무한 평면으로 처리됩니다.
충돌 모드
콜라이더에 대한 프록시 메시의 판정 방식을 선택할 수 있습니다.
Vertex Sphere Mode
프록시 메시의 정점을 구로 간주하여 콜라이더와 충돌 감지를 수행합니다. 구의 크기는 조정할 수 있습니다.
처리 부하가 적어 신경 쓰지 않고 사용할 수 있다는 장점이 있습니다.
그러나 아래와 같이 콜라이더가 작을 경우, 구 사이로 통과하는 문제가 발생할 수 있으므로 주의해야 합니다.
Edge Mode
프록시 메시의 엣지와 콜라이더 간의 충돌 감지를 수행합니다. 엣지의 두께를 조정할 수 있습니다.
엣지 모드는 구형 모드의 통과 문제를 방지할 수 있다는 큰 장점이 있습니다.
그러나 구형 모드보다 처리 부하가 높으므로 주의해서 사용해야 합니다. 정점 구형 모드에서 문제가 발생하는 경우에만 고려하는 것이 좋습니다.
콜라이더 배치
KAGURA의 치마를 예제로 사용하여 콜라이더를 설정해 보겠습니다. 치마가 이미 MeshCloth를 사용하여 설정되었다고 가정합니다.
치마의 경우 다리 콜라이더와 허리 콜라이더가 필요합니다. 먼저, 왼쪽 다리 본을 선택합니다. KAGURA에서는 [CH_Thigh_L]이 됩니다. 그런 다음 마우스 오른쪽 메뉴를 열고 Create Other/Magica Cloth2/Magica Capsule Collider를 선택합니다.
캡슐 콜라이더 컴포넌트가 다음과 같이 추가되었습니다.
이제 기즈모가 씬 뷰에 나타납니다.
배치에서 중요한 점은 콜라이더의 스케일이 XYZ 축에서 균일해야 한다는 것입니다. 이것은 로컬 스케일이 아니라 부모를 포함한 글로벌 스케일입니다. 스케일이 균일하지 않으면 충돌 감지가 올바르게 작동하지 않으므로 주의하세요.
캡슐 콜라이더 인스펙터를 사용하여 위치와 크기를 조정합니다.
캡슐 콜라이더는 방향, 길이, 시작 반경 및 끝 반경을 개별적으로 설정할 수 있습니다. 각 매개변수를 변경해 보세요. 씬 뷰 기즈모가 이에 따라 변형되는 것을 확인할 수 있습니다.
캡슐 콜라이더의 시작점과 끝점을 다른 크기로 설정하려면, 다음과 같이 인스펙터에서 [S] 버튼을 누릅니다.
이렇게 하면 시작 반경과 끝 반경을 독립적으로 설정할 수 있습니다.
또한, ReverseDirection을 사용하여 방향을 반전하거나 AlignedOnCenter를 끄면 시작점을 중심에 정렬할 수 있습니다.
이러한 속성을 사용하여 콜라이더를 다리에 맞게 조정합니다. 조정할 때 씬 뷰를 와이어프레임 모드로 변경하면 더 잘 보입니다.
또한, 센터 속성을 변경하는 대신 콜라이더의 GameObject를 이동하는 것이 위치 조정에 더 편리한 경우가 많습니다. 콜라이더를 이동하여 다음과 같은 위치로 조정합니다.
같은 방법으로 힙 부분에 SphereCollider를 추가합니다.
힙 본 [CH_Hips]를 선택하고 마우스 오른쪽 메뉴에서 SphereCollider를 선택합니다. Sphere Collider가 추가됩니다.
Sphere Collider의 속성은 반지름만 있습니다.
캡슐 콜라이더와 마찬가지로 반지름과 위치를 조정하여 왼쪽 힙 라인에 맞춥니다.
오른쪽도 동일하게 설정하고, 마지막으로 네 개의 콜라이더를 이미지와 같이 배치합니다.
콜라이더 등록
마지막으로, 생성한 콜라이더를 클로스 컴포넌트에 등록하겠습니다. 등록하지 않으면 콜라이더가 작동하지 않으므로 주의하세요. 콜라이더 등록은 Collider Collision 패널에서 수행됩니다.
생성한 콜라이더를 Collider List에 등록합니다.
이제 콜라이더 설정이 완료되었습니다!
정점 반경 및 마찰 설정
마지막으로, 충돌 모드, 두께(Radius), 그리고 마찰(Friction)을 설정합니다.
두께는 곡선을 사용하여 프록시 메시 정점의 깊이에 따라 반경을 변경할 수도 있습니다. Radius 슬라이더 바를 조정해 보세요. 씬 뷰에서 설정한 반경이 실시간으로 반영됩니다. 씬 뷰를 보면서 배치한 콜라이더에 적절한 정점 구 크기를 조정하세요. 이번에는 정점 구 크기를 0.02로 균일하게 설정하였습니다.
마찰(Friction)은 콜라이더와 정점이 접촉했을 때 미끄러지는 정도를 조정합니다. 값을 높이면 덜 미끄러지게 됩니다.
동작 확인
이제 모든 설정이 완료되었습니다! 실제로 실행하여 움직임을 확인해 보세요. 설정한 콜라이더와 프록시 메시의 정점이 충돌하여 관통을 방지한다면 성공입니다!
다음 단계는?
지금까지 BoneCloth와 MeshCloth의 사용 방법 및 충돌 감지 설정 방법을 설명하였습니다. 그러나 이상적인 움직임을 구현하려면 많은 매개변수를 조정해야 합니다. 다음으로, 각 매개변수의 설정과 작동 방식에 대해 설명하겠습니다.
여기에서는 BoneSpring을 사용하는 방법을 설명합니다. 이 가이드는 BoneCloth 사용 방법에 대한 내용을 이어서 다룹니다. 따라서 이미 설명된 항목은 생략하므로, 이 가이드를 읽기 전에 BoneCloth 사용 방법을 먼저 읽어 주세요.
BoneSpring이란?
BoneSpring은 Transform에 대한 스프링 흔들림 기능을 제공합니다. 이 기능은 캐릭터의 가슴 흔들림과 같은 효과를 구현하는 데 유용합니다. 또한 기능이 단순하여 처리 부하가 낮다는 장점이 있습니다.
BoneSpring 소개
이제 BoneSpring을 소개합니다. 여기에서는 샘플 UnityChanKAGURA의 가슴 흔들림을 예로 들어 설정 방법을 설명하겠습니다.
먼저 BoneCloth와 마찬가지로 계층 구조(Hierarchy)에서 마우스 오른쪽 버튼을 클릭하여 MagicaCloth 컴포넌트를 추가합니다.
그런 다음 ClothType을 [Bone Spring]으로 변경합니다. 이제 BoneSpring을 사용할 준비가 완료되었습니다.
Transform 등록
먼저, 시뮬레이션할 Transform을 등록해야 합니다. KAGURA에서는 가슴 Transform에 대해 좌우 각각 시작점과 끝점이 한 쌍을 이루며, 총 4개의 Transform이 존재합니다.
BoneSpring에서는 계층 구조의 시작점이 되는 Transform을 등록해야 합니다. KAGURA에서는 [DB_Bust_01_L]과 [DB_Bust_01_R]의 두 개의 Transform이 있습니다. 이 두 Transform을 RootBones에 추가합니다.
시작 Transform을 등록하면 해당 Transform의 모든 자식 Transform이 자동으로 함께 등록됩니다. 이때, 아래 그림과 같이 Scene 뷰에서 기즈모가 시각화됩니다.
BoneCloth와 마찬가지로, RootBones에 등록된 Transform은 자동으로 빨간색 고정 속성이 할당되며, 다른 Transform은 자동으로 흰색 이동 속성이 할당됩니다.
이 설정은 버텍스 페인팅을 통해 변경할 수도 있습니다. 버텍스 페인팅은 초록색 펜 아이콘을 통해 사용할 수 있습니다.
스프링과 추
매개변수를 설정하기 전에 중요한 BoneSpring 개념을 설명하겠습니다. 그것은 스프링과 추의 관계입니다.
먼저, 가장 중요한 점은 스프링 효과가 고정 속성이 있는 정점에만 적용된다는 것입니다.즉, 기즈모에서 빨간색으로 표시된 Transform에만 영향을 미칩니다.
BoneCloth 및 MeshCloth의 고정 정점은 원점에서 이동하지 않지만, BoneSpring에서는 흔들리도록 설정할 수 있습니다.
또한, 스프링 효과는 고정 정점에서 연결된 흰색 기즈모의 이동 정점에는 작용하지 않습니다. 대신 이동 정점은 추 역할을 합니다. 이동 정점이 움직이면서 고정 정점을 회전시키는 방식으로 작동하며, 이는 아래 동영상과 같은 동작을 합니다.
반대로, 만약 추 역할을 하는 이동 정점이 없다면 고정 정점은 회전하지 않습니다.
따라서 변동을 위한 이동 정점이 있을 때 더 자연스러운 움직임을 구현할 수 있습니다.
샘플 UnityChanKAGURA에서는 스프링을 위한 두 개의 고정 속성 정점과, 그로부터 확장된 두 개의 이동 속성 정점이 설정되어 있습니다.
프리셋
그다음, 매개변수를 설정하고 움직임을 조정해야 합니다. 그러나 이 과정은 익숙해지는 데 시간이 걸리므로, 우선 프리셋을 사용하여 간단한 설정을 해보겠습니다. 프리셋은 매개변수 설정이 포함된 파일입니다. MagicaCloth에는 BoneSpring을 위한 세 가지 프리셋이 제공됩니다.
SoftSpring
MiddleSpring
HardSpring
프리셋을 사용하면 원하는 움직임을 쉽게 설정할 수 있습니다. 프리셋은 [Preset] 드롭다운 메뉴에서 간단히 추가할 수 있습니다.
먼저 [MiddleSpring]을 설정해 보겠습니다. 이제 중간 강도의 스프링 매개변수가 확장됩니다.
동작 확인
설정을 완료한 후 실행하여 동작을 확인해 보세요! 실행 중에 캐릭터를 움직였을 때 가슴이 흔들린다면 성공입니다! 이제 실제로 조작하면서 매개변수를 조정하여 이상적인 움직임에 가깝게 만들어 보겠습니다.
매개변수 설정
이상적인 움직임을 구현하려면 매개변수를 이해하는 것이 필수적입니다. 여기에서는 각 매개변수가 BoneSpring에 어떻게 영향을 미치는지 설명하겠습니다.
스프링
고정 정점에서 스프링의 움직임을 제어합니다.
Spring Power: 스프링의 강도를 설정합니다.
Limit Distance: 원점으로부터 이동할 수 있는 최대 범위를 설정합니다.
Normal Limit Ratio: 정점의 법선 방향으로 이동 범위를 추가로 제한할 수 있습니다. 이를 활용하면 움직임 범위를 타원형으로 만들 수 있습니다.
법선 방향 조정: 특정 매개변수를 사용하여 정점의 법선 방향을 변경할 수 있습니다.
Spring Noise: 여러 스프링을 노이즈를 이용해 비동기화할 수 있습니다.
스프링 매개변수에 대한 자세한 내용은 Spring 항목을 참고하세요.
추(Pendulum)
이동 정점의 진자(추) 동작은 다음 두 패널을 통해 제어됩니다.
Angle Restoration: 추의 복원력을 설정합니다.
Angle Limit: 추의 각도 제한을 설정합니다.
이 두 패널의 동작 방식은 이전의 BoneCloth/MeshCloth와 동일합니다. 자세한 내용은 Angle Restoration 및 Angle Limit 항목을 참고하세요.
저항
Damping 값을 증가시키면 정점에서의 저항이 증가하여 움직임을 제어하는 브레이크 역할을 합니다. 이 매개변수를 증가시키면 스프링과 추의 진동이 빠르게 수렴하도록 조정할 수 있습니다.
관성
관성 패널은 BoneSpring에서도 중요한 역할을 합니다. 캐릭터의 움직임으로 인해 과도한 흔들림이 발생하는 경우, Inertia 매개변수를 낮춰서 움직임의 영향을 줄이는 것이 중요합니다. 자세한 내용은 Inertia 항목을 참고하세요.
충돌 감지
BoneCloth/MeshCloth와 달리, BoneSpring에서는 기본적으로 정점이 충돌 감지의 영향을 받지 않습니다. 정점에 충돌 감지를 추가하려면, 대상 Transform을 Collision Bones에 개별적으로 등록해야 합니다. 등록할 Transform은 RootBones 아래의 계층 구조에 존재해야 합니다.
등록이 완료되면 기즈모가 채워진 구형으로 변경되며, 콜라이더를 이용한 충돌 감지가 수행됩니다.
또한, BoneSpring의 충돌 감지는 특수한 방식으로 작동하며, 정점이 원점에서 이동할 수 있는 거리를 제한합니다. 이 거리는 Limit Distance를 통해 조정할 수 있습니다. 콜라이더에 대한 반발력은 거리의 변화에 따라 자동으로 감소합니다.
바람
BoneSpring은 바람의 영향을 받습니다. 바람의 영향을 줄이고 싶다면 Influence 값을 낮추세요. 자세한 내용은 Wind 항목을 참고하세요.
회전 제어
각 고정 정점과 이동 정점 Transform이 최종적으로 회전하는 방향을 제어할 수 있습니다. 이 두 가지 요소는 BoneSpring에서 매우 중요한 역할을 합니다. 자세한 내용은 RotationControl 항목을 참고하세요.
제한 사항
BoneSpring은 BoneCloth/MeshCloth와 거의 동일한 기능을 제공하지만, 스프링 동작을 제외하고 몇 가지 기능이 제한됩니다. 또한 일부 매개변수는 숨겨져 있으며 자동으로 설정됩니다.
Transform 연결 방식이 Line 모드로 고정됨
중력이 자동으로 비활성화됨
사용자 지정 스키닝 기능을 사용할 수 없음
Backstop 기능을 사용할 수 없음
자체 충돌(Self-collision) 기능을 사용할 수 없음
콜라이더 충돌이 Point 모드로 고정됨
Transform에 대한 충돌 감지는 기본적으로 비활성화됨
충돌 감지를 수행할 Transform은 개별적으로 등록해야 함
형태 복원(Shape Restoration) 매개변수는 숨겨져 있으며 BoneSpring에 대해 자동으로 설정됨
이 가이드는 BoneCloth 사용법의 연속이므로, 이미 설명된 항목은 생략됩니다. 따라서 이 가이드를 읽기 전에 BoneCloth 사용법을 먼저 확인하세요.
MeshCloth란?
MeshCloth는 메시의 버텍스를 기반으로 옷감 시뮬레이션을 수행하는 방식입니다. BoneCloth보다 더 현실적인 흔들림을 표현할 수 있지만, 처리 부하는 더 높습니다.
메시 버텍스를 직접 조작하여 흔들림을 표현
메시에 본(Bone)이 없어도 사용 가능
대량 사용 시 성능에 주의 필요 (처리 부하가 높음)
모델 임포터 설정
MeshCloth를 사용하기 전에 대상 모델의 임포트 설정을 확인해야 합니다. MeshCloth는 버텍스를 조작하기 위해 Read/Write 속성이 필요합니다.
기본적으로 이 속성은 OFF이므로, Project 뷰에서 대상 모델을 선택한 후 Model Importer의 Read/Write 체크를 ON으로 설정하세요.
또한 [Rig] 탭의 "Optimize Game Objects" 옵션을 OFF로 설정해야 합니다.
기타 조건
스킨 메시에 사용할 경우, 각 버텍스당 최대 가중치(Weight) 수는 4 이하여야 합니다.
MeshCloth 추가하기
UnityChanKAGURA 샘플의 치마(Skirt) 를 예제로 설정 방법을 설명합니다.
BoneCloth와 동일하게 Hierarchy의 우클릭 메뉴에서 MagicaCloth 컴포넌트를 추가합니다.
가능한 한 캐릭터 루트 바로 아래에 배치합니다.
일반적으로 Animator 컴포넌트의 자식 오브젝트로 설정됩니다.
Cloth Type을 [Mesh Cloth]로 변경합니다.
이렇게 하면 MeshCloth 전용 Inspector로 전환됩니다.
MeshCloth의 Inspector는 BoneCloth와 Main 설정에서만 차이가 있으며, 그 외의 부분은 BoneCloth와 동일합니다.
렌더 메시와 프록시 메시
MeshCloth에서 중요한 개념은 프록시 메시입니다. MeshCloth는 렌더 메시, 즉 화면에 표시되는 메시를 그대로 시뮬레이션에 사용하지 않습니다. 이는 주로 다음과 같은 이유 때문입니다.
렌더 메시를 그대로 사용하면 버텍스 개수가 너무 많아 시뮬레이션 부하가 커집니다. (심플해 보이는 메시도 10,000개 이상의 버텍스를 가질 수 있습니다.)
삼각형 연결 구조는 시뮬레이션에 적합하지 않습니다.
표현의 편의성을 위해 메시가 분리된 경우가 많습니다. (예: 치마의 앞면과 뒷면을 다른 머티리얼로 구분하기 위해 메시를 분리하는 경우 등)
프록시 메시는 이러한 문제를 해결하는 역할을 합니다. 프록시 메시는 렌더 메시를 기반으로 버텍스 수를 줄여 생성된 가상의 메시입니다. 이 프록시 메시는 런타임에서만 메모리에 존재합니다.
아래는 원본 렌더 메시(위)와 단순화된 프록시 메시(아래)의 관계를 나타냅니다.
아래쪽의 프록시 메시가 더 적은 버텍스를 가지고 있으며, 단순한 형태를 하고 있음을 확인할 수 있습니다. MeshCloth는 이 프록시 메시에서 모든 시뮬레이션을 수행하며, 그 결과를 원본 렌더 메시에 반영하여 화면에 출력합니다. 이 개념은 매우 중요하므로 반드시 숙지하세요.
렌더 메시 등록
프록시 메시의 기반이 될 렌더 메시를 등록해 보겠습니다. SkinnedMeshRenderer와 MeshRenderer를 등록할 수 있습니다. KAGURA의 치마에는 SkinnedMeshRenderer가 할당되어 있습니다.
이 SkinnedMeshRenderer를 MeshCloth의 Source Renderers 목록에 등록합니다.
이제 씬 뷰에 프록시 메시가 표시됩니다.
이 프록시 메시는 아직 간소화되지 않은 상태이므로 렌더 메시와 동일한 구조를 가지고 있습니다.
여러 개의 렌더 메시를 등록할 수도 있으며, 이 경우 모든 렌더 메시가 하나의 프록시 메시로 결합됩니다.
Reduction
렌더 메시를 등록한 직후의 프록시 메시는 렌더 메시와 동일한 구조를 가지고 있습니다. 이 상태로도 시뮬레이션을 시작할 수 있지만, 앞서 설명한 것처럼 더 단순한 프록시 메시는 성능과 안정적인 시뮬레이션 측면에서 유리합니다. Reduction 기능은 이 프록시 메시를 간소화하는 역할을 합니다.
Reduction 패널
프록시 메시의 간소화는 두 개의 슬라이더를 조정하여 수행됩니다.
Simple Distance: 단순히 가까운 버텍스를 병합합니다. 메시의 구조는 고려하지 않습니다.
Shape Distance: 메시의 형상을 기반으로 가까운 버텍스를 병합합니다. 서로 연결되지 않은 표면의 버텍스는 근접해 있더라도 병합되지 않습니다.
이 기준은 메시의 형태, 길이, 원하는 시뮬레이션 방식에 따라 달라지므로 일반적인 기준을 정하기 어렵습니다. 다음 사항을 참고하세요.
프록시 메시가 단순할수록 성능이 향상됩니다.
렌더 메시에 세밀한 돌출부가 남아 있지 않을 정도로 간소화하는 것이 좋습니다.
너무 과도하게 간소화하면 충돌 감지 기능이 약해질 수 있습니다. 렌더 메시와 프록시 메시의 차이가 커질 경우 화면 표시가 불안정해질 수 있습니다.
완성된 프록시 메시
이번 예제에서는 프록시 메시의 표면이 거의 평평한 상태가 될 정도로 간소화해 보았습니다.
Vertex paint
프록시 메시를 간소화한 후에는 각 버텍스의 동작 속성을 결정해야 합니다. 이 작업은 Vertex Paint를 통해 수행됩니다. MeshCloth에서는 BoneCloth와 달리 Vertex Painting이 매우 중요합니다. 그 이유는 MeshCloth가 모든 버텍스 속성을 기본적으로 Invalid(무효) 로 초기화하기 때문입니다. 따라서 MeshCloth를 사용할 때는 반드시 버텍스 페인팅을 통해 각 버텍스의 속성을 결정해야 합니다.
고정된 속성과 움직이는 속성
여기서 중요한 작업은 움직이지 않는 버텍스와 움직이는 버텍스를 명확히 구분하는 것입니다. 예를 들어, 치마의 경우 허리 근처의 버텍스는 움직이지 않아야 하며, 나머지는 자유롭게 움직일 수 있어야 합니다. 움직이지 않는 버텍스를 Fixed 속성, 움직이는 버텍스를 Move 속성이라고 합니다.
Vertex Paint 시작
Vertex Paint는 아래의 펜 모양 버튼을 클릭하여 실행할 수 있습니다. 페인트 모드를 실행하면 씬 뷰가 페인트 모드로 전환됩니다.
페인트 패널
페인트 속성은 Paint 패널에서 설정할 수 있습니다.
Point Size
표시되는 버텍스 구체 크기
Brush Size
페인트 브러시 크기
Shape
활성화하면 프록시 메시의 구조를 기즈모로 표시
Culling
활성화하면 씬 카메라 방향과 반대쪽의 버텍스 구체를 숨김
Z Test
활성화하면 버텍스 구체를 표시하고 깊이 테스트 결과를 확인 가능
Through
활성화하면 깊이를 무시하고 커서 내부의 모든 버텍스를 채울 수 있음 (브러시 크기 변경됨)
Paint Attribute
페인트할 버텍스 속성 선택
버텍스 속성은 세 가지로 구분됩니다.
Move
초록
자유롭게 움직이는 버텍스
Fixed
빨강
움직이지 않는 버텍스
Invalid
회색
시뮬레이션에서 제외되는 버텍스 예를 들어, 허리 위쪽이 시뮬레이션과 관련이 없는 드레스라면, 해당 부분을Invalid 속성으로 설정하면 성능이 향상됩니다.
페인트 완료
이제 실제로 페인팅을 해보겠습니다. 페인트할 속성을 선택한 후, 마우스 커서를 프록시 메시 위에 올리고 클릭하거나 드래그하여 페인트합니다.
이번에는 치마를 아래와 같이 페인트했습니다. 페인팅이 끝나면 Exit 버튼을 눌러 페인트 모드를 종료합니다.
이로써 프록시 메시의 기본 설정이 완료되었습니다!
Parameter settings
마지막으로, 움직임을 조절하는 파라미터(Parameters) 를 설정합니다. BoneCloth에서와 마찬가지로, 여기서도 프리셋(Preset)을 사용하여 간편하게 설정할 수 있습니다.
다음과 같이 Preset 메뉴에서 [skirt] 프리셋을 선택합니다.
이제 skirt 프리셋의 설정이 자동으로 적용되며, 관련 파라미터가 확장됩니다.
Operation check
이제 실행해 봅시다! Unity 에디터에서 Play 버튼을 눌러 실행하고, 캐릭터를 움직여서 치마가 흔들리는지 확인하세요. 치마가 자연스럽게 흔들린다면 설정이 성공적으로 완료된 것입니다!
What next?
이번에는 MeshCloth의 최소한의 설정만 적용했습니다. 그러나 애니메이션을 보면 아직 인체와의 충돌 감지가 설정되지 않아 치마가 다리를 통과하는 문제가 발생합니다. 다음 챕터에서는 충돌 감지(Collision Detection) 설정 방법을 자세히 설명합니다.
샘플은 렌더 파이프라인별로 구분되어 있으므로, 현재 사용 중인 렌더 파이프라인(CoreRP/URP/HDRP)의 폴더에서 선택하세요. 각 렌더 파이프라인별로 씬이 나뉘어 있는 이유는 렌더 셰이더를 전환하기 위함이며, MagicaCloth의 동작과는 무관합니다.
씬을 실행한 후 캐릭터의 소매, 머리카락, 치마 등이 물리적으로 흔들린다면 설치가 완료된 것입니다.
샘플 폴더 삭제 가능
에셋에 포함된 "Example (Can be deleted)" 폴더는 삭제할 수 있습니다. 샘플이 필요하지 않다면 해당 폴더를 삭제해도 무방합니다.
업데이트 방법
MagicaCloth는 정기적으로 업데이트됩니다. 대부분의 경우, 최신 버전을 덮어쓰기하여 가져오면 정상적으로 동작합니다. 그러나 파일 구조 등의 변경이 있는 경우, 기존 파일과 새로운 파일이 중복되어 오류가 발생할 수 있습니다. 따라서 가능하면 다음 단계를 따라 깨끗한 설치(Clean Install) 를 진행하는 것이 좋습니다.
프로젝트를 완전히 백업합니다.
Unity 에디터에서 MagicaCloth2 폴더를 삭제합니다.
Package Manager에서 최신 MagicaCloth2를 가져옵니다.
오류 발생 시 해결 방법
위의 단계를 따라 가져오거나 업데이트했음에도 오류가 발생하는 경우, 필요한 패키지가 설치되지 않았거나 버전이 오래되었을 수 있습니다. 먼저, 메뉴에서 Window > Package Manager를 열고 In Project를 선택하여 설치된 패키지 목록을 확인하세요.
MagicaCloth를 실행하려면 Burst 1.8.1 이상 및 Collections 1.4.0 이상이 필요합니다. 패키지 목록에 Burst와 Collections가 있는지 확인하고, 버전이 올바른지 점검하세요.
만약 패키지가 없거나 오래된 버전이라면, 다음 단계에 따라 수동으로 설치해야 합니다.
Package Manager 상단 왼쪽의 + 버튼을 누르고 [Add package from git URL..]을 선택합니다.
Burst를 설치하려면 "com.unity.burst" 를 입력하고 실행합니다.
Collections를 설치하려면 "com.unity.collections" 를 입력하고 실행합니다.
이를 통해 최신 버전의 Burst 및 Collections가 설치됩니다.
오류가 계속될 경우, 지원팀에 문의하세요. 이때, 콘솔에 처음 나타나는 오류 메시지를 상세히 포함해 주시면 문제 해결에 도움이 됩니다.
제거 방법
MagicaCloth가 더 이상 필요하지 않은 경우, 다음 단계에 따라 제거할 수 있습니다.
MagicaCloth2 폴더를 삭제합니다.
Package Manager에서 Burst를 제거합니다.
Package Manager에서 Collections를 제거합니다.
Package Manager에서 Mathematics를 제거합니다.
패키지를 삭제할 때는 프로젝트 내 다른 에셋에서 해당 패키지를 사용하고 있을 가능성이 있으므로 주의하세요.
버전 확인 방법
현재 사용 중인 MagicaCloth 버전은 Tools > MagicaCloth2 > About… 메뉴에서 확인할 수 있습니다.
Define Symbol
MagicaCloth를 설치하면 MAGICACLOTH2 정의가 프로젝트에 자동으로 추가됩니다. (버전 2.3.1 이상)
Magica Cloth는 Unity DOTS(Data-Oriented Technology Stack)를 기반으로 하는 빠른 옷감 시뮬레이션입니다. Transform과 Mesh 모두에서 사용할 수 있으며, BoneCloth는 Transform을 제어하고 MeshCloth는 메시의 버텍스를 제어합니다. 이전 버전인 MagicaCloth의 후속 버전이며, 현재 Unity Asset Store에서 이용할 수 있습니다.
빠른 옷감 시뮬레이션을 위한 Unity DOTS(Data-Oriented Technology Stack) 지원
WebGL 및 VisionOS를 제외한 모든 플랫폼에서 사용 가능
Transform과 Mesh 모두에서 사용 가능
2D와 유사한 움직임을 유지하면서도 물리적으로 현실적인 동작을 구현하는 2.5D 동작 지원
CoreRP/URP/HDRP 모든 렌더 파이프라인에서 사용 가능
전용 셰이더 불필요
빠른 설정을 위한 쉬운 직관적인 인터페이스
느려지거나 정지하는 등의 시간 조작 기능 지원
포인트/엣지 기반 충돌 지원
자가 충돌 및 상호 충돌 지원
관통 방지 기능(노멀 라인에 의한 백스톱)
노멀 조정 기능
런타임 빌드 완전 지원
균일한 스케일링 지원
XYZ 축 중 한 축만 음수 스케일 지원
전체 소스 코드 포함
제한 사항
Burst 컴파일이 WebGL에서 작동하지 않기 때문에 지원되지 않음
일부 PolySpatial 패키지는 Collections 2.x를 지원하지 않으므로 VisionOS에서 작동하지 않음
BlendShape로 변형된 버텍스에는 MeshCloth를 사용할 수 없음
Ver1에서 개선된 사항
사전 빌드 제거( Create 버튼 제거)
PhysicsManager 제거
RenderDeformer/VirtualDeformer 제거
모든 컴포넌트를 하나로 통합
대폭 간소화된 파라미터
버텍스 페인팅 기능 크게 향상
텍스처를 이용한 버텍스 페인팅 지정 가능
프리팹에 서브 에셋을 저장하지 않음
필수 Unity 및 패키지
Unity 2021.3.16(LTS) 이상
Burst 1.8.1 이상
Collections 1.4.0 이상
Burst 및 Collections 패키지는 자동으로 설치됨
이용 약관 및 라이선스
MagicaCloth2는 Unity Asset Store 이용 약관을 준수합니다. 간략한 요약은 다음과 같습니다.
구매 후, 무료 또는 유료 프로젝트 여부와 관계없이 자유롭게 사용할 수 있습니다.
Unity Asset Store에서의 결제 외에 추가 비용은 없습니다.
이 에셋은 확장 에셋 라이선스에 해당합니다. 실제로 사용할 개발자마다 개별 라이선스가 필요합니다. 예를 들어, 총 10명의 직원 중 2명이 MagicaCloth를 설정하는 경우, 2개의 라이선스가 필요합니다. 라이선스에 대한 자세한 내용은 Unity 지원 페이지를 참조하세요.
다음은 첫 번째 컴포넌트를 기반으로 자동 아이콘을 적용하는 규칙을 구현한 예제 스크립트입니다.
//AutoIcons.cs
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
public class AutoIcons
{
[VHierarchy.Rule]
static void AutoIconsRule(VHierarchy.ObjectInfo objectInfo)
{
var components = objectInfo.gameObject.GetComponents<Component>();
if (components.Length == 1) return; // return if only has transform component
var firstComponentIcon = VHierarchy.VHierarchy.GetComponentIcon(components[1]);
objectInfo.icon = firstComponentIcon.name;
}
}
#endif