AnyPortrait > 메뉴얼 > 본 제약
게임에서 캐릭터를 움직일 때는 본이 항상 원하는 범위 안에서 움직여야 하는 경우가 있습니다.
예를 들어 팔꿈치나 무릎이 관절의 한계를 넘어 회전하지 않도록 제한하거나, 손이나 발이 일정한 범위 안에 있도록 만들어야할 수 있습니다.
이러한 움직임을 매번 키프레임으로 직접 제어하는 대신, 본의 트랜스폼을 특정 범위에 맞춰 제한하는 기능이 있다면 크게 도움이 될 것입니다.
"본 제약(Bone Constraint)"은 이러한 본의 움직임을 자동으로 제약하는 기능입니다.
이 기능은 IK에 의한 제약도 지원하기 때문에 다양한 상황에서 도움이 될 것입니다.
이 페이지에서는 본 제약을 사용하는 예시들과 함께 본 제약과 관련된 옵션들을 설명합니다.
본 제약을 적용해봅시다.
(1) 메시 그룹 편집 화면에서 Bone 탭을 선택합니다.
(2) 제약을 적용할 본을 선택합니다.
(3) IK and Constraints 탭을 선택합니다.
(4) Add Constraint 버튼을 누릅니다.
본 제약을 추가하면 위와 같이 다양한 옵션들이 나타나는 것을 볼 수 있습니다.
1. Constraint Stack : 추가된 본 제약들입니다. 편집할 제약을 선택할 수 있으며, X 버튼을 눌러서 삭제할 수도 있습니다.
2. Add Constraint : 본 제약을 추가하는 버튼입니다.
3. Layer Up/Down : 본 제약 연산 순서를 조절할 수 있습니다. 같은 연산 시점을 가지는 경우 리스트의 아래쪽의 제약이 먼저 연산됩니다.
4. Constraint Method : 제약이 적용되는 트랜스폼의 종류입니다.
5. Coordinate : 제약의 연산이 수행되는 축을 결정하는 좌표계입니다. 옵션에 따라서는 연산 시점이 바뀌기도 합니다.
6. Axis, Range : 제약이 가해지는 축과 범위 값입니다.
7. Weight : 제약이 얼마나 가해지는지 정도를 결정합니다. 컨트롤 파라미터를 연결할 수도 있습니다.
8. Smooth Clipping : 제약 범위 근처에서 완만하게 제약이 적용되도록 설정할 수 있습니다.
9. Guidelines : 작업 공간에서 제약 범위를 시각적으로 보기 위한 옵션들입니다.
10. 공통 옵션 : 해당되는 본 제약들에 공통적으로 적용되는 옵션들입니다.
몇가지 예시들과 함께 본 제약의 옵션들을 알아봅시다.
"Position" 제약을 이용하여 본의 위치를 제한할 수 있습니다.
이때 Coordinate의 값을 "Delta"로 설정하면 부모 본을 기준으로 모디파이어나 애니메이션에 의한 이동을 제한할 수 있습니다.
"Position + Delta" 방식의 제약의 효과를 확인해보면서 다른 옵션들도 같이 살펴봅시다.
주의
이 방식은 모디파이어나 애니메이션 상에서의 본의 이동 값을 제한합니다.
대상인 본이 부모 본과 IK 체인으로 연결된 상태라면 본의 위치를 기즈모로는 편집할 수 없습니다.
IK 체인을 먼저 해제한 후 제약을 설정하시길 권장합니다.
(1) Add Constraint 버튼을 눌러서 새로운 본 제약을 추가하고 리스트에서 선택합니다.
(2) Constraint Method의 값을 "Position"으로 설정하고 Coordinate의 값을 "Delta"로 설정합니다.
(3) 작업 공간에서 선택한 본 주위에 사각형의 가이드라인이 그려지는 것을 볼 수 있습니다. 이 가이드라인은 현재 적용된 제약의 범위를 의미합니다.
제약이 적용되는 범위를 변경해봅시다.
(1) Axis를 선택합니다. X축이나 Y축을 하나 선택해서 제한하거나 X와 Y축를 한꺼번에 제한할 수 있습니다. 여기서는 X축을 선택해보았습니다.
(2) 가이드라인이 선택한 축에 대해서만 그려지는 것을 볼 수 있습니다.
(3) Range Type의 값을 변경합니다.
최대, 최소 범위를 하나만 또는 모두 지정할 수 있습니다.
"Fixed"를 선택하면 트랜스폼의 값이 지정된 값을 가지도록 만듭니다.
이 예시에서는 "Max"를 선택해보았습니다.
(4) 제한 범위 값을 입력합니다.
(5) 지정한 축, 제한 범위 종류와 값에 맞게 가이드라인이 그려지는 것을 볼 수 있습니다.
Delta 타입의 좌표계에서는 부모 본의 좌표계를 기준으로 삼기 때문에 위와 같이 제약의 범위가 설정됩니다.
위 과정을 거치면 본 제약의 기본 설정이 완료됩니다.
이 예시에서 몇가지 옵션들을 더 살펴봅시다.
(1) Weight와 관련된 옵션들입니다. Weight가 1보다 작으면 제약이 적용되는 정도가 줄어듭니다. 컨트롤 파라미터와 연결할 수도 있습니다.
(2) Smooth Clipping을 활성화하면 범위 근처에서 트랜스폼이 완만하게 제한되도록 만들 수 있습니다.
(1) 가이드라인이 어떻게 보여지는지를 결정하는 옵션입니다. Guidelines 옵션은 "보여지지 않음(Hidden)", "선택 여부와 상관없이 항상 보여짐 (Always)", "본이 선택될 때만 보여짐 (Selected Only)"의 값을 가집니다.
(2) 설정된 색상과 방식에 의해서 가이드라인이 작업 공간에 그려집니다.
(3) 또한, 보기 메뉴 > Bone Guides > Show Constraint Info 항목을 통해서 가이드라인을 일괄적으로 숨기거나 보이게 만들 수 있습니다.
옵션 설정이 완료되었다면 본 제약을 테스트해봅시다.
본 제약을 테스트해보기 위해 간단한 애니메이션을 제작해봅시다.
(1) 애니메이션 클립을 생성합니다.
(2) 편집 모드를 켭니다.
(3) 제약이 적용된 본을 애니메이션에 등록한 후 이동시킵니다.
(1) 편집 모드를 끕니다.
(2) 본이 제약에 의해서 설정된 범위 안쪽으로 위치가 제한되는 것을 볼 수 있습니다.
이번에는 본의 회전을 제한하는 제약을 설정해봅시다.
(1) 제약을 적용하고자 하는 본을 선택합니다.
(2) Add Constraint 버튼을 눌러서 제약을 추가합니다.
(3) Constraint Method 옵션의 값을 "Rotation"으로 설정합니다.
(4) 가이드라인이 회전 범위 형태로 나타나는 것을 볼 수 있습니다.
회전의 경우 본의 기본 각도(로컬 좌표계)를 기준으로 범위가 설정됩니다.
회전 범위를 설정합니다.
(1) Range Type의 값을 "Min ~ Max"로 설정합니다.
(2) Angle Range의 값을 적절히 설정합니다.
참고
"Rotation" 방식의 제약의 경우, 그 특성에 의해 Coordinate 옵션이 등장하지 않으며 항상 "Delta" 타입으로만 동작합니다.
또한 Range Type의 값은 회전이라는 특성에 의해 "Min ~ Max"와 "Fixed"만 존재합니다.
제약의 기본 설정 작업이 완료되었다면 이번에는 Weight 옵션에 대해서 더 살펴봅시다.
기본적으로 Default Weight 옵션에 의해서 제약이 적용되는 정도(0~1)가 결정됩니다.
하지만 컨트롤 파라미터를 이 옵션과 연결한다면 제약의 정도가 실시간으로 변경될 수 있습니다.
(1) "Weight" 옵션들 중의 Control Parameter 옵션을 활성화하고 Set 버튼을 누릅니다.
(2) Float 타입의 컨트롤 파라미터를 선택하고 Select 버튼을 누릅니다.
(1) 테스트를 위해 애니메이션 클립을 만듭니다.
(2) 본을 회전시키는 애니메이션을 만듭니다.
현재는 제약이 적용되지 않아서 본이 설정된 범위보다 더 많이 회전되는 것을 볼 수 있습니다.
(1) 본 제약과 연결한 컨트롤 파라미터를 애니메이션에 등록합니다.
(2) 키프레임을 추가합니다.
(3) 컨트롤 파라미터의 값을 1로 설정합니다.
(4) 제약이 온전히 동작하여 본의 회전이 설정된 범위에 의해 제한되는 것을 볼 수 있습니다.
"Scale" 방식의 제약을 이용하면 본의 크기를 제약할 수 있습니다.
(1) 위와 같이 제한되는 좌표계와 축, 범위를 설정합니다.
(2) 작업 공간에 크기를 알려주는 몇개의 사각형 가이드라인들이 나타납니다. 이 중, 회색은 기본 크기를 의미합니다.
Delta 좌표계의 "Scale" 방식의 제약은 "Position"과 비슷한 옵션을 가지며, 실제로 비슷하게 동작합니다.
다만 "Scale" 제약에서는 범위 값들이 항상 "양수"여야 한다는 점에서 차이가 있습니다.
이는 "Scale" 제약은 본의 Scale이 반전되는 것은 고려하지 않기 때문입니다.
이번에는 Coordinate값을 "World"로 설정해봅시다.
"Position"과 "Scale" 방식의 제약이 "World" 좌표계를 지원하는데, 그 동작 방식이 서로 다릅니다.
또한 "Position" 방식의 제약에서 IK를 이용하는지 여부에 따라서도 동작 방식과 결과가 달라집니다.
이번 예시에서는 IK를 사용하지 않은 상태로 "Position" 방식의 제약에 "World" 좌표계를 적용해보겠습니다.
(1) 제약을 추가 및 선택한 후, Contraint Method의 값을 "Position"으로 설정하고, Coordinate의 값을 "World"로 설정합니다.
(2) 가이드라인의 좌표계가 본과 무관한 World 좌표계에서 그려지는 것을 볼 수 있습니다.
(1) 위치를 제한하기 위한 범위의 축과 값을 설정합니다. World 좌표계에서는 범위를 설정하기 어려우므로 Set Current Position to Property 버튼을 누르면, 현재 본의 위치가 범위 값에 입력되니, 이를 이용하여 위치를 유추해서 입력할 수도 있습니다.
(2) 설정된 제약의 영역을 작업 공간에서 볼 수 있습니다.
Move by IK 옵션은 위치를 제한할 때 IK를 이용할 지 여부를 결정합니다.
이번 예시에서는 IK 없이 테스트를 해볼 것이므로 체크를 해제합니다.
(1) 테스트를 위해 애니메이션 클립을 만듭니다.
(2) 편집 모드를 켭니다.
(3) 이번에는 "World" 좌표계의 특성을 확인하기 위해 부모 본이 이동하는 애니메이션을 만들어보았습니다.
(1) 편집 모드를 끕니다.
(2) 부모 본이 이동했음에도 불구하고 제약이 적용된 본은 설정된 범위의 바깥으로 이동하지 못하는 것을 볼 수 있습니다.
"World" 좌표계의 제약은 모디파이어나 애니메이션의 값과 무관하게 전체적인 포즈를 기준으로 동작한다는 것을 알 수 있습니다.
이번에는 "IK"를 적용한 "Position + World" 제약에 대해서 알아봅시다.
이 제약을 제대로 사용하기 위해서는 위와 같이 IK 체인이 설정되어 있어야 합니다.
(1) IK 체인이 설정된 본을 선택합니다.
(2) Add Constraint 버튼을 눌러서 제약을 추가합니다.
(3) 위와 같이 "Position" 및 "World" 방식의 제약이 되도록 설정하고, 범위 값을 적절히 입력합니다.
(4) Move by IK 옵션을 활성화합니다.
(1) 애니메이션 클립을 만듭니다.
(2) 편집 모드를 켭니다.
(3) IK 체인의 루트 본을 움직여서 제약이 동작하도록 유도합니다.
(1) 편집 모드를 끕니다.
(2) "Position" 제약이 동작하는 것을 볼 수 있습니다. 또한 이 제약에 의해서 IK 체인 전체의 포즈가 IK에 의해 바뀌는 것을 볼 수 있습니다.
IK와 함께 제약이 동작하는 과정입니다.
위 결과에서 볼 수 있듯이, 이 방식의 제약은 "걷고 있는 캐릭터의 발이 땅속으로 파고드는 것을 방지하는 것" 등을 구현하기에 매우 효과적입니다.
다른 옵션을 이용하여 제약을 더 유연하게 사용해봅시다.
지금까지는 제약의 범위를 설정하기 위해 값을 직접 입력했습니다.
이 방식은 번거롭기도 하고 실시간으로 바꿀 수도 없습니다.
이때, "다른 본"의 위치를 제약의 범위 값으로서 사용한다면 이 문제를 해결할 수 있습니다.
(1) "땅"의 높이 역할을 할 "Bone Ground"라는 본을 새로 추가했습니다.
(2) 제약이 설정되었던 IK 체인의 본을 선택합니다.
(3) 앞서 만든 제약을 선택합니다.
(4) Refer to Bones 옵션을 활성화 하고 Set 버튼을 누릅니다.
(5) "Bone Ground"를 선택하고 Select 버튼을 누릅니다.
Refer to Bones 옵션은 다른 본을 참조해서 제한 범위에 해당하는 값을 대체하는 역할을 합니다.
이때 X, Y축 및 최소, 최대 범위에 각각 다른 본을 할당하는 것이 가능합니다.
만약 본이 할당되지 않았다면 입력한 숫자 값이 사용됩니다.
애니메이션 편집 화면에서 테스트를 해봅시다.
(1) "Bone Ground"를 움직여보면 (2) 가이드라인이 같이 움직이는 것을 볼 수 있습니다.
이 상태에서 편집 모드를 종료하면, "Bone Ground"의 Y 위치를 기준으로 제약이 동작하는 것을 볼 수 있습니다.
"Position + World (IK)" 제약에서 사용되는 옵션들을 더 알아봅시다.
"Common Constraint Properties" 항목에는 FK-based IK와 Smooth IK 옵션이 있습니다.
이 옵션들은 제약에 의해 IK가 동작할 때 사용되는 옵션들입니다.
먼저, FK-based IK 옵션의 역할에 대해서 알아봅시다.
IK를 이용하는 여러개의 제약에 의해서 본이 이동하는 경우, 일단 제약에 의한 위치를 최종적으로 계산합니다.
그리고 그 위치로 본이 이동할 수 있도록 IK를 1회 실행합니다.
따라서 IK와 관련된 옵션은 제약마다 설정되지 않습니다.
FK에 의한 제약은 IK 연산 전에 일괄 처리됩니다.
하지만 IK에 의한 제약은 IK 연산 과정에서 처리됩니다.
처리 순서는 "모디파이어/애니메이션에 의한 FK > FK 방식의 제약 > IK 컨트롤러 > IK 방식의 제약 > 마무리 회전 보정 > 지글 본"입니다.
IK 방식의 제약은 IK 컨트롤러와 마찬가지로 IK 체인의 옵션을 활용합니다.
즉, IK의 각도 제한이나 초기 포즈가 동일하게 적용됩니다.
FK-based IK 옵션은 제약에 의한 IK가 동작할 때 초기 포즈를 어떻게 설정할지를 결정합니다.
FK-based IK 옵션을 켜면 FK에 의한 포즈를 기준으로 IK 연산을 합니다.
FK-based IK 옵션을 끄면 제약이 적용되려는 시점의 직전의 포즈를 기준으로 IK 연산을 합니다. 즉 다른 본의 제약이나 IK 컨트롤러등의 영향을 받을 수 있습니다.
그래서 이 옵션의 효과를 확인하기 위해 IK 컨트롤러를 활용해보겠습니다.
위와 같이 1개의 IK 체인에 2개의 Effector Bone을 연결하는 IK 컨트롤러를 설정했습니다.
참고
IK 체인 내의 "초기 포즈 (Initial Pose)" 옵션의 값이 "Prefer Angle"이라면 FK-based IK 여부는 큰 차이가 없을 수 있습니다.
애니메이션 편집 화면에서 위와 같이 편집을 해보았습니다.
(1) IK 체인이 왼쪽으로 구부러지도록 키프레임 애니메이션(FK)을 만들어보았습니다.
(2) 반대로, Effector Bone은 오른쪽에 배치했습니다.
(1) 편집 모드를 끕니다.
(2) Effector Bone와 IK 컨트롤러에 의해서 IK 체인의 관절이 FK와는 반대로 오른쪽으로 구부러진 것을 볼 수 있습니다.
이 상태에서 제약을 동작시켜봅시다.
FK-based IK가 켜진 왼쪽 결과에서는 FK의 포즈를 기준으로 관절이 왼쪽으로 구부러진 상태로 제약과 IK가 동작합니다.
반대로, FK-based IK가 꺼진 오른쪽 결과에서는 IK 컨트롤러의 결과를 바탕으로 제약이 동작합니다.
다음으로 "Smooth IK" 옵션을 살펴봅시다.
이 옵션은 제약이 적용되는 시점에 IK의 가중치를 서서히 증가시키는 역할을 합니다.
이때, 제한 범위와의 거리에 비례하여 가중치를 조절하므로, 거리 값을 추가적으로 입력해야합니다.
(1) Smooth IK 옵션을 켜고 Transition Distance의 꽤 큰 값으로 변경하여 확인이 쉽도록 만듭니다.
본들이 아래로 내려오는 간단한 애니메이션을 만들어서 제약이 적용되는 과정을 확인해봅시다.
제약이 적용된 본이 제한 범위에 도달했는데도 불구하고, 잠시 본이 그보다 더 아래로 갔다가 올라오는 것을 볼 수 있습니다.
이것은 Smooth IK에 의해서 IK 가중치가 서서히 증가하였고, 그만큼 제약이 덜 적용되었기 때문입니다.
이를 통해 제약 범위를 완화하여 부드러운 모션을 만들 수 있습니다.
제약의 옵션 중 Smooth Clipping이 있습니다.
이 옵션 역시 제한 범위 근처에서 제약의 강도를 조절하여 부드러운 모션을 유도합니다.
Smooth IK는 "IK의 가중치"를 조절하는 역할을 하지만 Smooth Clipping은 "제한된 트랜스폼의 값"을 조절한다는 점에서 차이가 있습니다.
(1) Smooth Clipping 옵션을 켜고 Smooth Area Size를 적절히 설정합니다.
동일한 애니메이션을 재생한 결과입니다.
Smooth IK의 결과와 달리, Smooth Clipping는 제약의 범위 바깥으로 본이 나가지 않는 것을 볼 수 있습니다.
이는 IK와 무관하게 본의 위치값을 서서히 제한하되 범위는 지키도록 동작하는 Smooth Clipping 옵션의 특성 덕분입니다.
"Scale"과 "World" 조합의 제약은 다른 용도로 사용됩니다.
(1) 부모 본의 크기가 변경되면 (2) 자식 본들의 크기도 이에 비례하여 같이 변경되는 것이 기본적인 스켈레탈 연산 방식입니다.
그런데 부모 본의 크기와 별개로 자식 본의 크기를 적당히 제한하거나 아예 고정해버리고 싶을 때도 있을 것입니다.
이때 사용되는 것이 "Scale + World" 제약입니다.
(1) 크기를 고정하고 싶어하는 자식 본을 선택합니다.
(2) 제약을 추가하고, Constraint Method의 값을 "Scale", Coordinate의 값을 "World"로 설정합니다.
(3) Axis의 값을 "X, Y", Range Type의 값을 "Fixed"로 설정한 뒤, 각각의 축에 대해 크기가 1로 고정되도록 설정합니다.
이제 부모 본의 크기가 변경되더라도 자식 본의 크기는 바뀌지 않는 것을 볼 수 있습니다.