이 튜터리얼은 XSI 3.0의 cloth(천 재질) 시뮬레이션을 다루고 있습니다.

시작하기에 앞서
가끔 SoftImage|XSI 의 cloth 시뮬레이션은 좋지 못한 평을 듣기도 하지만, 이 튜터리얼을 통해 사실적인 cloth
시뮬레이션이 가능하다는 것을 알게 될 것이다.
커튼, 테이블 덮개부터 옷감과 같은 고난이도의 것들을 제작해보면 다양한 cloth 타입에 대해 다루도록 하겠다.
시작
우선 기본 grid를 생성하는데 이것은 중력에 의해 아래로 힘을 받고 별도로 생성한 sphere와는 상호반응을 하도록 설정할 것이다.
우선 천(cloth) 기능을 할 오브젝트가 필요한데, 이것은 Get->Primitive->Polygon Mesh->Grid 명령을 이용해 기본
grid로 만들 수 있다.
Grid가 선택되어 있는 상태에서, 시뮬레이션 메뉴(키보드의 숫자 키 4를 누름)의 Create->Cloth->From Selection를
선택한다.
다이얼로그 박스가 뜨지만 나중에 다시 언급할 것이므로 현재는 무시한다. 다음으로 여러분은 cloth를 움직이고 싶어질 것이다. 천은 스스로
움직임을 가질 수 없으므로(현실 세계에서처럼), 바람, 중력, 충돌 등과 같이 외부의 힘이 적용되어야 한다.
먼저 중력을 적용하는 것부터 시작해보자. Get->Force->Gravity 명령을 클릭한다. 천 역할을 하는 grid를 선택하고
Modify->Environment->Apply Force를 선택한 후, 화면에 있는 중력 아이콘을 클릭한다(선택을 끝내려면 마우스 우측버튼
클릭). 이제 play를 해본다면, 중력에 의해 천이 아래로 떨어지는 것을 보게 될 것이다.
다음으로 충돌(collisions)에 대해 알아보자. Get->Primitive->Polygon Mesh->Sphere를 하여 스피어를 하나
꺼낸다. 천을 선택한 상태에서 Modify->Environment->Set Obstacle 메뉴를 선택하고 앞서 생성한 sphere를 클릭한다.
이제 천은 sphere와 충돌하도록 설정되었다.
새로운 다이얼로그 창이 떴을 것이다.

이 창은 천과 sphere 간의 충돌에 관련한 파라미터를 담고 있다. 천을 적당하게 조정하기에 앞서 우선 애니메이션을 play해보고 천과
sphere의 충돌이 어떻게 진행되는지 눈으로 확인한다.
기본으로 설정된 100 프레임보다 좀 더 길게 시뮬레이션 해보는 것이 도움이 될 것이다. 프레임을 늘리려면, 천을 선택하고 우측 메뉴의
Select를 누르고 ClothOp을 클릭한다. 이제 cloth 설정에 관련된 다이얼로그 창이 다시 뜰 것이다.

Range라고 쓰인 메뉴 하위에 end frame 수치를 조정하여 cloth가 시뮬레이션 되는 시간을 늘린다.

이제 애니메이션을 다시 실행해보면 천이 sphere 위로 내려앉으면서 모양이 sphere처럼 둥그스름하게 변하는 것을 확인할 수 있다.
하지만, sphere가 천 위로 뚫고 나오는 것이 보일 것이다.

이 문제를 해결하는 몇 가지 방식이 있다. 하나는 grid나 sphere의 폴리곤 수를 늘림으로써 시뮬레이션 과정에서 보다 세밀한 계산이
이루어지도록 하는 것이다.
다른 방법은 iterations per frame(프레임당 반복)를 증가시키는 것이다. 이 수치는 얼마의 프레임 마다 충돌 체크를 할지를
결정한다.
그래서 만약 천이 sphere를 뚫고 들어가려 하면, 자체적으로 재계산하여 천을 sphere 위로 재위치 시킨다. 이 테크닉은 특정 상황에서는
매우 효과적이지만, 계산 시간을 길게 한다. 빠른 결과를 얻어내기 위해서, Push Length 파라미터를 이용할 수 있다. 이 조작은 천과
sphere 표면 간에 틈을 설정한다.
예를 들어, 천이 sphere를 향할 때, Push Length를 0.2로 증가시킴으로 천은 sphere의 0.2 unit 만큼의 위에서
충돌한다. 이것은 천이 shpere를 뚫고 들어가는 것을 방지하는 결과를 가져온다.

앞서 언급했던 것처럼, 여러분은 cloth의 폴리곤을 증가시킬 수 있는데, 이것은 천이 애니메이션 되는 것을 부드럽게 하여 보다 사실적으로
보이게 한다.
여기를 클릭하면 천이 두 개의 sphere 위로 떨어지는 동영상을 볼 수 있다.
필자는 Friction(마찰) 설정을 조정하여 천이 너무 빠르게 미끄러지는 것을 방지했다. 하지만 여러분이 실크 같은 재질을 시뮬레이션할 때는
마찰력을 낮추는 것이 좋다.
다음으로 커튼을 생성해보도록 하자. 이 과정에서 wind(중력효과와 유사한 방법으로 적용시킴)와 nails(고정)라는 새로운 기능을 소개할 것이다.

창 역할을 하는 구멍이 뚫린 벽과 커튼으로 쓰일 grid를 생성하였다. 커튼 상단을 벽에 고정시키는 방법에는 두 가지가 있다. 하나는
Nail이라 불리는 기능을 사용한 것이고 다른 하나는 clusters를 이용하는 방법이다.
먼저 Nail 테크닉을 써보도록 하자. 이 방법도 기본적으로는 cluster를 이용한 방법과 동일하다. 두 기술은 개념적으로 일치한다고 볼 수
있다.
우선은 커튼 역할을 하는 grid를 선택한 후 Create->Cloth->From Selection 적용한다. 이제 커튼을 벽에 고정시킬 텐데,
tag/point 모드(단축키 ‘T’)로 전환하여 벽에 고정되어질 부분인 상단의 가로 포인트를 선택한다. Create->Cloth->Local
Cloth Cluster를 적용하면 선택한 가로 point에 독립된 cloth 파라미터가 적용되고, 여러분은 Nail 파라미터를 설정할 수
있다.

이것은 상단의 가로줄이 천의 다른 부분과는 달리 외부의 힘들에 영향을 받지 않도록 된다는 것을 의미한다. 상단 가로줄은 자체적으로 독립된
cloth 시뮬레이션이 적용되었기 때문이다.
Nail 기능을 사용하지 않고 동일한 효과를 내려면, 상단 가로줄을 제외한 천의 모든 point를 선택하고 cloth 시뮬레이션을 적용시킨다.
이렇게 해줌으로서 커튼은 천과 같은 움직임을 갖게 된다. 하지만 가장 상단 가로줄은 시뮬레이션이 적용되지 않았기 때문에 고정된 채로 움직이지
않는다.
커튼이 바람에 날리는 효과를 주기 위해서는 Get->Force->Wind명령으로 wind force(풍력)를 생성시켜야 한다.
천에 바람을
적용시키는 방법은 중력을 적용시켰을 때와 동일하다. 천을 선택한 후 Modify->Environment->Apply Force를 클릭한 다음
화면이나 익스플러어의 wind 아이콘을 클릭한다.
wind의 세기에 애니메이션을 주면, 천이 펄럭이는 효과를 얻어낼 수 있다.
여기를 클릭하면 천이 바람에 펄럭이는 동영상을 볼 수 있다.다음으로 캐릭터가 입는 의상과 같이 비교적 난이도가 높은 cloth simulation에 대해 알아보자. 이제부터는 시뮬레이션을 적용하면서 몇 가지
난관에 부딪히는 시점이다. 의복을 생성할 때는 여러 가지 요소들이 복합적으로 작용하기 때문에 여러 가지의 조정이 필요하다. 그럼으로써 좀 더
많은 충돌과 더욱 복잡한 모델을 연결할 수 있다. 예를 들어, 여러분이 인간 캐릭터에 입힐 재킷을 생성한다면 모델과 의복에 대해 수 없이 많은
접촉 테스트를 해봐야만 한다.
캐릭터에 입힐 옷을 만드는 데는 폴리곤과 넙스 두 가지 방식이 있다. 개인적으로 필자는 편리하게 모델링을 할 수 있다는 점 때문에 XSI에서
폴리곤 방식을 선호한다. 이에 더해 XSI의 subdivisions 방식 또한 매우 좋게 평가한다. 여러분은 의상 오브젝트에
subdivision을 적용할 수 있는데 계산을 위한 추가적인 시간이 필요하진 않다.
NURBs 방식을 사용할 때는 cloth 시뮬레이션 툴바에 있는 stitching 툴을 이용한다. 이것은 두 개의 NURBs 오브젝트를
연결하여 한 벌의 옷처럼 움직이도록 한다. 이 방식은 재킷에 소매를 붙일 때 유용하다.
이제부터 팔을 덮을 옷소매를 만들게 될 것이다. 이것은 옷이 움직이는 오브젝트(팔)와 상호작용 하는지를 보여준다.
먼저 팔 역할을 하게 될 기본 cylinder를 Get->Primitive->Polygon Mesh->Cylinder 명령으로 꺼낸다.
필자는 약간의 subdivisions을 적용했는데, 이것은 cylinder에 폴리곤을 증가시켜 의상과 좀 더 확실하게 상호 작용할 수 있도록
하기 위함이다. 그리고 몇 개의 포인트들을 cylinder의 중심으로 이동시켰다. 팔 오브젝트가 중앙에서 접힐 부분이 필요하기 때문이다. 중앙에
포인트가 많이 있을수록 좀 더 보기 좋게 접히게 된다.(그러나 지금은 옷이 이 부위를 덮기 때문에 보이지 않을 테지만.. lol).

다음으로 기본 팔 스켈레톤을 생성하여 cylinder에 인벨럽을 한다.
Animate 툴바에서 Create->Skeleton->Draw 3D Chain을 한다. 이것을 여러분이 만들어놓은 cylinder의 중앙에
위치시킨다. Joint 부분은 cylinder의 중앙에 오도록 하여 팔꿈치의 형태로 움직이게 한다.

Cylinder를 선택하고 Deform->Envelope->Set Envelope을 적용한다. 마우스 가운데 버튼으로 익스플러로에서 스켈레톤을
클릭한다. 이제 여러분이 null을 움직이면 만들어놓은 팔이 접히는 것을 볼 수 있다.
팔의 세팅이 끝났으니 옷소매를 만들어 보도록 하자.
이번에도 필자는 기본 cylinder를 꺼내어 팔보다 조금 크게 만들었다. 그리고 폴리곤의 양쪽 끝을 뚫어 실제 옷소매처럼 양쪽이 트이도록
했다.
다음은 cloth 시뮬레이션을 적용시킨다. 필자는 옷소매의 끝이 몸에 고정되도록 하여 소매가 팔에서 떨어지지 않도록 할 것이다. 이를 위해
시뮬레이션을 적용할 때 소매의 끝 부분은 제외한다. 이러한 방식대로 한다면 한쪽 끝이 고정된 채로 소매가 움직인다.

시뮬레이션 툴바에서 Create->Cloth->From Selection를 적용한다. 이제 끝자락은 고정된 상태에서 소매가 움직이게 될 것이다.
이제 외부의 힘과 충돌 명령을 적용할 것이다. Modify->Environment->Apply Force 명령을 선택한 후 중력 아이콘을
클릭한다. 이제 애니메이션을 플레이해보면, 옷이 아래 방향으로 내려가는 것을 볼 수 있다.
옷이 팔과 상호작용을 하기 위해서는 Modify->Environment->Set Obstacle 명령을 선택한 후 팔 오브젝트를 클릭한다.
새로운 다이얼로그 박스가 화면에 뜰 것이다.

obstacle type은 Actual Shape으로 세팅하여 좀 더 사실적인 상호작용이 이루어지도록 한다.
이제 애니메이션을 플레이해보면,
옷이 아래로 향해 내려가고 팔 오브젝트에 부딪히는 순간에 멈추는 것을 볼 수 있다. 위의 첫 번째 예에서처럼, 팔이 옷을 뚫고 나오지 않게 하는
데에는 몇 가지의 방법이 있다. 여러분이 Push Length를 0.2로 변경하면, 옷감이 팔에 실제로 닿는 순간보다 0.2 units 만큼
빠른 지점에서 충돌이 적용되어 팔이 뚫고 나오는 현상을 방지할 수 있다.
팔에 움직이는 애니메이션을 주어, 그래도 옷이 적합한 정도로 작용하는지 본다. 팔이 접히는 기본적인 애니메이션을 준 후 플레이를 시켜본다.
여러분이 보는 것처럼 천은 팔과 상호간에 반응을 한다.

cloth 시뮬레이션을 하는 동안 여러분들은 조절할 수 있는 많은 파라미터들이 있다는 것을 느꼈을 것이다. 여러분이 원하는 결과를 얻는 쉬운 방법은
Presets tap을 이용하는 것이다. 이 탭에서 여러분은 기본적으로 설정된 천 종류들 중에서 원하는 것을 선택할 수 있다.
또한 천과 팔 오브젝트 간에 friction(마찰력)을 조정할 수 있다. 이 수치를 조정하여 천이 마치 실크처럼 미끄러져 내리도록 하거나
고정되게 할 수 있다. Mass 옵션은 매우 효과적인 파라미터인데, 수치를 조정하여 카페트처럼 매우 묵직한 느낌을 내거나 바람에 흩날리는
실크처럼 가벼운 느낌을 낼 수 있다.
이번에는 간단한 스커트와 재킷을 생성하여 캐릭터에 의상을 입혀보자.
아래의 이미지는 스커트인데 cloth 시뮬레이션 세팅은 매우 쉽게 되어있다. 위의 예제로 만들었던 소매와 똑같은 방식으로 세팅되어 있다.
스커트는 기본 cylinder를 이용하여 만들었고 양 끝을 뚫어주었다. 상단 부분은 캐릭터의 허리부분과 연결시켰다. 중력을 적용하였고 캐릭터와
충돌 설정이 된 상태이다. 이 시뮬레이션에서 가장 중요한 부분은 스커트가 원하는 방식으로 움직이게 하는 것이다. 너무 뻣뻣하지 않아야 하고 보기
좋은 흔들림을 표현해야 한다.

여기를 클릭하면 cloth 시뮬레이션이 적용된 스커트 동영상을 볼 수 있다.
다음으로 캐릭터에 롱코트를 입혀보자.

이 부분에서는 문제점들이 많이 생겨나고 많은 세심하게 손볼 부분들도 있다. 그러나 여러분이 문제의 핵심만 잘 파악한다면 멋진 결과물을 만들어낼
수 있다.
시작에 앞서 캐릭터를 하나 준비해야 한다. 캐릭터의 모양과 사이즈에 맞게 코트를 만든다. 코트의 내부는 반드시 비어있어야 충돌 효과가 정상적으로
일어난다. 예를 들어 팔을 덮는 옷소매의 양끝이 막혀 있다면 충돌은 정상적으로 적용되지 않을 것이다.

코트가 모델링 되었으면, 중첩된 포인트는 없는지 확인한다. 몸통 오브젝트가 코트를 뚫고 나온 부분이 있다면 충돌 효과가 정상적으로 나타나지
않는다.
이번 설정에서, 필자는 코트의 제일 윗부분을 캐릭터의 목과 연결했다. 이렇게 해놓으면 코트의 모든 부분이 움직이게 되더라도 아래로 흘러내리지
않는다.
이를 위해 필자는 코트의 옷깃 주변의 상단 가로줄 포인트들을 선택한 후 Cluster with centre 명령을 주어 cluster를
생성했다. 이 명령을 이용하면 cluster를 조작할 수 있는 null이 하나 생긴다. 생성된 null을 neck에 연결해주었다. 그래서 목이
움직일 때마다 코트의 상단도 항상 같이 이동하도록 했다. 다음으로 코트의 다른 부분들이 몸통을 따라다니도록 하기위한 cloth 시뮬레이션을
적용한다. 옷깃을 제외한 코트의 나머지 모든 포인트들을 선택한다. 중력을 적용하고 몸통과는 충돌 설정을 해주면 코트는 캐릭터가 애니메이션 되는
방향으로 따라서 움직일 것이다. 하지만 해결해야할 몇 가지 문제점들이 아직 남아있다.
먼저 여러분은 몇 군데에서 몸통이 코트를 뚫고 나온 것을 볼 수 있을 것이다. 여러분은 아마도 mesh를 증가시키기를 수차례 반복하여 문제를
해결할 수 있을 테지만 이것은 CPU에 부하를 가져온다. 가장 좋은 방법은 앞서 예제에서 설명했듯이 Push Length 수치를 늘리는 것이다
이로서 충돌 문제는 해결을 할 수 있을 것이다.
여러분은 아마도 코트가 너무 과하게 늘어나고 곳곳에서 울룩불룩하게 되는 것을 확인했을 것이다. 아직 몇 가지 조절해주어야 할 부분이 남아있음을
의미한다.
첫째, Tolerance 설정을 낮추어 천의 정밀도를 증가시킨다. 필자는 묵직한 느낌의 코트를 생각했기 때문에 현재 상태는 너무 흐느적거린다.
그래서 무게를 좀 더 부여할 필요가 있다.
이것을 조절하기 위한 파라미터는 Stiffness - Resistance to... 하위에 있는 것을 조정하면 된다. 이 설정들은 여러분이 만든
의상이 어떤 재질감을 갖는지를 결정한다. Shear 파라미터는 가능한 원본의 형태를 유지한 상태로 의상의 상태가 변형되지 않게 한다. Bend
파라미터를 높게 설정하면 지금 우리가 코트에 적용하려고 하는 느낌에 가까운 가죽 같은 상태로 만들고, 수치를 낮게 하면 비단이나 실크 같은
옷감이 된다. 마지막으로 stretch 수치를 증가시키면 신축성이 낮아진다. 수치가 낮을수록 의상은 쉽게 변형된다.
이 외에도 고려해야할 많은 요소들이 있지만 필자는 가장 중요하다고 생각되는 것들에 대해 중점적으로 다루었다.
여기를 클릭하면 캐릭터의 움직임에 따라 코트가 변형되는 동영상을 볼 수 있다..
기타 질문은 duncan_burch@hotmail.com 로 보내주기 바란다.
tutorial written by Dunky on Sunday 16th Feb 2003