diff --git a/Makefile b/Makefile index 774afc7..7121222 100644 --- a/Makefile +++ b/Makefile @@ -1,113 +1,12 @@ -JSON_ALL = \ -'{ \ - "userId": "lavid", \ - "sinal": "Modelo JSON", \ - "interpolacao": "lento|normal|rapido", \ - "movimentos": [ \ - { \ - "facial": { \ - "expressao": 0..21, \ - "transicao": "lento|normal|rapido", \ - "duracao": "lento|normal|rapido" \ - }, \ - "mao_esquerda": { \ - "circular": { \ - "plano": "frente-esquerda|frente-cima|esquerda-cima", \ - "raio": "pequeno|medio|grande", \ - "velocidade": "lento|normal|rapido", \ - "lado_oposto": true|false, \ - "sentido_inverso": true|false, \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "semicircular": { \ - "plano": "frente-esquerda|frente-cima|esquerda-cima", \ - "raio": "pequeno|medio|grande", \ - "lado_oposto": true|false, \ - "sentido_inverso": true|false, \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "contato": { \ - "alisar": { \ - "movimento_orientacao": "perpendicular|paralelo|diagonal-direita|diagonal-esquerda", \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "cocar": { \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "tocar": { \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "riscar": { \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - } \ - }, \ - "espiral": { \ - "plano": "frente-esquerda|frente-cima|esquerda-cima", \ - "raio": "pequeno|medio|grande", \ - "lado_oposto": true|false, \ - "sentido_inverso": true|false, \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "helicoidal": { \ - "plano": "frente-esquerda|frente-cima|esquerda-cima", \ - "raio": "pequeno|medio|grande", \ - "lado_oposto": true|false, \ - "sentido_inverso": true|false, \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "pontual": { \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "retilineo": { \ - "velocidade": "lento|normal|rapido", \ - "articulacao_inicial": 0..124, \ - "articulacao_final": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - }, \ - "senoidal": { \ - "direcao": "frente|esquerda|cima", \ - "direcao_oposta": true|false, \ - "eixo_fixo": "frente-tras|esquerda-direita|cima-baixo", \ - "comprimento_onda": "pequeno|medio|grande", \ - "articulacao": 0..124, \ - "configuracao": 0..60, \ - "orientacao": 0..142 \ - } \ - }, \ - "mao_direita": { \ - } \ - } \ - ] \ -}' - JSON = \ '{ \ "userId": "lavid", \ - "sinal": "Modelo JSON 2", \ + "sinal": "Modelo JSON", \ "interpolacao": "normal", \ "movimentos": [ \ { \ "facial": { \ - "expressao": 20, \ + "expressao": 10, \ "transicao": "normal", \ "duracao": "normal" \ }, \ @@ -128,7 +27,7 @@ JSON = \ }, \ { \ "facial": { \ - "expressao": 21, \ + "expressao": 11, \ "transicao": "normal", \ "duracao": "normal" \ }, \ diff --git a/__init__.py b/__init__.py index eb72ed6..c831da7 100644 --- a/__init__.py +++ b/__init__.py @@ -2,6 +2,8 @@ __all__ = ( "bmesh_collision" "controller", + "decode", + "facial", "libras", "moves", "pyutil", diff --git a/decode.py b/decode.py index 13b28da..dcb1ab6 100644 --- a/decode.py +++ b/decode.py @@ -1,3 +1,4 @@ +import bpy import moves import util @@ -29,18 +30,30 @@ def circular_semicircular(js_movement, current_frame, frame_jump, is_right_hand, ik = bpy.context.object.pose.bones['ik_FK.R'] else: ik = bpy.context.object.pose.bones['ik_FK.L'] - current_frame = insert_keyframe_pose_default(current_frame, frame_jump, [ik], ['location']) - current_frame = moves.circular(ik, current_frame + frame_jump, ray, period, x, y, js_movement['lado_oposto'], js_movement['sentido_inverso'], is_semicircular) + #current_frame = insert_keyframe_pose_default(current_frame, [ik], ['location']) + current_frame = moves.circular(ik, current_frame, ray, period, x, y, js_movement['lado_oposto'], js_movement['sentido_inverso'], is_semicircular) return current_frame def contato(js_movement, current_frame, frame_jump, is_right_hand): sub_type = next(iter(js_movement.keys())) - mov_param = js_movement[sub_type] + mov_param = js_movement[sub_type] action = util.right_hand_actions if is_right_hand else util.left_hand_actions bones = util.rightBonesConf if is_right_hand else util.leftBonesConf current_frame = current_frame + 2*frame_jump return moves.contato(action, sub_type, mov_param, bones, current_frame, frame_jump) +def espiral(js_movement, current_frame, frame_jump, is_right_hand): + pass + +def redemoinho(js_movement, current_frame, frame_jump, is_right_hand): + pass + +def pontual(js_movement, current_frame, frame_jump, is_right_hand): + pass + +def senoidal(js_movement, current_frame, frame_jump, is_right_hand): + pass + def hand_mov(current_frame, frame_jump, js_mao, is_right_hand): if (js_mao == {}): return @@ -51,4 +64,12 @@ def hand_mov(current_frame, frame_jump, js_mao, is_right_hand): current_frame = circular_semicircular(js_mao[movement_name], current_frame, frame_jump, is_right_hand, True) elif (movement_name == 'contato'): current_frame = contato(js_mao[movement_name], current_frame, frame_jump, is_right_hand) - return current_frame + frame_jump \ No newline at end of file + elif (movement_name == 'espiral'): + current_frame = espiral(js_mao[movement_name], current_frame, frame_jump, is_right_hand) + elif (movement_name == 'redemoinho'): + current_frame = redemoinho(js_mao[movement_name], current_frame, frame_jump, is_right_hand) + elif (movement_name == 'pontual'): + current_frame = pontual(js_mao[movement_name], current_frame, frame_jump, is_right_hand) + elif (movement_name == 'senoidal'): + current_frame = senoidal(js_mao[movement_name], current_frame, frame_jump, is_right_hand) + return current_frame + frame_jump diff --git a/facial.py b/facial.py index 3172c7c..6ef2916 100644 --- a/facial.py +++ b/facial.py @@ -5,13 +5,16 @@ import util # duracao na posicao selecionada dict_duration = { + 'inicial': 20, 'lento': 15, 'normal': 10, - 'rapido': 5 + 'rapido': 5, + 'final': 20, } # tempo de entrada e saida na posicao selecionada dict_transition = { + 'inicial': 0, 'lento': 15, 'normal': 10, 'rapido': 5 @@ -59,7 +62,7 @@ def apply_pose(index = 0, pose_library = list(bpy.data.actions)): return # consolida o movimento (faz insercao dos keyframes) e incrementa a timeline -def set_expression(timeline_facial, index, frame_duration = dict_duration['normal'], frame_transition = 0): +def set_expression(timeline_facial, index, frame_duration = dict_duration['normal'], frame_transition = dict_transition['inicial']): library_name = util.facial_expression_id bones_facial = util.dict_bones[library_name] util.select_bones(bones_facial) @@ -80,7 +83,7 @@ def decode_expression(timeline_facial, js_facial, initial_interpolation = dict_d global dict_transition index = js_facial['expressao'] frame_duration = dict_duration[js_facial['duracao']] - frame_transition = dict_duration[js_facial['transicao']] + frame_transition = dict_transition[js_facial['transicao']] # insere o primeiro keyframe if (timeline_facial == 0): set_expression(timeline_facial, 0, initial_interpolation) @@ -91,25 +94,21 @@ def decode_expression(timeline_facial, js_facial, initial_interpolation = dict_d """ # unit test def main(): - import random interpolation_start = 20 interpolation_end = 20 + timeline_facial = 0 pose_max_range = round(bpy.data.actions[library_name].frame_range[1]) - util.delete_all_keyframes() - apply_pose(0, library_name) - - js_facial = {"expressao": random.randint(0, pose_max_range), "transicao": 'normal', "duracao": 'normal'} - print('facial expression %d current frame:' % (js_facial['expressao']), decode_expression(js_facial)) - - js_facial = {"expressao": random.randint(0, pose_max_range), "transicao": 'normal', "duracao": 'normal'} - print('facial expression %d current frame:' % (js_facial['expressao']), decode_expression(js_facial)) - - #for i in range(0, pose_max_range + 1): - # js_facial = {"expressao": i, "transicao": 'normal', "duracao": 'normal'} - # print('facial expression %d current frame:' % (js_facial['expressao']), decode_expression(js_facial)) - - bpy.context.scene.frame_end = timeline_facial + interpolation_end + apply_pose(0, util.facial_expression_id) + for i in range(0, pose_max_range + 1): + js_facial = { + "expressao": i, # random.randint(0, pose_max_range), + "transicao": 'normal', + "duracao": 'normal' + } + timeline_facial = decode_expression(timeline_facial, js_facial, dict_duration['inicial']) + print('facial expression %d current frame:' % (js_facial['expressao']), timeline_facial) + bpy.context.scene.frame_end = timeline_facial + dict_duration['final'] bpy.ops.screen.animation_play(reverse = False) if __name__ == "__main__": diff --git a/libras.py b/libras.py index 0e34502..c2ac790 100644 --- a/libras.py +++ b/libras.py @@ -30,7 +30,7 @@ dict_interpolation = { 'final': 20 } -def insert_keyframe_pose_default(current_frame = 0, frame_jump = 0, pose_bones = bpy.context.object.pose.bones, types_keyframe = ['location', 'rotation_quaternion']): +def insert_keyframe_pose_default(current_frame = 0, pose_bones = bpy.context.object.pose.bones, types_keyframe = ['location', 'rotation_quaternion']): for obj in (pose_bones): obj.bone.select = True for type_keyframe in types_keyframe: @@ -39,15 +39,15 @@ def insert_keyframe_pose_default(current_frame = 0, frame_jump = 0, pose_bones = return current_frame def pose_default(current_frame = 0, frame_jump = 0, actions = bpy.data.actions): - result = current_frame for action in actions: if (action.use_fake_user): bpy.context.object.pose_library = action bpy.ops.poselib.apply_pose(pose_index = 0) - result = insert_keyframe_pose_default(current_frame, frame_jump) - return result + frame_jump + insert_keyframe_pose_default(current_frame) + return current_frame + frame_jump def main(): + util.set_pose_mode() util.delete_all_keyframes() util.configure_output() bpy.context.scene.animation_data_create() @@ -57,7 +57,7 @@ def main(): js_movimentos = js_input['movimentos'] frame_jump = dict_interpolation[js_input['interpolacao']] - endFrame = pose_default(0) + endFrame = pose_default(0, frame_jump) timeline_mao_esquerda = 0 timeline_mao_direita = 0 timeline_facial = 0 @@ -105,7 +105,9 @@ def main(): endFrame += frame_jump # setar pose padrao final em todos os bones (location e rotation) - endFrame += pose_default(endFrame + dict_interpolation['final']) + endFrame = pose_default(endFrame, frame_jump) + endFrame += dict_interpolation['final'] + util.render_sign(js_input["userId"], js_input["sinal"], endFrame) except: diff --git a/param.json b/param.json index e9d0219..da7ffed 100644 --- a/param.json +++ b/param.json @@ -1,108 +1,102 @@ { "userId": "lavid", - "nome_sinal": "Modelo JSON", - "velocidade_interpolacao": "lento|normal|rapido", + "sinal": "Modelo JSON", + "interpolacao": "lento|normal|rapido", "movimentos": [ { "facial": { - "expressao": 21, + "expressao": 0..21, + "transicao": "lento|normal|rapido", "duracao": "lento|normal|rapido" }, "mao_esquerda": { - "movimento": "semicircular", "circular": { "plano": "frente-esquerda|frente-cima|esquerda-cima", "raio": "pequeno|medio|grande", "velocidade": "lento|normal|rapido", - "lado_oposto": false, - "sentido_inverso": false, - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "lado_oposto": true|false, + "sentido_inverso": true|false, + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "semicircular": { "plano": "frente-esquerda|frente-cima|esquerda-cima", "raio": "pequeno|medio|grande", - "velocidade": "lento|normal|rapido", - "lado_oposto": false, - "sentido_inverso": false, - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "lado_oposto": true|false, + "sentido_inverso": true|false, + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "contato": { "alisar": { "movimento_orientacao": "perpendicular|paralelo|diagonal-direita|diagonal-esquerda", - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "cocar": { - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "tocar": { - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "riscar": { - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 } }, - "contato_sugestao": { - "tipo": "cocar|riscar|tocar", - "mov_orientacao": "perpendicular|paralelo|diagonal-direita|diagonal-esquerda", - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 - }, "espiral": { "plano": "frente-esquerda|frente-cima|esquerda-cima", "raio": "pequeno|medio|grande", - "lado_oposto": false, - "sentido_inverso": false, - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "lado_oposto": true|false, + "sentido_inverso": true|false, + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "helicoidal": { "plano": "frente-esquerda|frente-cima|esquerda-cima", "raio": "pequeno|medio|grande", - "lado_oposto": false, - "sentido_inverso": false, - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "lado_oposto": true|false, + "sentido_inverso": true|false, + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "pontual": { - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "transicao": "lento|normal|rapido", + "duracao": "lento|normal|rapido" + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "retilineo": { - "articulacao_inicial": 124, - "articulacao_final": 124, - "configuracao": 129, - "orientacao": 142 + "transicao": "lento|normal|rapido", + "duracao": "lento|normal|rapido", + "articulacao_inicial": 0..124, + "articulacao_final": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 }, "senoidal": { "direcao": "frente|esquerda|cima", - "direcao_oposta": false, + "direcao_oposta": true|false, "eixo_fixo": "frente-tras|esquerda-direita|cima-baixo", "comprimento_onda": "pequeno|medio|grande", - "articulacao": 124, - "configuracao": 129, - "orientacao": 142 + "articulacao": 0..124, + "configuracao": 0..59, + "orientacao": 0..142 } }, "mao_direita": { } - }, - { } ] } diff --git a/util.py b/util.py index 937ab5b..1a36f5c 100644 --- a/util.py +++ b/util.py @@ -2,10 +2,10 @@ import bpy import math -import pyutil import os import sys import copy +import pyutil from bmesh_collision import bmesh_check_intersect_objects armature = bpy.context.scene.objects.get('Armature.001') @@ -71,10 +71,12 @@ def deselect_bones(bones = bpy.context.object.pose.bones): pose_bone.bone.select = False return -def delete_all_keyframes(): +def set_pose_mode(): bpy.ops.object.mode_set(mode = 'OBJECT') bpy.ops.object.select_all(action = "DESELECT") bpy.ops.object.mode_set(mode = 'POSE') + +def delete_all_keyframes(): bpy.context.active_object.animation_data_clear() for obj in bpy.data.objects: obj.animation_data_clear() @@ -116,7 +118,7 @@ def resetIKPosition(isRightHand): def resetBnMaoPosition(isRightHand): armature.pose_library = bpy.data.actions[orient_direita_id if isRightHand else orient_esquerda_id] bpy.ops.poselib.apply_pose(pose_index = 0) - + def get_bone_data_from_frame(bone, positionFrame, path): scene = bpy.context.scene frame_current = scene.frame_current @@ -164,7 +166,7 @@ def check_collision(objName, otherObjName, initFrame, endFrame): frame_current = scene.frame_current startFrame = initFrame + int(math.fabs((endFrame - initFrame)/2)) collisionFrame = -1 - + for i in range(startFrame, endFrame + 1, 1): scene.frame_set(i) obj = scene.objects.get(objName) -- libgit2 0.21.2