Commit 1880bcdf9d16e473e4adf502d2311b8cdf6bfd77

Authored by Adabriand Furtado
1 parent a9d95fa4
Exists in master

Adicionado o movimento Coçar (mão direita)

Showing 3 changed files with 85 additions and 61 deletions   Show diff stats
libras.py
... ... @@ -28,45 +28,23 @@ except Exception:
28 28 # ajusta as configurações de renderização
29 29 util.outconf()
30 30  
31   -# define a posição dos keyframes
32   -hands_default_frames = [15, 18]
33   -
34   -# define a posição dos keyframes
35   -hands_frames_retilineo = [30, 33]
36   -
37   -# Carrega o objeto presente no avatar
38   -armature = bpy.context.scene.objects.get('Armature.001')
39   -
40 31 # Cria uma Action
41 32 act = bpy.context.scene.animation_data_create()
42 33  
43   -# Função responsável por selecionar as pose-libs e setar os frames
44   -def setPose(actions, parametesConf, positionFrames, bones):
45   - bpy.ops.object.mode_set(mode = 'OBJECT')
46   - bpy.ops.object.select_all(action="DESELECT")
47   - bpy.ops.object.mode_set(mode = 'POSE')
48   - for l in range(len(actions)):
49   - armature.pose_library = bpy.data.actions[actions[l]]
50   - for x in range(len(positionFrames)):
51   - bpy.ops.poselib.apply_pose(pose_index = parametesConf[l])
52   - for i in range(0, (len(bones))):
53   - armature.pose.bones[bones[i]].keyframe_insert(data_path = 'location', index = -1, frame = positionFrames[x])
54   - armature.pose.bones[bones[i]].keyframe_insert(data_path = 'rotation_quaternion', index = -1, frame = positionFrames[x])
55   -
56 34 # Função responsável por setar pose padrão
57 35 def poseDefault(positionFrames, bones):
58   - setPose([0], [0], positionFrames, bones)
  36 + util.setPose([0], [0], positionFrames, bones)
59 37  
60 38 # Função responsável por setar as configurações das mãos
61 39 def setHandConfiguration(actions, handParam, positionFrames, bones):
62   - setPose(actions, handParam, positionFrames, bones)
  40 + util.setPose(actions, handParam, positionFrames, bones)
63 41  
64 42 # Função responsável por setar a configuração da face
65 43 def setFaceConfiguration(handParam, positionFrames, bones):
66   - setPose([7], handParam, positionFrames, bones)
  44 + util.setPose([7], handParam, positionFrames, bones)
67 45  
68 46 # Sugestao: Alguma forma de uniformizar o calculo do endFrame (atualizado aqui e no movimento circular)
69   -initialFrame, endFrame = 15, util.get_endFrame(json_input, hands_frames_retilineo)
  47 +initialFrame, endFrame = 15, util.get_endFrame(json_input, util.hands_frames_retilineo)
70 48  
71 49 #------------------ Configurações------------------------------
72 50  
... ... @@ -74,37 +52,33 @@ initialFrame, endFrame = 15, util.get_endFrame(json_input, hands_frames_retiline
74 52 def configureHands():
75 53 # Array com valores dos campos que serão passados pelo JSON
76 54 hands = ["rightHand", "leftHand"]
77   - iks = ['ik_FK.R', 'ik_FK.L']
  55 + iks = ["ik_FK.R", "ik_FK.L"]
78 56 bones_ = [util.rightBonesConf, util.leftBonesConf]
79 57 #Array com as actions FAKES que seram selecionadas no Blender para cada lado do corpo
80   - actions = [[1, 3, 5], [2, 4, 6]]
  58 + actions = [[0, 2, 4], [1, 3, 5]]
81 59 global endFrame
82 60 for i in range(len(hands)):
83 61 if(json_input[hands[i]] != []):
84 62 move = json_input[hands[i]][0]
85   - pose = armature.pose.bones[iks[i]]
  63 + pose = util.armature.pose.bones[iks[i]]
86 64 handParam = json_input[hands[i]][-3:]
87 65  
88   - if(move == "pontual"):
89   - setHandConfiguration(actions[i], handParam, hands_default_frames, bones_[i])
90   - else:
91   - setHandConfiguration(actions[i], handParam, hands_default_frames, bones_[i])
92   -
93   - if(move == "circular" or move == "semicircular"):
94   - orientation, direction, radius, laps = json_input[hands[i]][1:5]
95   - endFrame = moves.circular_or_semiCircular(pose, orientation, direction, radius, laps, 5)
96   - setHandConfiguration(actions[i], handParam, [endFrame], bones_[i])
97   - elif(move == "retilineo"):
98   - setHandConfiguration(actions[i], json_input[hands[i]][-6:-3], hands_default_frames, bones_[i])
99   - setHandConfiguration(actions[i], handParam, hands_frames_retilineo, bones_[i])
100   - elif(move == "senoidal"):
101   - orientation, direction, radius, laps = json_input[hands[i]][1:5]
102   - endFrame = circular_or_semiCircular(pose, orientation, direction, radius, laps, 5)
103   - setHandConfiguration(actions[i], handParam, [endFrame], bones_[i])
104   - elif(move == "contato"):
105   - contact_type, orientation, repetition = json_input[hands[i]][1:4]
106   - endFrame = moves.contato(pose, contact_type, orientation, repetition)
107   - setHandConfiguration(actions[i], handParam, [endFrame], bones_[i])
  66 + if(move in ["pontual, circular, semicircular, retilineo, senoidal"]):
  67 + setHandConfiguration(actions[i], handParam, util.hands_default_frames, bones_[i])
  68 +
  69 + if(move in ["circular", "semicircular"]):
  70 + orientation, direction, radius, laps = json_input[hands[i]][1:5]
  71 + endFrame = moves.circular_or_semiCircular(pose, orientation, direction, radius, laps, 5)
  72 + setHandConfiguration(actions[i], handParam, [endFrame], bones_[i])
  73 + elif(move == "retilineo"):
  74 + setHandConfiguration(actions[i], json_input[hands[i]][-6:-3], util.hands_default_frames, bones_[i])
  75 + setHandConfiguration(actions[i], handParam, util.hands_frames_retilineo, bones_[i])
  76 + elif(move == "senoidal"):
  77 + orientation, direction, radius, laps = json_input[hands[i]][1:5]
  78 + endFrame = circular_or_semiCircular(pose, orientation, direction, radius, laps, 5)
  79 + setHandConfiguration(actions[i], handParam, [endFrame], bones_[i])
  80 + elif(move == "contato"):
  81 + endFrame = moves.contato(actions[i], json_input[hands[i]], bones_[i], pose)
108 82  
109 83 # Função que inicia a configuração da face
110 84 def configureFace():
... ...
moves.py
1 1 # -*- coding: UTF-8 -*-
2 2  
  3 +import bpy
3 4 import math
  5 +import util
  6 +from pyutil import log
4 7  
5   -def contato(pose, contact_type, orientation, repetition, frameJump = 10, initialFrame = 18, width = 0.25):
  8 +def contato(action, input_hand, bones, pose, initialFrame = 18, frameJump = 10):
6 9 currentFrame = initialFrame
  10 + contact_type = input_hand[1]
  11 +
7 12 if (contact_type == "alisar"):
8   - currentFrame = alisar(pose, orientation, repetition, frameJump, initialFrame, width)
  13 + currentFrame = alisar(action, input_hand, pose, bones, initialFrame, frameJump)
  14 + elif (contact_type == "cocar"):
  15 + currentFrame = cocar(action, input_hand, bones, initialFrame)
9 16 return currentFrame
10 17  
11   -def alisar(pose, orientation, repetition, frameJump = 10, initialFrame = 18, width = 0.25):
  18 +def cocar(action, input_hand, bones, initialFrame = 18, repetition = 2, frameJump = 6):
12 19 currentFrame = initialFrame
  20 + action[0] = util.movimento_mao_action_index
  21 +
  22 + pa_index = input_hand[-1]
  23 + # TODO mão esquerda
  24 + for i in range(0, repetition):
  25 + util.setPose(action, [util.cocar_mao_aberta_index, pa_index, util.cocar_orientation_index], [currentFrame], bones)
  26 + currentFrame += frameJump
  27 + util.setPose(action, [util.cocar_mao_fechada_index, pa_index, util.cocar_orientation_index], [currentFrame], bones)
  28 + currentFrame += frameJump
  29 + return currentFrame
  30 +
  31 +def alisar(action, input_hand, pose, bones, initialFrame = 18, frameJump = 10, width = 0.25):
  32 + currentFrame = initialFrame
  33 + orientation, repetition = input_hand[2:4]
  34 + handParam = input_hand[-3:]
  35 + util.setPose(action, handParam, util.hands_default_frames, bones)
  36 +
13 37 if (orientation == "perpendicular"):
14   - currentFrame = alisarXY(pose, 1, repetition, frameJump, initialFrame, width)
  38 + currentFrame = alisar_xy(pose, 1, repetition, initialFrame, frameJump, width)
15 39 elif (orientation == "paralelo"):
16   - currentFrame = alisarXY(pose, 0, repetition, frameJump, initialFrame, width)
  40 + currentFrame = alisar_xy(pose, 0, repetition, initialFrame, frameJump, width)
17 41 elif (orientation == "diagonal-direita"):
18   - currentFrame = alisar_diagonal(pose, True, repetition, frameJump, initialFrame, width)
  42 + currentFrame = alisar_diagonal(pose, True, repetition, initialFrame, frameJump, width)
19 43 elif (orientation == "diagonal-esquerda"):
20   - currentFrame = alisar_diagonal(pose, False, repetition, frameJump, initialFrame, width)
21   -
  44 + currentFrame = alisar_diagonal(pose, False, repetition, initialFrame, frameJump, width)
  45 +
  46 + util.setPose(action, handParam, [currentFrame], bones)
22 47 return currentFrame
23 48  
24   -def alisarXY(pose, orientation_index, repetition, frameJump = 10, initialFrame = 18, width = 0.25):
  49 +def alisar_xy(pose, orientation_index, repetition, initialFrame = 18, frameJump = 10, width = 0.25):
25 50 currentFrame = initialFrame
26 51 center = pose.location.x, pose.location.y, pose.location.z
27 52  
... ... @@ -32,11 +57,10 @@ def alisarXY(pose, orientation_index, repetition, frameJump = 10, initialFrame =
32 57 pose.location[orientation_index] = center[orientation_index] + width
33 58 pose.keyframe_insert(frame = currentFrame, index = -1, data_path = 'location')
34 59 currentFrame += frameJump
35   - #currentFrame -= frameJump
36 60  
37 61 return currentFrame
38 62  
39   -def alisar_diagonal(pose, to_right, repetition, frameJump = 10, initialFrame = 18, width = 0.25):
  63 +def alisar_diagonal(pose, to_right, repetition, initialFrame = 18, frameJump = 10, width = 0.25):
40 64 currentFrame = initialFrame
41 65 center = pose.location.x, pose.location.y, pose.location.z
42 66  
... ... @@ -51,7 +75,6 @@ def alisar_diagonal(pose, to_right, repetition, frameJump = 10, initialFrame = 1
51 75 pose.location[1] = center[1] + width if to_right else center[1] - width
52 76 pose.keyframe_insert(frame = currentFrame, index = -1, data_path = 'location')
53 77 currentFrame += frameJump
54   - #currentFrame -= frameJump
55 78  
56 79 return currentFrame
57 80  
... ...
util.py
... ... @@ -19,6 +19,33 @@ faceBonesConf = [15, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 47]
19 19 # Vetor com indices de todos os bones
20 20 allBones = list(range(len(armature.pose.bones)))
21 21  
  22 +# define a posição dos keyframes
  23 +hands_default_frames = [15, 18]
  24 +
  25 +# define a posição dos keyframes
  26 +hands_frames_retilineo = [30, 33]
  27 +
  28 +# Movimento de mão action
  29 +movimento_mao_action_index = 7
  30 +
  31 +# Movimento coçar - Índices de poses
  32 +cocar_mao_aberta_index = 0
  33 +cocar_mao_fechada_index = 1
  34 +cocar_orientation_index = 12
  35 +
  36 +# Função responsável por selecionar as pose-libs e setar os frames
  37 +def setPose(actions, parametesConf, positionFrames, bones):
  38 + bpy.ops.object.mode_set(mode = 'OBJECT')
  39 + bpy.ops.object.select_all(action="DESELECT")
  40 + bpy.ops.object.mode_set(mode = 'POSE')
  41 + for l in range(len(actions)):
  42 + armature.pose_library = bpy.data.actions[actions[l]]
  43 + for x in range(len(positionFrames)):
  44 + bpy.ops.poselib.apply_pose(pose_index = parametesConf[l])
  45 + for i in range(0, (len(bones))):
  46 + armature.pose.bones[bones[i]].keyframe_insert(data_path = 'location', index = -1, frame = positionFrames[x])
  47 + armature.pose.bones[bones[i]].keyframe_insert(data_path = 'rotation_quaternion', index = -1, frame = positionFrames[x])
  48 +
22 49 # Função que limpa todos os keyframes e define a quantidade de frames
23 50 def erase_all_keyframes():
24 51 for i in bpy.data.objects:
... ...