Super Kawaii Cute Cat Kaoani blender에서 한 model의 facial motion을 다른 model에 적용하기

연구/컴퓨터 그래픽스

blender에서 한 model의 facial motion을 다른 model에 적용하기

치킨고양이짱아 2023. 6. 26. 16:33
728x90
728x90

default fbx model에 저장되어있는 facial motion data를 custom fbx model에 적용하는 과정을 담아보았다.

나만 볼 것 같고..내가 기억 안날까봐 정리하는거니까 친절하게 서술하지 않을거다!

* 상황 정리

default fbx model의 face mesh의 shape keys는 총 53개이고, 그 중 사용하는 shape keys는 39개였다.

custom fbx model의 face mesh의 shape keys는 약 70개 정도였고, 여기에 default fbx model이 사용하는 39개의 shape keys는 모두 포함되어있다.

facial motion data가 담겨있는 fcurves의 default fbx model과 custom fbx model 모두 39개였지만 매칭되는 shape keys의 순서가 달랐다. fcuves의 경우엔 shape keys의 이름으로 접근하는 것도 불가능해서 모델을 일일히 수정해줘야하나 골치아팠지만...

keyframe_insert라는 방법을 통해 facial motion data를 하나하나씩 삽입하는 방법을 알아내어 해결할 수 있었다.

* 코드

import os
import sys
import bpy

scene = bpy.context.scene

key_blendshape_list = ["mouthLeft", "mouthRight", "mouthSmileLeft", "mouthSmileRight", "mouthDimpleLeft", "mouthDimpleRight", "mouthStretchLeft", "mouthStretchRight", "mouthFrownLeft", "mouthFrownRight", "mouthPressLeft", "mouthPressRight", "mouthPucker", "mouthFunnel", "mouthUpperUpLeft", "mouthUpperUpRight", "mouthLowerDownLeft", "mouthLowerDownRight", "mouthShrugUpper", "mouthShrugLower", "mouthRollUpper", "mouthRollLower", "cheekPuff", "cheekSquintLeft", "cheekSquintRight", "jawOpen", "jawLeft", "jawRight", "jawForward", "browInnerUp", "browOuterUpLeft", "browOuterUpRight", "browDownLeft", "browDownRight", "noseSneerLeft", "noseSneerRight", "mouthClose", "eyeBlinkLeft", "eyeBlinkRight"]

mesh_custom = bpy.data.meshes["mesh_custom"]
mesh_default = bpy.data.meshes["mesh_default"]

frame_range = bpy.data.shape_keys["key_default"].animation_data.action.frame_range

for index in range(int(frame_range[0]), int(frame_range[1])+1):
    scene.frame_set(index)

    for key_blendshape in key_blendshape_list:
        mesh_custom.shape_keys.key_blocks[key_blendshape].value = mesh_default.shape_keys.key_blocks[key_blendshape].value
        bpy.data.shape_keys["key_custom"].key_blocks[key_blendshape].keyframe_insert(data_path= "value", frame=index)

일단 default model에서 사용하는 shape_key 39개를 key_blendshape_list에 저장해주었다.

(fcuves가 아닌 mesh object에서 접근할 때는 shape key 이름을 사용해서 접근할 수 있으므로 이름을 저장해준것이다. 이름을 사용해서 접근하는 방법은?! mesh.shape_keys.key_blocks["shape key 이름"])

그리고 해당되는 scene의 default character 정보에 접근해야하니까 scene의 frame을 바꿔주고, 39개의 blendshape 값을 custom model에 각각 세팅해주면서 keyframe_insert 함수를 통해 custom model의 facial animation data를 세팅해주면 된다.

728x90
728x90