Character Joint - 캐릭터에 물리효과를 받는 본 추가하기

 

지난 섹션들에서 래그돌을 만들고 사용하는 방법을 배우면서 Character Joint의 존재와 사용법에 대해서 알게 되었을 것이다. 그리고 이전 섹션까지는 애니메이션이 적용된 오브젝트와 Character Joint가 적용된 래그돌 오브젝트를 따로 사용한 것 역시 기억할 것이다. 테스트를 해보면 알겠지만 앞 섹션의 예시처럼 애니메이션이 적용된 모델링에는 일반적으로 Character Joint를 추가해도 물리 기능이 작동하지 않는 것을 알 수 있다.

 

하지만 디테일한 묘사를 원하는 개발자의 경우라면, 캐릭터의 허리 춤에 매달린 장비나 포니테일 같은 묶인 머리가 물리 효과를 받아서 자연스럽게 흔들리는 것을 원할 것이다. 이번 섹션에서 다룰 주제는 바로 그것에 대한 내용이다.

 

 

 

3D 모델 준비

 

 

 

 

흔들리는 '포니테일'을 구현하기 위해 간단한 말 모델을 만들어 봤다. 꼬리의 물리 효과에만 집중할 것이기 때문에 다른 부위는 크게 구현하지 않았다. 우선 모델 파일은 스키닝만 한 상태로 애니메이션을 포함하지 않고 익스포트했다.

 

 

그리고 말이 달릴 때 사용할 애니메이션을 간단하게 만들었다. 이 애니메이션을 만드는 과정에서 주의할 점은 Character Joint로 물리 효과를 사용할 본에는 절대로 애니메이션 키를 잡아서는 안된다. 만약 애니메이션을 만드는 과정에서 물리 효과를 적용하려고 하는 본에 키를 잡아버리면 그 본은 Character Joint를 적용해도 애니메이션 대로만 움직이고 원하는 움직임을 보이지 않게 된다. 이런 방식으로 애니메이터가 애니메이션 작업을 할 때, 애니메이션을 넣지 않은 본을 Jiggle bone이라고 부른다.

 

테스트할 때 사용할 이 귀여운 말의 모델과 애니메이션은 여기에서(

Horse.zip
다운로드

) 다운받을 수 있다.

 

 

 

 

유니티에 모델링과 애니메이션 넣기

 

3ds 맥스에서 필요한 모델과 애니메이션을 모두 익스포트했다면, 이제는 이것들을 유니티 엔진에 적용할 차례다.

 

 

우선은 모델과 애니메이션 파일을 유니티에 넣어준다.

 

 

모델과 애니메이션 파일을 가져왔다면 씬을 다음과 같이 구성해보자. 씬 한가운데에 말의 모델링을 넣고 추가된 말의 오브젝트에 애니메이션을 관리할 애니메이터를 넣어주는 것이다.

 

 

그리고 나서 플레이 버튼을 누르고 애니메이터의 isMove 파라메터를 활성화시키면 말이 달리듯이 위아래로 움직이는 것을 볼 수 있다. 하지만 말의 꼬리는 전혀 움직이지 않는 것을 확인할 수 있을 것이다.

 

 

 

꼬리에 Character Joint 적용하기

 

이제부터 꼬리에 물리 효과를 주기 위해 아까 전에 모델과 애니메이션을 만들 때, 애니메이션 키를 잡아주지 않았던 본들에 Character Joint와 Collider를 넣을 것이다.

 

 

유니티의 Hierarchy 뷰에서 말의 본들을 확인할 수 있다. 이 중에서 실제로 Character Joint가 들어갈 본은 3~5번 본이고 2번 본은 애니메이션 키가 적용된 본으로서 단지 Character Joint가 적용된 본들이 연결될 본이며, 2번 본에는 물리효과가 들어가지 않을 것이다.

 

물리 효과를 적용하기 위해서 다음의 순서를 따라해보자.

 

1. 2번 본에 Rigidbody를 추가한다.

 

 

2. 3~5번 본에 Character Joint를 추가해준다. Connected Body의 경우는 각 본마다 Rigidbody가 적용된 바로 한 단계 전의 본을 넣어주면 된다. 예를 들자면 3번 본의 경우에는 2번 본, 4번 본의 경우에는 3번 본을 넣어주는 식이다.

 

 

3. Character Joint가 추가된 본에 충돌 처리를 해줄 Collider를 넣어주고 적절한 크기로 만들어준다.

 

 

위의 과정을 모두 마치고 난후 플레이 버튼을 눌러보면 말의 꼬리가 자연스럽게 아래로 처지는 것을 볼 수 있다. 그리고 애니메이션을 실행시켰을때에도 물리효과를 받고 있는 것을 알 수 있는데, 아직 모자란 점이 눈에 보일 것이다.

 

 

분명 꼬리는 물리 효과를 받아서 흔들리고 있지만 애니메이션이 위아래로 움직이고 있지만 꼬리는 그 영향을 전혀 받고 있지 않음을 알 수 있다. 이 부분에 대해서는 관성을 처리해주는 별도의 스크립트를 추가로 작성해야 한다.

 

using UnityEngine;

public class JiggleBonePhysics : MonoBehaviour
{
    /// <summary>
    /// 부모 본의 트랜스폼
    /// </summary>
    Transform parentTransform;
    /// <summary>
    /// 이 스크립트가 포함된 본 오브젝트의 리지드 바디
    /// </summary>
    Rigidbody boneRigidbody;
    /// <summary>
    /// 이전 프레임까지의 부모 본의 위치
    /// </summary>
    Vector3 prevFrameParentPosition = Vector3.zero;
    /// <summary>
    /// 관성 가중치
    /// </summary>
    public float power = 0f;
    /// <summary>
    /// 변경된 위치의 크기의 제한. 제한 값이 너무 크면 이 본이 제대로 따라가지 못해서
    /// 각 관절들이 이상한 위치로 날아가는 문제가 발생할 수 있다.
    /// </summary>
    public float clampDist = 0.03f;

    void Start()
    {
        parentTransform = transform.parent;
        prevFrameParentPosition = parentTransform.position;

        boneRigidbody = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        Vector3 delta = (prevFrameParentPosition - parentTransform.position);
        boneRigidbody.AddForce(Vector3.ClampMagnitude(delta, clampDist) * power);

        prevFrameParentPosition = parentTransform.position;
    }
}

 

위의 코드가 바로 관성을 처리해주는 코드이다. 이전 부모 본의 위치와 현재 부모 본의 위치로 계산해서 이전 위치에 남아있으려는 힘을 본의 Rigidbody에 전해주는 방식이다. 이 스크립트를 Character Joint 컴포넌트를 가진 모든 본에 추가해주면 된다.

 

 

그리고 나서 애니메이션을 동작시켜보면 말의 움직임에 따라 꼬리가 물리효과를 받는 것을 볼 수 있다. 여기에 추가적으로 간단하게 말을 움직이게 만들어 본다면 다음과 같은 장면을 얻을 수 있다.

 

 

이 Jiggle Bone 기능을 만들 때에는 Rigidbody와 Character Joint의 프로퍼티 값들을 세밀하게 살피면서 잘 조절해주어야 자연스러운 움직임을 연출할 수 있다. 위의 과정을 응용하면 이런 말의 꼬리 이외에도 앞서 말한 캐릭터의 허리춤에 매달린 도구, 묶은 머리, 쇠사슬 등 캐릭터에 추가적으로 달린 여러 가지를 흔들리게 만들 수 있다. 물론 잘 설정하면 신체 부위도 가능하다. 가슴이라던가... 바스트라던가... 엉덩이라던가... 개발자라면 도전해볼만한 기능이다.

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

Ragdoll 사용하기 - Character Joint의 옵션과 조정(5.6)

 


지난 섹션에서는 래그돌을 사용하는 기본적인 방법에 대해서 살펴보았다. 이번 섹션에서는 래그돌 옵션과 세밀한 조정 방법을 알아보도록 할 것이다.

 

 

 

래그돌의 구성요소

 

 

래그돌을 설정할 때 선택했던 본을 Hierarchy 뷰에서 찾아보면 Rigidbody, Collider, Character Joint 컴포넌트들이 추가되어 있는 것을 볼 수 있다. 이 중에서 Rigidbody와 Collider는 래그돌의 물리 처리를 위한 컴포넌트이고 실제로 각 부분간의 연결을 결정하고 래그돌의 기능을 만드는 컴포넌트는 Character Joint 이다.

 

이 Character Joint에는 많은 수의 프로퍼티가 있는데, 중요한 몇몇 프로퍼티에 대해서 순서대로 이야기 해보겠다.

 

첫 번째로 Connected Body 프로퍼티는 이 부위가 연결된 부모가 되는 부위를 가리킨다. 예를 들자면 사람의 왼쪽 허벅지는 엉덩이 혹은 골반에 연결되어 있듯이 모델의 왼쪽 허벅지에 해당하는 본은 골반에 해당하는 본에 연결되는 방식이다. 이 프로퍼티는 연결되는 부위를 선택하지 않을 수도 있는데 그렇게 할 경우에, 그 부위는 시작될 당시의 월드 좌표에 연결된다. 하지만 그렇게 할 경우 일반적으로는 아래의 이미지처럼 되기 때문에 명확한 구조에 맞춰 연결해주는 것이 좋다(아래의 예시에서는 두 다리의 Connected Body를 설정해주지 않고 월드에 연결시켰다.).

 

 

Connected Body를 월드에 연결시키는 방식의 연출을 사용할만한 방법은 교수형당한 사형수 같은 오브젝트의 최상단 조인트를 밧줄에 적용해서 월드에 걸어주고 그 아래의 몸체에 래그돌을 적용시키는 것이다.

 

그 다음으로 설명할 프로퍼티인 Axis는 해당 조인트가 회전할 축을 정하는 것이다.

 

 

이 프로퍼티는 하나의 벡터로 이루어져 있는데 각 값에 대한 예시를 무릎을 기준으로 보자면 다음과 같다. x축을 기준으로 하면 무릎은 뒤틀리듯이 회전하고, y축을 기준으로 하면 무릎에 좌우로 꺾이는 움직임을 보인다. 그리고 z축을 기준으로 잡으면 정상적인 앞뒤 움직임을 보이게 된다. 기준으로 잡고자 하는 축을 1으로 두고 나머지 축은 0을 입력하면 된다.

 

Swing Axis는 조인트가 회전하게될 2번째 축을 의미한다. 위의 Axis 프로퍼티와 관련해서 관절이 회전할 추가적인 축을 정의할 수 있게 도와준다.

 

 

다음 프로퍼티는 Twist Limit인데 이 값은 Axis 프로퍼티에서 정한 회전 축의 움직임 제한을 정하는 것이다. Low는 움직이는 각의 하한값을 정하는 것이고 High는 상한값을 정해주는 것이다. 무릎을 예시로 들자면 기본 값은 하한은 -80, 상한은 0으로 정해져 있는데 이것은 다음 이미지와 같은 움직임을 보인다.

 

 

캐릭터의 무릎이 정상적으로 꺾이면서 쓰러지는 것을 볼 수 있다.

 

 

다음은 상한과 하한을 모두 0으로 잡아보면 다리가 전혀 굽혀지지 않고 뻣뻣한 나무토막처럼 주춤거리다가 쓰러지는 모습을 보인다.

 

 

Twist Limit에 대한 마지막 설명으로 상한값만 90으로 잡으면 이번에는 다리가 비정상적인 각도로 꺾이면서 쓰러지는 캐릭터를 볼 수 있다.

 

 

다음은 Swing Limit 프로퍼티인데 1과 2가 따로 있다. 이 경우에 Swing 1은 Swing Axis에서 지정한 축을 의미하고 Swing 2는 그 나머지 축을 의미한다.

 

 

위의 gif 이미지를 보면 Swing 1의 limit를 90으로 지정했을 때와 Swing 2의 limit를 90으로 지정했을 때의 차이를 확인할 수 있다.

 

 

마지막으로 설명할 프로퍼티는 Break Force와 Break Torque이다. 이 프로퍼티들은 조인트의 연결이 파괴되기 위해 가해져야할 힘을 의미한다. 기본 값은 Infinity인데 이것은 얼마나 강한 힘이 가해지더라도 조인트의 연결이 파괴되지 않는 설정이다. 이 값을 설정해주면 설정한 값 이상의 힘이 가해지면 조인트의 연결이 끊어지게 된다. Force의 경우는 일반적인 힘이 가해지면 끊어지게 되고 Torque의 경우는 회전 힘이 가해지면 끊어지게 된다.

 

 

하지만 일반적인 캐릭터 모델의 경우에는 예시 이미지처럼 폴리곤이 엿가락처럼 늘어나는 부작용이 나타나기 때문에 일반적인 캐릭터에서는 Infinity 옵션을 사용하는 것을 권장한다. 이 프로퍼티를 사용하기 좋은 예시는 부위가 연결되지 않고 완벽하게 나눠진 골렘같은 캐릭터에 대해서 래그돌을 사용하고자 하는 것이다.

 

전체 프로퍼티에 대한 설명은 유니티 도큐먼트에서 확인할 수 있다.

 

https://docs.unity3d.com/kr/current/Manual/class-CharacterJoint.html

 

위에서 설명한 조인트 프로퍼티를 조절하는 것으로 래그돌의 움직임을 더욱 자연스럽게 변경할 수 있다.

 

 

예를 들자면 위의 이미지에서는 캐릭터의 무릎 움직임이 제한 값이 너무 작아서 주저앉는 모습이 부자연스러운 것을 깨달을 수 있다.

 

 

 

 

위에서도 보았듯이 무릎의 low twist limit가 -80인 것을 볼 수 있는데 이 값을 -150으로 수정해보자.

 

 

그러면 무릎의 굽혀짐이 좀더 자연스러운 것을 확인할 수 있을 것이다.

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

+ Recent posts