기본적인 다리 IK_세팅

MoOrY·2023년 10월 15일
0

다리 IK설정

발이 특정 트랜스폼으로 위치한다고 했을 때, IK가 하는 작업은, 발을 해당 위치로 이동하는 동시에 허벅지와 동아리 등 다른 모든 본들도 이동하는 것이다. 따라서 발을 해당 위치에 이동시키기 위해 필요한 회전값을 계산해야 한다.

아까 테스트로 했던 sin에 곱해지는 값을 0으로 설정해주고, BasicIK 노드를 하나 생성한다.

이제 Effector Item의 본 이름을 지정하여 사용하려는 본을 선택해야 한다. foot본을 선택한다.
이후 Item B에는 Foot본의 부모 본인 Calf(허벅지)를 선택하고, Item A엔 허벅지 본의 부모 본인 허벅지 본을 선택한다.

이를 적용하면 다음과 같이 보이게 된다. 다리가 이상하게 보이는 이유는, 우리가 Primary와 Secondary 축과 Effector 프로퍼티를 채우지 않았기 때문이다.

Effector은 기본적으로 발이 목표로 삼아야 하는 트랜스폼이다. GetTransform으로 Foot본의 트랜스폼을 받아와 이를 Effector 프로퍼티에 연결한다.

이렇게 하면 발은 원래 위치로 돌아갔지만, 허벅지와 종아리는 아직 아까 전과 동일한 위치에 있는 것을 볼 수 있다.
이를 수정하기 위해 Primary와 Secondary 축과 Effector 프로퍼티를 채워야 한다.

Primary와 Secondary 축은 본이 어느 방향을 가리키고 있는지 알려주는 값이다.
숫자를 추측하거나, 본에 익숙하다면 벡터의 어느 요소에 어떤 값을 넣어야 할 지 알겠지만, 본이 어느 방향을 가리키는지 모른다면, 다음과 같이 하면 알 수 있다.

스켈레탈 메쉬 에디터에서 허벅지 본을 선택하면, 허벅지 본은 X축의 반대 방향(-1,0,0)을 가리키고 있고, Foot본은 Z축 방향(0,0,1)방향을 가리키고 있는 모습을 볼 수 있다. 이 값을 넣어주면 된다.

Primary Axis에 허벅지 본의 방향인 -1,0,0을 넣어주면 다리가 이전보다는 더 괜찮아졌진 모습을 볼 수 있다.

이제 Secondary Axis를 설정해야 한다. Secondary Axis는 본의 정면이 어디를 쳐다보고 있는지 확인하면 되는데, 허벅지 본은 Y축이 정면을 가리키므로, (0,1,0)을 넣어주면 된다.

Secondary Axis는 기본적으로 (0,1,0)으로 설정되어 딱히 수정하지 않았는데, 다리가 약간 뒤틀린 이유는 극점 벡터(Pole Vector) 파라미터를 아직 설정하지 않았기 때문이다.

폴 벡터는 단일 본 체인에 대한 폴 벡터 컨트롤을 제공하며, 이는 중간 조인트가 팔꿈치나 무릎 등의 IK목표를 향하게하는데 사용된다. 폴 벡터는 위치 혹은 방향일 수 있다.

현재 무릎이 살짝 다른 방향을 향해서 다리가 뒤틀려있는데, 무릎은 캐릭터의 Forward방향을 가리켜야 한다.
컨트롤 릭 내에서 정면은 양의 Y축이므로, Y에 값을 넣어보면 무릎이 점점 정면을 향하는 것을 볼 수 있다.

폴 벡터의 Y값을 5000으로 설정하니 무릎이 정면을 향하고 있는 모습을 볼 수 있다. 여기까지 오면 IK 작업을 시작하기 전, 꼿꼿이 서있던 포즈로 돌아오게 된다.

이전에 했던 것처럼 이동 값에 값을 더해보면 다리 뼈의 본 위치가 위로 올라가고, 허벅지와 종아리도 따라 올라가는 모습을 볼 수 있다.

양쪽 발에 모두 적용

이제 이 IK을 왼쪽뿐 아니라 양쪽 다리에 모두 적용하려면 어떻게 해야할까

이런식으로 오른다리에도 동일하게 해줄 수 있지만, 한쪽 다리를 수정하면 다른쪽 다리도 똑같이 수정해줘야 하는 번거로움이 있다.
이를 위해 본들을 배열에 넣어 반복문으로 처리해줄 것이다.

GetChildren노드를 사용하면 특정 본의 모든 자식 본을 배열에 담아 리턴해준다. Recursive 파라미터를 true로 하면, 자식 본의 자식 본도 배열에 포함한다. 따라서 Root본을 선택하면 모든 본을 배열에 담아 리턴한다.

그렇게 얻은 본을 반복문으로 돌리면 된다. 본 이름에 foot 문자열이 포함되어 있는지 확인하여, foot본에만 작업을 해 줄 예정이다.

하지만 foot이 포함된 본 중에는 작업하기 원하지 않는 ik_foot_l 등의 본들도 포함되어 있으므로, 다음과 같이 처리한다.

이제 foot본들을 배열에 담을 것이다. Rig Element Key타입의 배열을 생성하고, foot본을 그 배열에 담아준다.

참고로 이 생성자 노드는 컴파일할때마다 반복되므로, 컴파일때마다 계속 같은 배열에 Add한다면 foot 본의 복사본들이 계속 배열에 쌓일것이다. 생성자가 시작할때 footArray를 초기화해주자.
Reset노드는 배열을 비우는 함수이다.

그렇게 만든 발 배열을 사용할 땐 다음과 같이 foreach문을 돌려 사용하면 된다. DrawTransform노드를 연결하여 각 발 본의 트랜스폼에 디버그 상자를 그려보았다.

이제 Basic IK 노드에 연결하는 프로퍼티를 반복문을 사용하여 연결해보면 다음과 같다.
GetTransform 노드의 아웃풀 노드를 연결해주고, EffectorItem, ItemB, ItemA를 연결해준다.
Calf와 Thigh본은 각각 foor본과 Calf의 부모 본이므로 GetParent 노드를 사용하여 부모를 구해 연결해준다.

여기까지 오면 다음과 같이 이상하게 보일텐데, 양쪽 다리의 Primary Axis와 Secondary Axis가 일치하지 않기 때문이다. 오른쪽 다리의 Primary Axis는 양의 X축, Secondary Axis는 음의 Y축이며, 왼쪽 다리는 그 반대인 음의 X축, 양의 Y축을 가리키고 있다.
즉 두 다리는 서로의 축에 -1을 곱한 값과 같은 것이다.

왼쪽 다리일땐 값을 그대로 사용하고, 오른쪽 다리일땐 왼쪽 다리에 주는 값에 -1을 곱하여 사용하도록 변경한다. Scale노드는 Vector에 float를 곱한 값을 리턴하는 노드이다.
Equals 노드로 현재 본이 어떤 본인지 판별할 수 있다.
if노드는 branch노드와 다르게, 실행핀 없이 bool값에 따라 두 값 중 하나를 선택할 수 있는 편리한 노드이다.

이제 정상적으로 두 다리 모두 적용되는것을 볼 수 있다.

profile
필기용 블로그입니다.

0개의 댓글