앨리스 리깅

11.10

본을 어디까지 얼마나 쓸 것인가? 는 늘 고민거리다. 어느 정도 틀이 잡힌 프로젝트라면 모를까, 처음 시작할 땐 적정수준이란 걸 가늠하기가 상당히 어렵다.

줄기를 늘릴까, 마디를 늘릴까

앞머리는 고정하는 편이 예쁘므로 마디가 없어도 될 줄 알았는데, 정작 해보니 생각보다 더 딱딱해 보인다.

대충 건드려본 결과물로도 분명한 차이가 있다.

그런데 앞머리의 움직임 패턴을 생각하면 또 마디가 없어도 될 것 같다.

11.17

기나긴 애드온 제작을 끝내고 다시 리깅작업으로. 그런데 이거 맞나? 싶다… 추가본만 100개가 넘는데…아무리 PC게임이라지만 게임 데이터가 이래도 되나…

어.. 진짜 이거 맞나? 벌써 어지러운데..

11.18

로폴 작업할 때까진 브러시 기능따위 왜 있는거야 생각했는데, 폴리곤이 많아지니 웨이팅 작업은 오히려 편하다. 인체공부를 안해뒀다면 꽤 괴로울 뻔 했다.

하지만… 그래도 쉽지 않다..

11.18

인내는 썼지만, 그 열매는 달았다. 잘 움직이는구나!

실전으로 들어가면 좀 더 사소한 것들이 발목을 잡는다. 이름지을 때 좌우첨자 고려를 안했더니 좌우반전이 안된다거나 하는 것들. 이게 왜 필요하냐면 블렌더는 좌우반전 본을 이름으로 구분한다. 이름에 .l이나 _l이 들어가 있다면 된다. 그리고 이게 없으면 본에 제약조건을 걸었을 때 본 심메트리가 안된다. 블렌더의 제약조건은 복붙이 안되는데, 심메트리를 이용해서 이를 해결할 수 있기 때문에 이 혜택(?)을 누리려면 본 이름 맨끝에 좌우첨자를 붙여주어야 한다.

추가로 실제로 이름을 지어보니 언더바를 많이 써서 넘버링 사이의 첨자를 쩜으로 고쳤다. 이는 옛날 개발자의 습성이기도 한데, 고대의 개발자들은 파일명에 공백이 없어야 한다는 오래된 규칙 때문에 빈칸을 기피하는 경향이 있다. (…) 비슷한 이유로 파일명을 숫자로 시작하지도 않는다. 뭐 지금은 둘 다 된다. 게다가 윈도우 파일명과 블렌더 내의 본 이름규칙과는 다르므로 사실 2개는 아무런 관계가 없다.

참고로 본의 이름에 쩜을 추가하면 언리얼에선 이를 언더바로 치환한다. 공백은 확인해보진 않았지만, 아마 치환당하지 않을까 싶다.

leg_helper를 왜 넣었는지 기억이 났다! Autorig Pro의 본 구조상 종아리의 본은 허벅지의 자식본이 아니다. 아마도 IK때문에 root에 연결되어 있는 것 같다. 때문에 종아리가 접힐 때 살이 눌려 양쪽으로 살집이 튀어나오는 처리를 하기 위해 넣은 bulge본의 드라이버를 위해 다리의 굽힘 정도를 알 수 있는 헬퍼본이 필요했었다.

리깅이 끝났어!이제 시작이다!

하지만 삽질이 또 한가득었기 때문에 다른 캐릭터의 리깅부터 진행해보는 게 좋겠다

11.20

리깅이 끝난 줄 알았는데, 포즈를 잡았을 때 다리의 본이 예쁘게 정렬되지 않는 문제가 있었다. 기존엔 트위스트본이 2관절이었는데, 본쓰는 김에 좀 더 쓰면 어떠리..싶어서 관절을 4개로 늘렸다. 결과는 대만족!이렇게 쉽게 해결될 녀석이었나! 다른 캐릭터의 리깅은 아직 진행전이니, 팔에도 적용해 놓는 편이 좋겠다.

레퍼런스 모델에서 얼굴을 수정했을 경우, 꽤나 많은 걸 수정해야 한다. 이걸 손으로 하면 시간이 너무 오래걸리기 때문에 스크립트가 필요하다. 각 드라이버를 돌면서 깨진 타겟을 다시 연결해주고, 머티리얼에 걸린 드라이버도 재정의된 셰이프키를 연결해준다. 드라이버에 접근하는 건 매우 까다롭다. 꼭꼭 숨어있기 때문이다. 짧은 코드지만, 이걸 쓰는데는 2시간이 걸렸다.

obj = bpy.context.object

for fcurve in obj.data.shape_keys.key_blocks.data.animation_data.drivers:
    for variables in fcurve.driver.variables:
        variables.targets[0].id = bpy.data.objects['Girl_rig']
        
obj.data.shape_keys.name = 'FaceKey'        
target_material_names = ['Face', 'Mouth', 'Eye']

for i, material in enumerate(obj.data.materials):
    for name in target_material_names:
        if name in material.name:
            mat = bpy.data.materials.get(name)
            obj.data.materials[i] = mat

            for fcurve in mat.node_tree.nodes.data.animation_data.drivers:
                for variables in fcurve.driver.variables:
                    if variables.targets[0].id_type == 'KEY':
                        variables.targets[0].id = obj.data.shape_keys  
                        
face_obj = bpy.data.objects.get('Face')

if face_obj:
    obj.location = face_obj.location    
    obj.name = 'Face'
    delete(face_obj)    

  

이제 얼굴의 모양을 고치면 그냥 들고 오면 된다.

11.21

카메라를 멀리서 볼 때 캐릭터의 인상이 약해서 아이셰도우를 추가했는데 성형키로 인해 아이셰도우의 모양이 눈매와 맞지 않는 문제가 있었다. 이를 위해선 얼굴의 셰이프키를 고쳐야 하고, 그걸 가져오면 부모관계 및 드라이버가 모두 깨진다. 위의 코드는 이를 쉽게 처리할 수 있는 스크립트가 필요했기 때문에 작성한 코드다. 이걸 손으로 하면 지금까지 했던 캐릭터들에게 모두 같은 일을 해주어야 하므로 족히 1시간은 걸릴 일이다. 실수도 잦다!

눈가장자리로 갈수록 눈썹이 붉어지는 건 잘못딸려오긴 했는데.. 그냥 예쁘므로 두기로 하자. 이전 프로젝트에서도 얼굴을 새로 업데이트하는 처리를 했었지만, 이 방법은 그 전보다 세련됐다. 왜 전엔 이렇게 하지 못했을까…

앨리스를 작업하며 했던 삽질을 또 다른 캐릭터에게도 적용했다. 데이터가 복잡하니 할 일도 많다.

오늘의 깨달음

ctrl+f2를 누르면 일괄 이름변경을 할 수 있다. 전에도 알고는 있었으나 사용법이 알기 어려워 안썼는데 특정 키워드를 지우거나 바꾸기엔 매우 좋다.

내일은 정말로 닐리 리깅에 들어가보도록 하자.

앨리스 리깅”의 8개의 생각

  1. 저는 버벅이면 고객 컴퓨터를 업글하라는 프로그래머로 자라고 말았습니다!!!
    요즘은 하드웨어가 워낙 잘 나오니까요! 어떻게 되지 않을까요!!!
    첫눈이 왔네요 내일은 애들이랑 눈오리를 만들 수 있을것 같아요! 이즈님도 아라님도 즐거운 겨울 보내세요!!

    1. 그럼요. 원래 최적화는 유저가 하는 것 아닙니까!
      첫눈이 오긴 왔다는데 전 못봤어요. 인정할 수 없는 첫눈이로군요. 함박눈을 기다려봅니다. 메리 크리스마스!

      1. 오셨군요. 괜찮아요. 새삼스러울 것도 없기 때문에 용사할 것도 없었습니다.

PEST님에게 덧글 달기 응답 취소