주의 : 다른 방법으로도 만들 수 있으니 이 자료를 맹신하지 마시기 바랍니다.

주의 : 공부하면서 정리한 것이기 때문에 잘못된 내용이 있을 수 있습니다.

주의 : Max 2013 과 2015 에서 테스트했습니다.

주의 : 맥스 스크립트는 이번에 처음 만들어 봅니다. 이상한 부분이 있을 수 있으니 양해 부탁드리고 문제점이 있으면 지적해 주십시오.


개요



언리얼의 [ 루트 모션 ]은 "Root" 라는 이름을 가진 본이 스켈레톤 구조의 최상위에 위치할 것을 요구합니다. 


그런데 우리 나라의 경우에는 Biped 만을 사용하기 때문에 최상위 본은 항상 "Bip01" 입니다. 애니메이터에게 물어 봤더니 Biped layer 같은 것을 사용하려면 Bip01 본 상위에 뭔가 붙여서는 안 된다고 하더군요. 


외국물 좀 먹은 다른 애니메이터에게 물어 봤더니 쉐도우 리깅이나 스크립트를 사용해서 루트 모션을 만들어 낸다고 합니다. 그리고 그 애니메이터의 경우에는 Biped 를 사용하지 않아도 애니메이션 만들 방법은 많기 때문에 굳이 그런 고민을 안 한다고 합니다( 그리고 마야를 많이 쓴다고 하더군요 ).


애니메이터가 Biped 에서 루트 모션을 만드는 과정을 관찰했더니 이건 완전히 생노가다였습니다. 그런데 우리나라 애니메이터들은 Biped 이외에는 사용할 생각이 없기 때문에, 이를 맥스스크립트로 자동화시켜야겠다는 생각을 했습니다.


맥스 스크립트



루트 모션을 만드는 것을 관찰했더니 순서는 [ 다음 ] 과 같았습니다( 링크의 문서는 우리 회사 캐릭터 팀장이 작성했습니다. 물론 위에서 언급했듯이 이게 루트 모션을 만드는 유일한 방법은 아닙니다  ).


저는 그 과정을 보고 최종적으로 "Root 본이 Bip01 의 TM 을 따라 가고, 반대로 Bip01 은 Root 본에 종속되어 상대적인 TM 을 가지면 된다" 라는 결론을 내렸습니다. 그래서 다음과 같은 알고리즘을 세웠습니다.


  1. 제거할 축 입력받음.
  2. "Root" 본 생성.
  3. "Bip01" 본 획득.
  4. Root 본에 Position_XYZ 컨트롤러 바인딩하고 프레임 개수만큼 키를 생성.
  5. Bip01 을 따라 가는 Position_Constraint 컨트롤러 "tempController" 생성.
  6. 전체 프레임을 돌면서 "tempController" 값을 Root 본에 복사함( Bip01 을 복사하는 것과 동일함 ).
  7. Biped 에 "RootMotionLayer" 레이어를 생성하고 현재 레이어로 설정함.
  8. 새로운 레이어의 position 컨트롤러를 획득해서 전체 프레임 개수만큼 키를 생성.
  9. 새로운 레이어의 키의 position 에 "tempController" 컨트롤러에서 특정 축값을 제거한 값을 삽입.
  10. Root 본을 Bip01 의 부모로 설정.
  11. FBX 로 익스포트( 수동 ).
  12. 익스포트 후에 "RootMotionLayer" 레이어 및 "Root" 본 제거( 수동 ).


5 ~ 10 작업은 Bip01 이 Root 에 대해 상대적인 TM 을 가지도록 블렌딩해 주는 작업입니다. 제가 Biped 에 대해서 잘 모르기 때문에 자세한 것은 설명해 드리기 힘들고, 궁금한 것은 자기 팀 애니메이터에게 문의하시면 될 것 같습니다. 



스크립트는 다음과 같습니다. 수정 : Biped Root 의 이름을 입력받을 수 있게 했습니다. 수정 : minZ 와 maxZ 를 입력받을 수 있게 했습니다. 수정 : 바닥이 될 본을 설정할 수 있게 했습니다. 이는 RemoveZ 가 꺼졌을 때만 활성화됩니다.



한계 및 할 일들



애니메이터의 이야기를 들어 보니 점프를 하거나 비대칭적인 캐릭터( 예를 들어 기린? )를 작업할 때는 직접 Dummy 를 만들어서 컨트롤러의 위치를 지정한다고 합니다. 그러므로 그런 경우에는 Root 본이 Bip01 이 아니라 Dummy 를 따라 가도록 만들어야 할 것입니다. 다이얼로그에 그런 옵션들을 추가로 넣고 코드를 수정할 수 있을 것 같습니다. 


그리고 알고리즘의 11 번이나 12 번을 자동화할 필요도 있을 것 같습니다. 아니면 차라리 새로운 파일을 자동으로 만들어서 거기에서 작업이 수행되도록 할 수도 있겠죠.


그리고 현재 스크립트는 항상 position 만을 처리하고 있는데, rotation 이나 scaling 을 처리해야 할 수도 있습니다.


수정 : 그리고 공중회전같은 것을 하면 현재 스크립트의 결과물은 이상해질 것입니다. 이럴 경우에는 다른 방법을 찾아야 합니다.


기회가 되면 루트 모션을 만드는 여러 가지 방법들에 대해서 연구해 봐야할 것 같습니다.

  1. 익명 2015.12.09 14:59

    비밀댓글입니다

    • lifeisforu 2015.12.09 18:33 신고

      Biped 의 RootBone 이름을 text 로 입력받을 수 있도록 했습니다.

    • lifeisforu 2015.12.09 18:34 신고

      RemoveZ 의 체크박스를 해제하시면 될 겁니다. 그러면 Z 축으로의 이동값이 보존됩니다.

    • lifeisforu 2015.12.09 18:45 신고

      "Bip001" 을 기본값으로 만들고 싶다면,

      edittext bipedRootName "Biped Root : " text:"Bip01"

      의 마지막 부분에서 "Bip01" 을 "Bip001" 로 변경하시면 됩니다.

  2. 익명 2015.12.09 20:05

    비밀댓글입니다

    • lifeisforu 2015.12.10 12:09 신고

      바닥용 Biped Bone 을 지정하는 기능을 추가했습니다. MovementMode 가 flying 이어야만 제대로 컨트롤러가 따라 올라 가는 것을 확인하실 수 있을 겁니다.

    • lifeisforu 2015.12.10 12:14 신고

      그런데, 점프하면서 웅크렸을 때, 컨트롤러의 높이를 지정하는 것은 cpp 나 블루프린트로 제어하셔야 할 것 같네요.

  3. 익명 2017.03.19 20:01

    비밀댓글입니다

    • lifeisforu 2017.04.01 16:12 신고

      오랫만에 들와서 답변이 늦었네요. 자리에
      맥스가 안 깔려 있어서 모르겠지만, rotation.controller.value 에 접근하시면 될 겁니다.

  4. 빠광 2019.06.09 19:40

    덕분에 살았습니다 정말 감사합니다 ㅠㅠㅠ

  5. qwer 2020.04.16 20:48

    위의 스크립트를 맥스에서 어떻게 실행하나요?

    • lifeisforu 2021.06.27 17:42 신고

      https://knowledge.autodesk.com/ko/support/3ds-max/learn-explore/caas/CloudHelp/cloudhelp/2020/KOR/3DSMax-Basics/files/GUID-9AE37152-B6D3-473E-9490-DFFC62BDB005-htm.html

  6. blusalmon 2021.06.25 11:06

    혹시 제자리 회전같은 회전 루트모션이 필요한경우 모든 포지션 텍스트를 로테이션이나 오일러, 오리엔테이션 으로 바꿔주면 해결이 될까요?

    • lifeisforu 2021.06.27 17:47 신고

      그걸 루트모션이라고 할 수 있을지 의문입니다. 일반적으로 루트 모션이 아닌 제자리 애니메이션을 만들 때는 애니메이터가 이동 성분의 키를 제거함으로써 만드는 것으로 알고 있습니다. 혹시 이동 성분 키를 제거하는 스크립트가 필요한 거라면 높이 값을 제외한 이동성분을 모두 0 으로 만드시면 될 것 같습니다.

  7. Jitaik Lim 2022.03.08 08:55

    안녕하세요 덕분에 맥스에서 루트 모션 생성을 편하게 하고 있었는데 얼마전 컴퓨터 교체 후에 스크립트가 작동이 잘 안되네요. 제 기억으론 해당 스크립트 전체를 노트패드 같은 곳에 붙여넣기 한후 bip01 부분을 bip001 로 바꾸고.ms로 확장자만 변경해서 썼던거 같은데 지금은 그렇게 하니깐 'MAXScript FileIn Exception' 에러 박스가 생성되네요... 혹시 제가 기억 하는 방법이 잘못된 방법 인가요? 늦었지만 덕분에 작업 정말 편하게 했습니다. 감사합니다.

    • lifeisforu 2022.03.10 00:13 신고

      저도 이 글 쓴 이후에 맥스 플러그인을 작성해 본 적이 없고 정확한 에러가 뭔지 몰라서 무슨 문제인지는 잘 모르겠네요. 도움이 못 돼서 죄송합니다. 맥스를 관리자 권한으로 실행해 보시거나, 파일 경로가 맞는 지 검증해 보시거나, 맥스 버전을 확인해 보시거나 하는 게 좋을 것 같네요. 어쨌든 좋은 결과가 있었으면 좋겠네요.

  8. Jitaik Lim 2022.03.10 02:59

    아휴 아니예요. 이 플러그인 덕분에 지금까지 잘 사용했었거든요. 저한테는 정말 보석같은 스크립트 입니다. 말씀 해 주신 방법으로 한번 시도해 볼게요.
    오래전에 작성 된 문서 임에도 답변 주셔서 감사합니다.
    -수정 말씀 해주신 대로 관리자 권한으로 실행하니깐 예전 처럼 적용이 잘 됐습니다!!! 정말 감사합니다 :)

+ Recent posts