Commit 1880bcdf9d16e473e4adf502d2311b8cdf6bfd77
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: | ... | ... |