VRChat/VRChat 아바타 강좌

11. 만져라! 잡아라! 메이드 인 피직스 본

FakeZero 2024. 3. 8. 21:04

11. 만져라! 잡아라! 메이드 인 피직스 본


-Physics Bone(피직스 본)

  Unity 에셋 스토어에서 파는 상품중에 다이나믹 본이라는 상품이 있다.

  이 상품은 모델링을 통해 설정한 본이 물리영향을 받도록 설정할 수 있는 기능을 가진 편리한 에셋이었다. 물리영향을 받는 본을 만들 수 있기 때문에 VRChat에서도 흔들리는 동물의 꼬리나 귀 등을 손쉽게 만들 수 있었다.

 

  그러나 위에서 보이는 것처럼 이 상품을 이용하기 위해서는 다이나믹 본 에셋을 구매할 필요가 있었고 때문에 접근성이 높지 않았었다. 이를 눈치챈 것인지 VRChat에서는 무료로 다이나믹 본을 사용할 수 있도록 SDK에 새로운 기능을 추가했는데 그것이 바로

  피직스 본(Physics Bone) 컴포넌트이다! 심지어 피직스 본에는 물리영향과 관련된 설정만 있는 것이 아니라 플레이어 간의 상호작용도 가능하도록 할 수 있는 상호작용 설정이 준비되어 있다. 전부 알려줄 수 있는 것은 아니지만 자주 쓰는 기능들을 하나하나 천천히 살펴보도록 하자.


-피직스 본을 사용하기 위한 사전 준비

  피직스 본도 결국 본(Bone)을 베이스로 하기 때문에 피직스 본을 사용하기 위해서는 3D 모델에 본을 적용할 필요가 있다.

  따라서 위와 같이 본이 적용되어 있는 모델을 준비했다.

  그 후 Unity에 불러와서 모델에 피직스 본을 적용하면 되는데 이때 피직스 본 컴포넌트를 적용하는 것은 피직스 본을 적용하는 본들의 가장 상위 본이어야 한다.

  적용이 끝났다면 피직스본 컴포넌트의 Collision->Radius에서 수치를 조정해 Scene화면에서 저렇게 본이 캡슐모양으로 보여야 제대로 피직스 본이 작동할 수 있다.

  이렇게 미리보기를 실행했을 때 Game탭에서 마우스로 모델을 홀드해 이리저리 움직일 수 있다면(VRChat 내에서 손으로 잡는 것과 같은 취급이다.) 정상적으로 피직스 본이 작동하고 있는 것이다. 이것으로 기본 준비는 종료되었다.


-기능 소개

  지금부터 피직스 본의 현재 상태를 기준으로 기능을 하나하나 살펴봐보자.


Transforms


Root Transform :

  이렇게 Root Transform은 적용된 본을 가장 상위 본으로 만든다. 적용한 본의 상위에 본이 또 있더라도 그 상위 본은 무시하게 된다.

  영상에서 보이는 것처럼 피직스 본을 적용할 가장 상위 본을 조정할 수 있고 이 기능을 활용하면 아예 본이 아닌 오브젝트에서도 피직스 본을 제어할 수 있으므로 피직스본을 정리하고 싶다면 해당 기능을 활용하면 된다.


Ignore Transform :

  영상에서 보이는 것처럼 이 기능은 적용된 본 이하의 하위본을 모두 무시하는 기능이다.


Forces

  Forces탭의 설정은 위와 같이 Integration Type을 Advanced로 설정해놓고 하도록 하겠다. Simplified와 Advanced의 차이는 Simplified의 Spring을 Advanced에서는 Momentum와 Stiffness로 분리한 것일 뿐이다. 간단히 말해 탄성을 운동량과 강성의 2가지 요소로 나눈 것이므로 Simplified의 Spring을 사용할 때에는 Advanced의 Momentum과 Stiffness의 특징이 합쳐져 있다고 보면 된다.

 

  또한 이 부분에서 모든 변화를 말로 표현하기엔 무리가 있으므로 모든 특성을 동영상으로 올려두었으니 참고하기를 바란다.


Pull(당김힘) :


Momentum(운동량) :


Stiffness(강성) :


Gravity(중력) / Gravity FallOff :


Immobile(움직이지 않음) :


Limits

  지금의 피직스 본은 보다시피 이리저리 모든 방향으로 움직일 수 있다. 하지만 이 기능을 이용하면 피직스본을 원하는 축으로만 움직일 수 있도록 제한할 수 있다.


Angle :

  Limits 기능을 이용하게 되면 위와 같이 각 본마다 푸른색 제한 범위가 나오게 된다. Angle의 경우 위에 보이는 저 원뿔 안에서만 본이 움직이게 하는 것이다.

  Angle 설정은 워낙에 범위가 넓기 때문에 조금 차이를 알아차리기 어렵지만 다루는 본이 적으면 쉽게 None과의 차이가 보일 것이다.


Hinge :

  위의 Angle이 3축을 제한했다면 Hinge는 한 축을 완전히 막고 2축으로만 움직이게 제한하는 설정이다.

  또한 Max Angle에서 설정할 수 있는 값은 0~180의 범위로 움직이며 실제로 움직이는 범위는 이의 x2만큼 움직인다. 예를 들어 Max Angle 값이 45이면 가동범위는 90도인 것이다.


Polar :

  Polar는 Angle과 비슷하지만 다른 점이라고 하면 피치(Pitch)회전과 요(Yaw)회전을 분리시켜서 제한시킬 수 있다는 점이 다르다. 대체로 Angle과 비슷한 기능이므로 영상은 스킵한다.


Collision

  혹시 10강에서 언급되었던 Collider(콜라이더)를 기억하는가? Collision은 그야말로 그 콜라이더를 제어하는 항목이다.

  피직스 본은 플레이어와 상호작용이 가능한 기능이기 때문에 콜라이더는 필연적으로 들어가야하는 기능인 것이다.


Radius

  Radius는 뜻 그대로 피직스 본 콜라이더의 반경을 의미하는 것인데 이 반경은 VRChat 내에서도 확인할 수 있다.

Options -> Config -> Avatar Overlay

 

  위의 영상에서 보이는 것처럼 피직스 본은 VRChat내에서도 확인할 수 있으니 참고 바란다.

 

  영상에서 보인 것처럼 피직스 본이 플레이어와 상호작용하는 기준은 모델이 아니라 Radius 값으로 만들어진 캡슐 모양의 콜라이더이다. 따라서 Radius 값은 잘 조정해야만 한다.

 

  참고로 영상에서 보인 Contacts에 관해서는 후술할 것이므로 나중에 설명하도록 하겠다.


Allow Collision :

  피직스 본이 타인이나 자신의 영향을 받을지 받지 않을지 결정한다.

  • False : 그 어떤 접촉도 피직스 본을 움직일 수 없다.
  • True : 모든 접촉에 피직스 본이 움직인다.
  • Other : 나 자신이나 타인이 피직스 본을 움직일 수 있는 것에 대한 여부를 정할 수 있다.

Colliders :

  피직스 본이 만약 다른 부위의 영향도 받을 수 있게 하고 싶다면 이 기능을 활용하면 된다.

  Colliders는 VRC Phys Bone Collider라는 컴포넌트를 같이 이용해야 한다. 아마 영어를 어느정도 읽을 수 있으면 이제는 저 설정들이 대체로 어떤 기능을 하는 설정들인지 알 수 있을 것이므로 바로 영상을 통해 활용법을 확인해보도록 하겠다.

  위 영상으로 알 수 있듯이 VRC Phys Bone Collider는 피직스 본 전용 콜라이더이며 영상에서 보이는 데로 컴포넌트가 적용된 모델의 영향을 받지 않으므로 빈 오브젝트(Empty Object)에도 사용해서 설정할 수 있다.


Stretch & Squish


Stretch Motion & Max Stretch :

  Stretch Motion은 피직스 본이 물리엔진에 의해 움직일 때에 얼마나 늘어나는가에 대한 설정이다.

  Max Stretch는 피직스 본이 최대 얼마나 늘어날 수 있는가에 대한 설정이다.

  Max Stretch의 기본값이 0이 이므로 값을 늘려줘야만 Stretch Motion 값의 변화를 관찰할 수 있다. 또한 Stretch Motion의 값이 0이더라도 Max Stretch에 값이 0이 아니라면 플레이어가 직접 잡아서 늘어뜨릴 수 있다.


Max Squish :

  영상에서 알 수 있듯이 Max Squish는 이름 그대로 최대로 압축할 수 있는 정도이다.


Grab & Pose

  말 그대로 잡는 것과 포징하는 기능을 제어하는 설정인데 이 두 동작 모두 VR 모드에서만 가능한 기능이므로 VR 유저에게만 해당하는 설정임을 기억하자.

  여기서 말하는 포징(Posing)이란 피직스 본을 잡아서 고정하는 행위를 의미하는데 VRChat에서 피직스본을 잡은 다음 컨트롤러의 트리거를 누르면 피직스 본의 해당 상태를 고정할 수 있다. 고정을 해제할 때는 다시 잡았다가 놓으면 풀린다.


  • Allow Grabbing : 피직스 본을 잡을 수 있는지 여부를 설정한다.
  • Allow Posing : 피직스 본을 잡아서 고정할 수 있는지(포징)에 대한 여부를 설정한다.
  • Grab Movement : 피직스 본을 잡았다가 놓았을 때 어느정도로 빨리 원상태로 복구 되는지 설정한다.
  • Snap To Hand : 피직스 본을 잡으면 해당 부위가 잡은 손쪽으로 이동한다.

  Snap To Hand 설정이 말만 들어서는 무슨 말인지 모를 수 있으므로 동영상을 통해 알아보도록 하자.

Snap To Hand Off 상태
Snap To Hand On 상태

  이 두 동영상의 차이를 알겠는가? Snap To Hand가 Off 상태일 때에는 피직스 본이 잡은 그 자리에서 움직였는데 On 상태 일때는 잡은 피직스 본이 손으로 이동했다. 이건 정말 근소한 차이지만 근소한 차이가 항상 디테일을 만드므로 알아두기 바란다.


Options


Parameter :

  입력한 문자열을 통해 여러가지 피직스 본과 관련된 변수를 사용할 수 있게 해준다.

  이름을 입력하면 다음과 같은 변수를 사용할 수 있게 된다.

  • {Parameter}_IsGrabbed : 불(Bool) 변수. 해당 피직스 본이 잡혔는지 판정한다. 잡혔을 때 True값을 반환.
  • {Parameter}_IsPosed : 불 변수. 해당 피직스 본이 고정되었는지 판정한다. 고정(포징)되었을 때 True값을 반환.
  • {Parameter}_Angle : 실수(Float) 변수. 해당 피직스 본의 굽혀진 정도를 판정한다. 범위는 0 ~ 1.
  • {Parameter}_Stretch : 실수 변수. 해당 피직스 본의 늘려진 정도를 판정한다. 범위는 0 ~ 1.
  • {Parameter}_Squish : 실수 변수. 해당 피직스 본의 압축된 정도를 판정한다. 범위는 0 ~ 1.

  사용하고 싶은 이름을 Animator 파라미터와 VRC 파라미터 파일에 입력하기만 하면 바로 적용된다.


  • Is Animated : 활성화 할 경우 해당 피직스 본이 애니메이션의 영향을 받을 수 있도록 한다.
  • Reset Whe Disabled : 피직스 본 컴포넌트가 비활성화 되었을 때, 피직스 본의 원래 자리로 돌아가게 한다.

  참고로 컴포넌트도 몇몇가지 컴포넌트는 애니메이션을 통해 비활성화하는 것이 가능하니 참고하자.

 

  이렇게 해서 피직스 본의 설명이 끝났다.


-VRC Contact Sender, Receiver

  피직스 본과 함께 업데이트 된 중요한 컴포넌트가 2개 더 있다. 그것이 바로 위 사진의 VRC Contact Sender와 Receiver다.


VRC Contact Sender

  VRC Contact Sender와 Receiver는 말 그대로 송(送)신기와 수(受)신기라고 할 수 있는 기능이다.

 

  Root Transform이나 Shape에 대한 것은 이미 이때까지의 강좌를 통해 역할을 짐작하고 있을 것이다. Sender에서 중요하게 봐야 하는 곳은 Filtering 부분이다.

  Filtering의 Add를 눌러서 항목을 추가하면 위와 같은 항목을 생성할 수 있다. 그리고 Custom이라 써있는 버튼을 누르면 위와 같은 리스트가 나온다.

  혹시 이 리스트 어디서 비슷한 것을 본 적이 없는가?

  그렇다. VRC Avatar Descriptor의 Colliders 부분과 상당히 일치한다.

 

  이쯤 설명했으면 이 컴포넌트가 무슨 역할을 하는지 대강 짐작할 수 있을 것이다. 그렇다. VRC Avatar Descriptor를 적용했을 때 생성되는 Colliders들과 VRC Contact Sender는 완벽히 같은 역할을 한다.

 

  VRC Contact Sender에서 Filtering의 기능은 Sender에서 보내는 신호가 어떤 신호인지 구별하게 태그를 달아주는 것이다. VRC에서 미리 지정해둔 태그를 사용할 수도 있고 Custom 항목을 이용해 자신만의 신호를 만들어도 좋다.


VRC Contact Receiver

  Receiver는 위에서 설명했듯이 수신기의 역할을 한다.

  • Allow Self : 자신에게 Receiver 사용을 허용한다.
  • Allow Others : 타인에게 Receiver 사용을 허용한다.
  • Local Only : Receiver의 발동이 자신에게만 처리되고 상대방에게는 처리되지 않는다.
  • Collision Tags : 신호를 받을 태그를 특정한다. 예를 들어 Hands 태그를 추가하면 Hand 태그가 붙어있는 Sender, 그리고 실제로 Hand 태그가 기본적으로 붙어 있는 양 손으로만 Receiver를 발동할 수 있다.

  이 Receiver에서 가장 중요한 부분은 Receiver 항목이다.

  • Receiver Type
    • Constant : Sender와 Receiver가 접촉하고 있을 때에 정수형(Int) 변수로는 1, 실수형(Float) 변수로는 1.0, 불(Bool) 변수로는 True값을 반환한다.
    • On Enter : Sender와 Receiver가 접촉하는 순간의 속도가 Min Velocity에 입력한 값을 넘었을 때만 신호를 반환한다. 정수형 변수로는 1, 실수형 변수로는 1.0, 불 변수로는 True값을 반환한다.
    • Proximity : Receiver의 범위 안에 Sender가 감지되었을 경우 Receiver의 중심과 가장 가까운 Sender의 거리를 0 ~ 1의 값으로 변화해 반환한다. 따라서 실수형 변수로 반환한다.

  다음과 같이 Contact Receiver와 Sender의 사용 예를 보여주었다. 이 두 컴포넌트도 컴포넌트가 적용되어있는 오브젝트가 어떻게 생겼는지와는 관계가 없으니 주의 바란다.


  이렇게해서 피직스 본에 관련된 모든 강좌를 마친다. 피직스 본, 그리고 Contact Receiver와 Sender는 현재 VRChat에서 OSC와 함께 가장 강력한 기믹이며 사용하기 쉬운 기믹이기도 하기때문에 반드시 사용해보는 것을 추천한다.