Commit e313bcb0251531f63b4c31711c70355bbafcbeea

Authored by André Araújo
1 parent 42f9b71d
Exists in master

Atualiza movimento Circular, Helicoidal, Facial

1 -JSON = $(JSON_RETILINEO) 1 +JSON = $(JSON_CIRCULAR)
2 2
3 # ---------------------------- 3 # ----------------------------
4 -# JSON = $(JSON_CIRCULAR)  
5 -# JSON = $(JSON_CONTATO_ALISAR)  
6 -# JSON = $(JSON_CONTATO_COCAR)  
7 -# JSON = $(JSON_CONTATO_TOCAR)  
8 -# JSON = $(JSON_CONTATO_RISCAR)  
9 -# JSON = $(JSON_FACIAL)  
10 -# JSON = $(JSON_HELICOIDAL)  
11 -# JSON = $(JSON_PONTUAL)  
12 -# JSON = $(JSON_RETILINEO)  
13 -# JSON = $(JSON_SEMI_CIRCULAR)  
14 -# JSON = $(JSON_SENOIDAL) 4 +# JSON = $(JSON_CIRCULAR) [OK]
  5 +# JSON = $(JSON_CONTATO_ALISAR) [--]
  6 +# JSON = $(JSON_CONTATO_COCAR) [--]
  7 +# JSON = $(JSON_CONTATO_TOCAR) [--]
  8 +# JSON = $(JSON_CONTATO_RISCAR) [--]
  9 +# JSON = $(JSON_FACIAL) [OK]
  10 +# JSON = $(JSON_HELICOIDAL) [OK]
  11 +# JSON = $(JSON_PONTUAL) [OK]
  12 +# JSON = $(JSON_RETILINEO) [OK]
  13 +# JSON = $(JSON_SEMICIRCULAR) [OK]
  14 +# JSON = $(JSON_SENOIDAL) [OK]
15 # ---------------------------- 15 # ----------------------------
16 16
17 JSON_CIRCULAR = \ 17 JSON_CIRCULAR = \
@@ -22,7 +22,8 @@ JSON_CIRCULAR = \ @@ -22,7 +22,8 @@ JSON_CIRCULAR = \
22 "movimentos": [ \ 22 "movimentos": [ \
23 { \ 23 { \
24 "facial": {}, \ 24 "facial": {}, \
25 - "mao_esquerda": { \ 25 + "mao_esquerda": {}, \
  26 + "mao_direita": { \
26 "circular": { \ 27 "circular": { \
27 "plano": "esquerda-cima", \ 28 "plano": "esquerda-cima", \
28 "raio": "pequeno", \ 29 "raio": "pequeno", \
@@ -30,11 +31,10 @@ JSON_CIRCULAR = \ @@ -30,11 +31,10 @@ JSON_CIRCULAR = \
30 "lado_oposto": false, \ 31 "lado_oposto": false, \
31 "sentido_inverso": false, \ 32 "sentido_inverso": false, \
32 "articulacao": 80, \ 33 "articulacao": 80, \
33 - "configuracao": 10, \  
34 - "orientacao": 20 \ 34 + "configuracao": 15, \
  35 + "orientacao": 18 \
35 } \ 36 } \
36 - }, \  
37 - "mao_direita": {} \ 37 + } \
38 } \ 38 } \
39 ] \ 39 ] \
40 }' 40 }'
@@ -47,7 +47,8 @@ JSON_CONTATO_ALISAR = \ @@ -47,7 +47,8 @@ JSON_CONTATO_ALISAR = \
47 "movimentos": [ \ 47 "movimentos": [ \
48 { \ 48 { \
49 "facial": {}, \ 49 "facial": {}, \
50 - "mao_direita": { \ 50 + "mao_direita": {}, \
  51 + "mao_esquerda": { \
51 "contato": { \ 52 "contato": { \
52 "movimento_orientacao": "paralelo", \ 53 "movimento_orientacao": "paralelo", \
53 "alisar": { \ 54 "alisar": { \
@@ -56,8 +57,7 @@ JSON_CONTATO_ALISAR = \ @@ -56,8 +57,7 @@ JSON_CONTATO_ALISAR = \
56 "orientacao": 11 \ 57 "orientacao": 11 \
57 } \ 58 } \
58 } \ 59 } \
59 - }, \  
60 - "mao_esquerda": {} \ 60 + } \
61 } \ 61 } \
62 ] \ 62 ] \
63 }' 63 }'
@@ -70,7 +70,8 @@ JSON_CONTATO_COCAR = \ @@ -70,7 +70,8 @@ JSON_CONTATO_COCAR = \
70 "movimentos": [ \ 70 "movimentos": [ \
71 { \ 71 { \
72 "facial": {}, \ 72 "facial": {}, \
73 - "mao_direita": { \ 73 + "mao_direita": {}, \
  74 + "mao_esquerda": { \
74 "contato": { \ 75 "contato": { \
75 "cocar": { \ 76 "cocar": { \
76 "articulacao": 71, \ 77 "articulacao": 71, \
@@ -78,8 +79,7 @@ JSON_CONTATO_COCAR = \ @@ -78,8 +79,7 @@ JSON_CONTATO_COCAR = \
78 "orientacao": 11 \ 79 "orientacao": 11 \
79 } \ 80 } \
80 } \ 81 } \
81 - }, \  
82 - "mao_esquerda": {} \ 82 + } \
83 } \ 83 } \
84 ] \ 84 ] \
85 }' 85 }'
@@ -92,7 +92,8 @@ JSON_CONTATO_TOCAR = \ @@ -92,7 +92,8 @@ JSON_CONTATO_TOCAR = \
92 "movimentos": [ \ 92 "movimentos": [ \
93 { \ 93 { \
94 "facial": {}, \ 94 "facial": {}, \
95 - "mao_direita": { \ 95 + "mao_direita": {}, \
  96 + "mao_esquerda": {}, \
96 "contato": { \ 97 "contato": { \
97 "tocar": { \ 98 "tocar": { \
98 "articulacao": 71, \ 99 "articulacao": 71, \
@@ -100,8 +101,7 @@ JSON_CONTATO_TOCAR = \ @@ -100,8 +101,7 @@ JSON_CONTATO_TOCAR = \
100 "orientacao": 11 \ 101 "orientacao": 11 \
101 } \ 102 } \
102 } \ 103 } \
103 - }, \  
104 - "mao_esquerda": {} \ 104 + } \
105 } \ 105 } \
106 ] \ 106 ] \
107 }' 107 }'
@@ -114,7 +114,8 @@ JSON_CONTATO_RISCAR = \ @@ -114,7 +114,8 @@ JSON_CONTATO_RISCAR = \
114 "movimentos": [ \ 114 "movimentos": [ \
115 { \ 115 { \
116 "facial": {}, \ 116 "facial": {}, \
117 - "mao_direita": { \ 117 + "mao_direita": {}, \
  118 + "mao_esquerda": { \
118 "contato": { \ 119 "contato": { \
119 "riscar": { \ 120 "riscar": { \
120 "articulacao": 71, \ 121 "articulacao": 71, \
@@ -122,8 +123,7 @@ JSON_CONTATO_RISCAR = \ @@ -122,8 +123,7 @@ JSON_CONTATO_RISCAR = \
122 "orientacao": 11 \ 123 "orientacao": 11 \
123 } \ 124 } \
124 } \ 125 } \
125 - }, \  
126 - "mao_esquerda": {} \ 126 + } \
127 } \ 127 } \
128 ] \ 128 ] \
129 }' 129 }'
@@ -135,22 +135,28 @@ JSON_FACIAL = \ @@ -135,22 +135,28 @@ JSON_FACIAL = \
135 "interpolacao": "normal", \ 135 "interpolacao": "normal", \
136 "movimentos": [ \ 136 "movimentos": [ \
137 { \ 137 { \
  138 + "mao_direita": {}, \
  139 + "mao_esquerda": {}, \
138 "facial": { \ 140 "facial": { \
139 "expressao": 10, \ 141 "expressao": 10, \
140 "transicao": "normal", \ 142 "transicao": "normal", \
141 "duracao": "normal" \ 143 "duracao": "normal" \
142 - }, \ 144 + } \
  145 + }, \
  146 + { \
143 "mao_direita": {}, \ 147 "mao_direita": {}, \
144 - "mao_esquerda": {} \ 148 + "mao_esquerda": {}, \
  149 + "facial": { \
  150 + } \
145 }, \ 151 }, \
146 { \ 152 { \
  153 + "mao_direita": {}, \
  154 + "mao_esquerda": {}, \
147 "facial": { \ 155 "facial": { \
148 "expressao": 11, \ 156 "expressao": 11, \
149 "transicao": "normal", \ 157 "transicao": "normal", \
150 "duracao": "normal" \ 158 "duracao": "normal" \
151 } \ 159 } \
152 - "mao_direita": {}, \  
153 - "mao_esquerda": {} \  
154 } \ 160 } \
155 ] \ 161 ] \
156 }' 162 }'
@@ -163,20 +169,21 @@ JSON_HELICOIDAL = \ @@ -163,20 +169,21 @@ JSON_HELICOIDAL = \
163 "movimentos": [ \ 169 "movimentos": [ \
164 { \ 170 { \
165 "facial": {}, \ 171 "facial": {}, \
166 - "mao_esquerda": { \ 172 + "mao_esquerda": {}, \
  173 + "mao_direita": { \
167 "helicoidal": { \ 174 "helicoidal": { \
168 "plano": "esquerda-cima", \ 175 "plano": "esquerda-cima", \
169 "raio": "pequeno", \ 176 "raio": "pequeno", \
170 "velocidade": "normal", \ 177 "velocidade": "normal", \
171 "lado_oposto": false, \ 178 "lado_oposto": false, \
172 - "sentido_inverso": false, \  
173 - "articulacao": 80, \  
174 - "configuracao": 10, \  
175 - "orientacao": 20 \ 179 + "sentido_inverso": true, \
  180 + "articulacao": 79, \
  181 + "configuracao": 0, \
  182 + "orientacao": 64 \
176 } \ 183 } \
177 - }, \  
178 - "mao_direita": {} \ 184 + } \
179 } \ 185 } \
  186 + ] \
180 }' 187 }'
181 188
182 JSON_PONTUAL = \ 189 JSON_PONTUAL = \
@@ -187,14 +194,13 @@ JSON_PONTUAL = \ @@ -187,14 +194,13 @@ JSON_PONTUAL = \
187 "movimentos": [ \ 194 "movimentos": [ \
188 { \ 195 { \
189 "facial": {}, \ 196 "facial": {}, \
190 - "mao_direita": { \ 197 + "mao_direita": {}, \
  198 + "mao_esquerda": { \
191 "pontual": { \ 199 "pontual": { \
192 "articulacao": 71, \ 200 "articulacao": 71, \
193 "configuracao": 19, \ 201 "configuracao": 19, \
194 "orientacao": 11 \ 202 "orientacao": 11 \
195 } \ 203 } \
196 - }, \  
197 - "mao_esquerda": { \  
198 } \ 204 } \
199 } \ 205 } \
200 ] \ 206 ] \
@@ -208,41 +214,42 @@ JSON_RETILINEO = \ @@ -208,41 +214,42 @@ JSON_RETILINEO = \
208 "movimentos": [ \ 214 "movimentos": [ \
209 { \ 215 { \
210 "facial": {}, \ 216 "facial": {}, \
211 - "mao_direita": { \ 217 + "mao_direita": {}, \
  218 + "mao_esquerda": { \
212 "retilineo": { \ 219 "retilineo": { \
213 "articulacao_inicial": 71, \ 220 "articulacao_inicial": 71, \
214 - "articulacao_final": 75, \  
215 - "configuracao": 19, \  
216 - "orientacao": 11 \ 221 + "configuracao_inicial": 19, \
  222 + "orientacao_inicial": 11, \
  223 + "articulacao_final": 78, \
  224 + "configuracao_final": 19, \
  225 + "orientacao_final": 11 \
217 } \ 226 } \
218 - }, \  
219 - "mao_esquerda": { \  
220 } \ 227 } \
221 } \ 228 } \
222 ] \ 229 ] \
223 }' 230 }'
224 231
225 -JSON_SEMI_CIRCULAR = \ 232 +JSON_SEMICIRCULAR = \
226 '{ \ 233 '{ \
227 "userId": "lavid", \ 234 "userId": "lavid", \
228 - "sinal": "modelo_semi_circular", \ 235 + "sinal": "modelo_semicircular", \
229 "interpolacao": "normal", \ 236 "interpolacao": "normal", \
230 "movimentos": [ \ 237 "movimentos": [ \
231 { \ 238 { \
232 "facial": {}, \ 239 "facial": {}, \
233 - "mao_esquerda": { \  
234 - "circular": { \ 240 + "mao_esquerda": {}, \
  241 + "mao_direita": { \
  242 + "semicircular": { \
235 "plano": "esquerda-cima", \ 243 "plano": "esquerda-cima", \
236 "raio": "pequeno", \ 244 "raio": "pequeno", \
237 "velocidade": "normal", \ 245 "velocidade": "normal", \
238 "lado_oposto": false, \ 246 "lado_oposto": false, \
239 "sentido_inverso": false, \ 247 "sentido_inverso": false, \
240 "articulacao": 80, \ 248 "articulacao": 80, \
241 - "configuracao": 10, \  
242 - "orientacao": 20 \ 249 + "configuracao": 15, \
  250 + "orientacao": 18 \
243 } \ 251 } \
244 - }, \  
245 - "mao_direita": {} \ 252 + } \
246 } \ 253 } \
247 ] \ 254 ] \
248 }' 255 }'
@@ -254,26 +261,22 @@ JSON_SENOIDAL = \ @@ -254,26 +261,22 @@ JSON_SENOIDAL = \
254 "interpolacao": "normal", \ 261 "interpolacao": "normal", \
255 "movimentos": [ \ 262 "movimentos": [ \
256 { \ 263 { \
257 - "facial": { \  
258 - "expressao": 10, \  
259 - "transicao": "normal", \  
260 - "duracao": "normal" \  
261 - }, \  
262 - "mao_esquerda": { \ 264 + "facial": {}, \
  265 + "mao_esquerda": {}, \
  266 + "mao_direita": { \
263 "circular": { \ 267 "circular": { \
264 "plano": "esquerda-cima", \ 268 "plano": "esquerda-cima", \
265 "raio": "pequeno", \ 269 "raio": "pequeno", \
266 "velocidade": "normal", \ 270 "velocidade": "normal", \
267 "lado_oposto": false, \ 271 "lado_oposto": false, \
268 "sentido_inverso": false, \ 272 "sentido_inverso": false, \
269 - "articulacao": 80, \  
270 - "configuracao": 10, \  
271 - "orientacao": 20 \ 273 + "articulacao": 79, \
  274 + "configuracao": 0, \
  275 + "orientacao": 64 \
272 } \ 276 } \
273 - }, \  
274 - "mao_direita": { \  
275 } \ 277 } \
276 } \ 278 } \
  279 + ] \
277 }' 280 }'
278 281
279 BLEND = avatar_cartoon_v2.74.blend 282 BLEND = avatar_cartoon_v2.74.blend
@@ -18,6 +18,6 @@ try: @@ -18,6 +18,6 @@ try:
18 # result = subprocess.call(['blender', '-b', blend_path, '-P', main_path, '--', sys.argv[1]], stdout = open('bpy.log', 'w')) 18 # result = subprocess.call(['blender', '-b', blend_path, '-P', main_path, '--', sys.argv[1]], stdout = open('bpy.log', 'w'))
19 result = subprocess.call(['blender', '-b', blend_path, '-P', main_path, '--', sys.argv[1]]) 19 result = subprocess.call(['blender', '-b', blend_path, '-P', main_path, '--', sys.argv[1]])
20 except: 20 except:
21 - result = pyutil.print_stack_trace(__file__) 21 + result = pyutil.print_stack_trace()
22 22
23 exit(result) 23 exit(result)
@@ -2,81 +2,33 @@ import bpy @@ -2,81 +2,33 @@ import bpy
2 import moves 2 import moves
3 import util 3 import util
4 4
5 -def circular_semicircular(js_movement, current_frame, frame_jump, is_right_hand, is_semicircular):  
6 - dict_ray = {  
7 - 'pequeno': 0.5,  
8 - 'normal': 1.0,  
9 - 'grande': 1.5  
10 - }  
11 - dict_period = {  
12 - 'lento': 55,  
13 - 'normal': 45,  
14 - 'rapido': 35  
15 - }  
16 - # decodificar valores  
17 - ray = dict_ray[js_movement['raio']]  
18 - period = dict_period[js_movement['velocidade']]  
19 - # diminuir a velocidade  
20 - if (js_movement['velocidade'] == 'lento'):  
21 - period += 10  
22 - # aumentar a velocidade  
23 - elif (js_movement['velocidade'] == 'rapido'):  
24 - period -= 10  
25 - # definir eixos do movimento  
26 - if (js_movement['plano'] == 'frente-esquerda'):  
27 - x, y = 2, 0  
28 - elif (js_movement['plano'] == 'frente-cima'):  
29 - x, y = 2, 1  
30 - else:  
31 - x, y = 0, 1  
32 - # mao usada (direita/esquerda)  
33 - if (is_right_hand):  
34 - ik = bpy.context.object.pose.bones['ik_FK.R']  
35 - else:  
36 - ik = bpy.context.object.pose.bones['ik_FK.L']  
37 - #current_frame = insert_keyframe_pose_default(current_frame, [ik], ['location'])  
38 - current_frame = moves.circular(ik, current_frame, ray, period, x, y, js_movement['lado_oposto'], js_movement['sentido_inverso'], is_semicircular)  
39 - return current_frame 5 +def facial(js_facial, current_frame, frame_jump):
  6 + return moves.facial(js_facial, current_frame, frame_jump)
40 7
41 def contato(js_movement, current_frame, frame_jump, is_right_hand): 8 def contato(js_movement, current_frame, frame_jump, is_right_hand):
42 sub_type = next(iter(js_movement.keys())) 9 sub_type = next(iter(js_movement.keys()))
43 mov_param = js_movement[sub_type] 10 mov_param = js_movement[sub_type]
44 action = util.right_hand_actions if is_right_hand else util.left_hand_actions 11 action = util.right_hand_actions if is_right_hand else util.left_hand_actions
45 bones = util.right_bones_conf if is_right_hand else util.left_bones_conf 12 bones = util.right_bones_conf if is_right_hand else util.left_bones_conf
46 - current_frame = current_frame + 2*frame_jump 13 + current_frame = current_frame + (2 * frame_jump)
47 return moves.contato(action, sub_type, mov_param, bones, is_right_hand, current_frame, frame_jump) 14 return moves.contato(action, sub_type, mov_param, bones, is_right_hand, current_frame, frame_jump)
48 15
49 -def helicoidal(js_movement, current_frame, frame_jump, is_right_hand):  
50 - return moves.helicoidal(js_movement, current_frame, frame_jump, is_right_hand)  
51 -  
52 -def pontual(js_movement, current_frame, frame_jump, is_right_hand):  
53 - return moves.pontual(js_movement, current_frame, frame_jump, is_right_hand)  
54 -  
55 -def retilineo(js_movement, current_frame, frame_jump, is_right_hand):  
56 - return moves.retilineo(js_movement, current_frame, frame_jump, is_right_hand)  
57 -  
58 -def semicircular(js_movement, current_frame, frame_jump, is_right_hand, is_semicircular):  
59 - return moves.semi_circular(js_movement, current_frame, frame_jump, is_right_hand)  
60 -  
61 -def senoidal(js_movement, current_frame, frame_jump, is_right_hand):  
62 - return moves.senoidal(js_movement, current_frame, frame_jump, is_right_hand)  
63 -  
64 def hand_mov(current_frame, frame_jump, js_mao, is_right_hand): 16 def hand_mov(current_frame, frame_jump, js_mao, is_right_hand):
65 if (js_mao == {}): 17 if (js_mao == {}):
66 - return current_frame 18 + return current_frame + (2 * frame_jump)
67 movement_name = next(iter(js_mao.keys())) 19 movement_name = next(iter(js_mao.keys()))
68 - if (movement_name == 'circular'):  
69 - current_frame = circular_semicircular(js_mao[movement_name], current_frame, frame_jump, is_right_hand, False)  
70 - elif (movement_name == 'semicircular'):  
71 - current_frame = circular_semicircular(js_mao[movement_name], current_frame, frame_jump, is_right_hand, True)  
72 - elif (movement_name == 'contato'): 20 + if (movement_name == "circular"):
  21 + current_frame = moves.circular(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
  22 + elif (movement_name == "semicircular"):
  23 + current_frame = moves.semicircular(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
  24 + elif (movement_name == "contato"):
73 current_frame = contato(js_mao[movement_name], current_frame, frame_jump, is_right_hand) 25 current_frame = contato(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
74 - elif (movement_name == 'helicoidal'):  
75 - current_frame = espiral(js_mao[movement_name], current_frame, frame_jump, is_right_hand)  
76 - elif (movement_name == 'pontual'):  
77 - current_frame = pontual(js_mao[movement_name], current_frame, frame_jump, is_right_hand)  
78 - elif (movement_name == 'retilineo'):  
79 - current_frame = retilineo(js_mao[movement_name], current_frame, frame_jump, is_right_hand)  
80 - elif (movement_name == 'senoidal'):  
81 - current_frame = senoidal(js_mao[movement_name], current_frame, frame_jump, is_right_hand) 26 + elif (movement_name == "helicoidal"):
  27 + current_frame = moves.helicoidal(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
  28 + elif (movement_name == "pontual"):
  29 + current_frame = moves.pontual(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
  30 + elif (movement_name == "retilineo"):
  31 + current_frame = moves.retilineo(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
  32 + elif (movement_name == "senoidal"):
  33 + current_frame = moves.senoidal(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
82 return current_frame + frame_jump 34 return current_frame + frame_jump
facial.py
@@ -1,113 +0,0 @@ @@ -1,113 +0,0 @@
1 -# -*- coding: UTF-8 -*-  
2 -  
3 -import bpy  
4 -import util  
5 -  
6 -# duracao na posicao selecionada  
7 -dict_duration = {  
8 - 'inicial': 10,  
9 - 'lento': 15,  
10 - 'normal': 10,  
11 - 'rapido': 5,  
12 - 'final': 10,  
13 -}  
14 -  
15 -# tempo de entrada e saida na posicao selecionada  
16 -dict_transition = {  
17 - 'inicial': 0,  
18 - 'lento': 15,  
19 - 'normal': 10,  
20 - 'rapido': 5  
21 -}  
22 -  
23 -# insere keyframes aos bones selecionados anteriormente e passados como parametro  
24 -def keyframe_insert(current_frame = 0, pose_bones = bpy.context.object.pose.bones, keyframe_types = ['location', 'rotation_quaternion']):  
25 - # verifica se existe apenas um bone  
26 - if (isinstance(pose_bones, int) or isinstance(pose_bones, str)):  
27 - # verifica se existe apenas um tipo de insercao de keyframe  
28 - if (isinstance(keyframe_types, str)):  
29 - bpy.context.object.pose.bones[pose_bones].keyframe_insert(index = -1, frame = current_frame, group = bpy.context.object.pose.bones[pose_bones].name, data_path = keyframe_types)  
30 - # verifica se existe mais de um tipo de insercao de keyframe  
31 - elif (isinstance(keyframe_types, list)):  
32 - for keyframe_type in keyframe_types:  
33 - bpy.context.object.pose.bones[bones].keyframe_insert(index = -1, frame = current_frame, group = bpy.context.object.pose.bones[pose_bones].name, data_path = keyframe_type)  
34 - # verifica se existe mais de um bone  
35 - elif (isinstance(pose_bones, list)):  
36 - for bone in pose_bones:  
37 - # verifica se existe apenas um tipo de insercao de keyframe  
38 - if (isinstance(keyframe_types, str)):  
39 - bpy.context.object.pose.bones[bone].keyframe_insert(index = -1, frame = current_frame, group = bpy.context.object.pose.bones[bone].name, data_path = keyframe_types)  
40 - # verifica se existe mais de um tipo de insercao de keyframe  
41 - elif (isinstance(keyframe_types, list)):  
42 - for keyframe_type in keyframe_types:  
43 - bpy.context.object.pose.bones[bone].keyframe_insert(index = -1, frame = current_frame, group = bpy.context.object.pose.bones[bone].name, data_path = keyframe_type)  
44 - return  
45 -  
46 -# aplica biblioteca(s) de pose(s) e seu respectivo indice  
47 -def apply_pose(index = 0, pose_library = list(bpy.data.actions)):  
48 - # verifica se deve aplicar apenas uma biblioteca  
49 - if (isinstance(pose_library, int) or isinstance(pose_library, str)):  
50 - # verifica biblioteca fake_user  
51 - if (bpy.data.actions[pose_library].use_fake_user):  
52 - bpy.context.object.pose_library = bpy.data.actions[pose_library]  
53 - bpy.ops.poselib.apply_pose(pose_index = index)  
54 - # verifica se deve aplicar mais de uma biblioteca  
55 - elif (isinstance(pose_library, list)):  
56 - for library in pose_library:  
57 - # verifica biblioteca fake_user  
58 - if (library.use_fake_user):  
59 - bpy.context.object.pose_library = library  
60 - bpy.ops.poselib.apply_pose(pose_index = index)  
61 - bpy.context.object.pose_library = None  
62 - return  
63 -  
64 -# consolida o movimento (faz insercao dos keyframes) e incrementa a timeline  
65 -def set_expression(timeline_facial, index, frame_duration = dict_duration['normal'], frame_transition = dict_transition['inicial']):  
66 - library_name = util.facial_expression_id  
67 - bones_facial = util.dict_bones[library_name]  
68 - util.select_bones(bones_facial)  
69 - # TODO separar bones 'location' e 'rotation_quaternion'  
70 - keyframe_insert(timeline_facial, bones_facial, ['location', 'rotation_quaternion'])  
71 - apply_pose(index, library_name)  
72 - timeline_facial += frame_transition  
73 - keyframe_insert(timeline_facial, bones_facial, ['location', 'rotation_quaternion'])  
74 - timeline_facial += frame_duration  
75 - keyframe_insert(timeline_facial, bones_facial, ['location', 'rotation_quaternion'])  
76 - timeline_facial += frame_transition  
77 - util.deselect_bones(bones_facial)  
78 - return timeline_facial  
79 -  
80 -# decodifica objeto JSON  
81 -def decode_expression(timeline_facial, js_facial, initial_interpolation = dict_duration['normal']):  
82 - global dict_duration  
83 - global dict_transition  
84 - index = js_facial['expressao']  
85 - frame_duration = dict_duration[js_facial['duracao']]  
86 - frame_transition = dict_transition[js_facial['transicao']]  
87 - # insere o primeiro keyframe  
88 - if (timeline_facial == 0):  
89 - timeline_facial = set_expression(timeline_facial, 0, initial_interpolation)  
90 - timeline_facial = set_expression(timeline_facial, index, frame_duration, frame_transition)  
91 - timeline_facial = set_expression(timeline_facial, 0, frame_duration)  
92 - return timeline_facial  
93 -  
94 -"""  
95 -# unit test  
96 -def main():  
97 - timeline_facial = 0  
98 - util.delete_all_keyframes()  
99 - expressoes = list(range(0, round(bpy.data.actions[util.facial_expression_id].frame_range[1]) + 1))  
100 - expressoes = [10, 11]  
101 - for i in expressoes:  
102 - js_facial = {  
103 - "expressao": i,  
104 - "transicao": "normal",  
105 - "duracao": "normal"  
106 - }  
107 - timeline_facial = decode_expression(timeline_facial, js_facial, dict_duration['inicial'])  
108 - bpy.context.scene.frame_end = timeline_facial + dict_duration['final']  
109 - bpy.ops.screen.animation_play(reverse = False)  
110 -  
111 -if __name__ == "__main__":  
112 - main()  
113 -"""  
114 \ No newline at end of file 0 \ No newline at end of file
@@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
4 import bpy 4 import bpy
5 5
6 # importa modulos do Python 6 # importa modulos do Python
  7 +import io
7 import json 8 import json
8 import sys 9 import sys
9 import os 10 import os
@@ -18,25 +19,15 @@ sys.path.insert(0, getcwd) @@ -18,25 +19,15 @@ sys.path.insert(0, getcwd)
18 import util 19 import util
19 import moves 20 import moves
20 import pyutil 21 import pyutil
21 -import facial  
22 import decode 22 import decode
23 23
24 -# intervalos de interpolacao dos keyframes  
25 -dict_interpolation = {  
26 - 'inicial': 20,  
27 - 'lento': 15,  
28 - 'normal': 10,  
29 - 'rapido': 5,  
30 - 'final': 20  
31 -}  
32 -  
33 -def insert_keyframe_pose_default(current_frame = 0, pose_bones = bpy.context.object.pose.bones, types_keyframe = ['location', 'rotation_quaternion']): 24 +def insert_keyframe_pose_default(current_frame = 0, pose_bones = bpy.context.object.pose.bones, types_keyframe = ["location", "rotation_quaternion"]):
34 for obj in (pose_bones): 25 for obj in (pose_bones):
35 obj.bone.select = True 26 obj.bone.select = True
36 for type_keyframe in types_keyframe: 27 for type_keyframe in types_keyframe:
37 util.keyframe_insert(obj, type_keyframe, current_frame, False) 28 util.keyframe_insert(obj, type_keyframe, current_frame, False)
38 obj.bone.select = False 29 obj.bone.select = False
39 - return current_frame 30 + return
40 31
41 def pose_default(current_frame = 0, frame_jump = 0, actions = bpy.data.actions): 32 def pose_default(current_frame = 0, frame_jump = 0, actions = bpy.data.actions):
42 for action in actions: 33 for action in actions:
@@ -54,55 +45,55 @@ def main(): @@ -54,55 +45,55 @@ def main():
54 45
55 try: 46 try:
56 js_input = json.loads(sys.argv[6]) 47 js_input = json.loads(sys.argv[6])
57 - js_movimentos = js_input['movimentos']  
58 - frame_jump = dict_interpolation[js_input['interpolacao']] 48 + js_movimentos = js_input["movimentos"]
  49 + frame_jump = util.dict_interpolation[js_input["interpolacao"]]
59 50
60 endFrame = pose_default(0, frame_jump) 51 endFrame = pose_default(0, frame_jump)
  52 + timeline_facial = 0
61 timeline_mao_esquerda = 0 53 timeline_mao_esquerda = 0
62 timeline_mao_direita = 0 54 timeline_mao_direita = 0
63 - timeline_facial = 0  
64 55
65 - # setar pose padrao inicial em todos os bones ('location' e 'rotation_quaternion')  
66 - endFrame += pose_default(dict_interpolation['inicial']) 56 + # setar pose padrao inicial em todos os bones ("location" e "rotation_quaternion")
  57 + endFrame += pose_default(util.dict_interpolation["inicial"])
67 58
68 for i in range(0, len(js_movimentos)): 59 for i in range(0, len(js_movimentos)):
  60 + timeline_facial = endFrame
69 timeline_mao_esquerda = endFrame 61 timeline_mao_esquerda = endFrame
70 timeline_mao_direita = endFrame 62 timeline_mao_direita = endFrame
71 63
72 # tenta decodificar objetos JSON 64 # tenta decodificar objetos JSON
73 try: 65 try:
74 - js_facial = js_movimentos[i]['facial'] 66 + js_facial = js_movimentos[i]["facial"]
75 except: 67 except:
76 js_facial = {} 68 js_facial = {}
77 try: 69 try:
78 - js_mao_esquerda = js_movimentos[i]['mao_esquerda'] 70 + js_mao_esquerda = js_movimentos[i]["mao_esquerda"]
79 except: 71 except:
80 js_mao_esquerda = {} 72 js_mao_esquerda = {}
81 try: 73 try:
82 - js_mao_direita = js_movimentos[i]['mao_direita'] 74 + js_mao_direita = js_movimentos[i]["mao_direita"]
83 except: 75 except:
84 js_mao_direita = {} 76 js_mao_direita = {}
85 77
86 # faz tratamento dos objetos 78 # faz tratamento dos objetos
87 if (js_facial == {}): 79 if (js_facial == {}):
88 - print("movimento [%d] Exp facial = <Vazio>" % (i))  
89 - timeline_facial = facial.set_expression(timeline_facial, 0) 80 + pyutil.log("movimento [%d] Exp facial = <Vazio>" % (i))
90 else: 81 else:
91 - print("movimento [%d] Exp facial = [%d]" % (i, js_facial["expressao"]))  
92 - timeline_facial = facial.decode_expression(timeline_facial, js_facial) 82 + pyutil.log("movimento [%d] Exp facial = [%d]" % (i, js_facial["expressao"]))
  83 + timeline_facial = decode.facial(js_facial, timeline_facial, frame_jump)
93 84
94 if (js_mao_esquerda == {}): 85 if (js_mao_esquerda == {}):
95 - print("movimento [%d] Mao Esquerda = <Vazio>" % (i)) 86 + pyutil.log("movimento [%d] Mao Esquerda = <Vazio>" % (i))
96 # TODO posicionar mao esquerda na lateral do corpo 87 # TODO posicionar mao esquerda na lateral do corpo
97 else: 88 else:
98 - print("movimento [%d] Mao Esquerda = [%s]" % (i, next(iter(js_mao_esquerda.keys())))) 89 + pyutil.log("movimento [%d] Mao Esquerda = [%s]" % (i, next(iter(js_mao_esquerda.keys()))))
99 timeline_mao_esquerda = decode.hand_mov(timeline_mao_esquerda, frame_jump, js_mao_esquerda, False) 90 timeline_mao_esquerda = decode.hand_mov(timeline_mao_esquerda, frame_jump, js_mao_esquerda, False)
100 91
101 if (js_mao_direita == {}): 92 if (js_mao_direita == {}):
102 - print("movimento [%d] Mao Direita = <Vazio>" % (i)) 93 + pyutil.log("movimento [%d] Mao Direita = <Vazio>" % (i))
103 # TODO posicionar mao direita na lateral do corpo 94 # TODO posicionar mao direita na lateral do corpo
104 else: 95 else:
105 - print("movimento [%d] Mao Direita = [%s]" % (i, next(iter(js_mao_direita.keys())))) 96 + pyutil.log("movimento [%d] Mao Direita = [%s]" % (i, next(iter(js_mao_direita.keys()))))
106 timeline_mao_direita = decode.hand_mov(timeline_mao_direita, frame_jump, js_mao_direita, True) 97 timeline_mao_direita = decode.hand_mov(timeline_mao_direita, frame_jump, js_mao_direita, True)
107 98
108 endFrame = max(timeline_facial, timeline_mao_esquerda, timeline_mao_direita) 99 endFrame = max(timeline_facial, timeline_mao_esquerda, timeline_mao_direita)
@@ -110,12 +101,23 @@ def main(): @@ -110,12 +101,23 @@ def main():
110 101
111 # setar pose padrao final em todos os bones (location e rotation) 102 # setar pose padrao final em todos os bones (location e rotation)
112 endFrame = pose_default(endFrame, frame_jump) 103 endFrame = pose_default(endFrame, frame_jump)
113 - endFrame += dict_interpolation['final'] 104 + endFrame += util.dict_interpolation["final"]
  105 +
  106 + sinal = str(js_input["sinal"])
  107 + user_id = str(js_input["userId"])
  108 + directory = os.path.join(getcwd, "users", user_id)
  109 +
  110 + # exporta .blend
  111 + util.export_blend(directory, sinal + ".blend", 0, 0, endFrame)
  112 +
  113 + # exporta .json
  114 + util.export_json(js_input, directory, sinal + ".json")
114 115
115 - util.render_sign(js_input["userId"], js_input["sinal"], endFrame) 116 + # exporta .mp4
  117 + util.render_sign(user_id, sinal, endFrame)
116 118
117 except: 119 except:
118 - pyutil.print_stack_trace(__file__) 120 + pyutil.print_stack_trace()
119 raise 121 raise
120 122
121 if __name__ == "__main__": 123 if __name__ == "__main__":
@@ -5,6 +5,51 @@ import math @@ -5,6 +5,51 @@ import math
5 import util 5 import util
6 import pyutil 6 import pyutil
7 7
  8 +def facial_insert_keyframe(current_frame):
  9 + bones_facial = util.dict_bones[util.facial_expression_id]
  10 + util.select_bones(bones_facial)
  11 + for bone in bones_facial:
  12 + for keyframe_type in ["location", "rotation_quaternion"]:
  13 + bpy.context.object.pose.bones[bone].keyframe_insert(index = -1, frame = current_frame, group = bpy.context.object.pose.bones[bone].name, data_path = keyframe_type)
  14 + util.deselect_bones(bones_facial)
  15 +
  16 +def facial_set_expression(timeline_facial, index, frame_duration, frame_transition):
  17 + facial_insert_keyframe(timeline_facial)
  18 + util.deselect_bones()
  19 + bpy.context.object.pose_library = bpy.data.actions[util.facial_expression_id]
  20 + bpy.ops.poselib.apply_pose(pose_index = index)
  21 + bpy.context.object.pose_library = None
  22 + timeline_facial += frame_transition
  23 + facial_insert_keyframe(timeline_facial)
  24 + timeline_facial += frame_duration
  25 + facial_insert_keyframe(timeline_facial)
  26 + timeline_facial += frame_transition
  27 + return timeline_facial
  28 +
  29 +def facial(js_facial, current_frame, frame_jump):
  30 + dict_duration = {
  31 + "inicial": 5,
  32 + "lento": 15,
  33 + "normal": 10,
  34 + "rapido": 5,
  35 + "final": 5,
  36 + }
  37 + dict_transition = {
  38 + "inicial": 0,
  39 + "lento": 15,
  40 + "normal": 10,
  41 + "rapido": 5,
  42 + "final": 0
  43 + }
  44 + index = js_facial["expressao"]
  45 + frame_duration = dict_duration[js_facial["duracao"]]
  46 + frame_transition = dict_transition[js_facial["transicao"]]
  47 + if (current_frame == 0):
  48 + current_frame = facial_set_expression(current_frame, 0, initial_interpolation, dict_transition["normal"])
  49 + current_frame = facial_set_expression(current_frame, index, frame_duration, frame_transition)
  50 + current_frame = facial_set_expression(current_frame, 0, frame_duration, dict_transition["normal"])
  51 + return current_frame
  52 +
8 def read_hand_param(mov_param): 53 def read_hand_param(mov_param):
9 conf_param = mov_param['configuracao'] if 'configuracao' in mov_param else 0 54 conf_param = mov_param['configuracao'] if 'configuracao' in mov_param else 0
10 artic_param = mov_param['articulacao'] if 'articulacao' in mov_param else 0 55 artic_param = mov_param['articulacao'] if 'articulacao' in mov_param else 0
@@ -26,13 +71,11 @@ def riscar(action, mov_param, bones, is_right_hand, initialFrame = 25, frameJump @@ -26,13 +71,11 @@ def riscar(action, mov_param, bones, is_right_hand, initialFrame = 25, frameJump
26 currentFrame = initialFrame 71 currentFrame = initialFrame
27 handParam = read_hand_param(mov_param) 72 handParam = read_hand_param(mov_param)
28 lado = "R" if is_right_hand else "L" 73 lado = "R" if is_right_hand else "L"
29 -  
30 bnAntBraco = bpy.context.object.pose.bones["BnAntBraco." + lado] 74 bnAntBraco = bpy.context.object.pose.bones["BnAntBraco." + lado]
31 currentFrame += frameJump 75 currentFrame += frameJump
32 util.apply_rotation(bnAntBraco, "Z", currentFrame, bnAntBracoDegree) 76 util.apply_rotation(bnAntBraco, "Z", currentFrame, bnAntBracoDegree)
33 currentFrame += frameJump 77 currentFrame += frameJump
34 util.apply_rotation(bnAntBraco, "Z", currentFrame, (-1)*(bnAntBracoDegree+1)) 78 util.apply_rotation(bnAntBraco, "Z", currentFrame, (-1)*(bnAntBracoDegree+1))
35 -  
36 currentFrame = initialFrame 79 currentFrame = initialFrame
37 util.setPose(action, handParam, [currentFrame], bones) 80 util.setPose(action, handParam, [currentFrame], bones)
38 bnMao = bpy.context.object.pose.bones["BnMao." + lado] 81 bnMao = bpy.context.object.pose.bones["BnMao." + lado]
@@ -51,7 +94,6 @@ def tocar(action, mov_param, bones, is_right_hand, initialFrame = 25, degree = 3 @@ -51,7 +94,6 @@ def tocar(action, mov_param, bones, is_right_hand, initialFrame = 25, degree = 3
51 handParam = read_hand_param(mov_param) 94 handParam = read_hand_param(mov_param)
52 util.setPose(action, handParam, [initialFrame], bones) 95 util.setPose(action, handParam, [initialFrame], bones)
53 pose = util.armature.pose.bones["ik_FK.R" if is_right_hand else "ik_FK.L"] 96 pose = util.armature.pose.bones["ik_FK.R" if is_right_hand else "ik_FK.L"]
54 -  
55 lado = "BnMao.R" if is_right_hand else "BnMao.L" 97 lado = "BnMao.R" if is_right_hand else "BnMao.L"
56 bnMao = bpy.context.object.pose.bones[lado] 98 bnMao = bpy.context.object.pose.bones[lado]
57 currentFrame += frameJump 99 currentFrame += frameJump
@@ -66,7 +108,6 @@ def cocar(action, mov_param, bones, initialFrame = 18, frameJump = 10): @@ -66,7 +108,6 @@ def cocar(action, mov_param, bones, initialFrame = 18, frameJump = 10):
66 currentFrame = initialFrame 108 currentFrame = initialFrame
67 pa_index = mov_param['articulacao'] if 'articulacao' in mov_param else 0 109 pa_index = mov_param['articulacao'] if 'articulacao' in mov_param else 0
68 repetition = mov_param['repeticoes'] if 'repeticoes' in mov_param else 2 110 repetition = mov_param['repeticoes'] if 'repeticoes' in mov_param else 2
69 -  
70 for i in range(0, repetition): 111 for i in range(0, repetition):
71 util.setPose(action, [util.cocar_mao_aberta_index, pa_index, util.cocar_orientation_index], [currentFrame], bones, False) 112 util.setPose(action, [util.cocar_mao_aberta_index, pa_index, util.cocar_orientation_index], [currentFrame], bones, False)
72 currentFrame += frameJump 113 currentFrame += frameJump
@@ -81,7 +122,6 @@ def alisar(action, mov_param, bones, is_right_hand, initialFrame = 18, frameJump @@ -81,7 +122,6 @@ def alisar(action, mov_param, bones, is_right_hand, initialFrame = 18, frameJump
81 handParam = read_hand_param(mov_param) 122 handParam = read_hand_param(mov_param)
82 util.setPose(action, handParam, [currentFrame], bones) 123 util.setPose(action, handParam, [currentFrame], bones)
83 boneIK = util.armature.pose.bones["ik_FK.R" if is_right_hand else "ik_FK.L"] 124 boneIK = util.armature.pose.bones["ik_FK.R" if is_right_hand else "ik_FK.L"]
84 -  
85 if (plane == "perpendicular"): 125 if (plane == "perpendicular"):
86 currentFrame = alisar_xy(boneIK, 1, repetition, currentFrame, frameJump, width) 126 currentFrame = alisar_xy(boneIK, 1, repetition, currentFrame, frameJump, width)
87 elif (plane == "paralelo"): 127 elif (plane == "paralelo"):
@@ -138,70 +178,192 @@ def alisar_diagonal(boneIK, to_right, repetition, initialFrame = 18, frameJump = @@ -138,70 +178,192 @@ def alisar_diagonal(boneIK, to_right, repetition, initialFrame = 18, frameJump =
138 # raio: "grande" raio = 1.5, velocidade: "rapido" periodo = 45 178 # raio: "grande" raio = 1.5, velocidade: "rapido" periodo = 45
139 # raio: "grande" raio = 1.5, velocidade: "normal" periodo = 55 179 # raio: "grande" raio = 1.5, velocidade: "normal" periodo = 55
140 # raio: "grande" raio = 1.5, velocidade: "lento" periodo = 65 180 # raio: "grande" raio = 1.5, velocidade: "lento" periodo = 65
141 -# @param obj: (objeto) bone, mesh, e.g.  
142 -# @param current_frame: (int) posicao onde o primeiro keyframe vai ser inserido  
143 -# @param raio: (int) raio da circunferencia  
144 -# @param periodo: (int) quantidade de keyframes necessarios para completar uma volta completa  
145 -# @param x: (int) in [0,1,2] define qual eixo vai variar no seno (0 = eixo X, 1 = eixo Y, 2 = eixo Z)  
146 -# @param y: (int) in [0,1,2] define qual eixo vai variar no cosseno (0 = eixo X, 1 = eixo Y, 2 = eixo Z)  
147 -# @param usar_lado_oposto: (bool) inverte o lado da primeira posicao (pode ser util em alguns casos para espelhar)  
148 -# @param usar_sentido_oposto (bool) inverte o sentido do movimento (horario para anti-horario)  
149 -def circular(obj, current_frame, raio, periodo, x = 0, y = 1, usar_lado_oposto = False, usar_sentido_oposto = False, meia_volta = False):  
150 - # limita inferiormente  
151 - if (periodo < 16):  
152 - periodo = 16  
153 - # limita superiormente  
154 - elif (periodo > 360):  
155 - periodo = 360  
156 - # muda lado inicial  
157 - if (usar_lado_oposto):  
158 - k = round(periodo / 2) 181 +def circular(js_movement, current_frame, frame_jump, is_right_hand, is_semicircular = False):
  182 + dict_ray = {
  183 + "pequeno": 0.5,
  184 + "normal": 1.0,
  185 + "grande": 1.5
  186 + }
  187 + dict_period = {
  188 + "lento": 55,
  189 + "normal": 45,
  190 + "rapido": 35
  191 + }
  192 + ray = dict_ray[js_movement["raio"]]
  193 + period = dict_period[js_movement["velocidade"]]
  194 + opposite_side = js_movement["lado_oposto"]
  195 + reverse_way = js_movement["sentido_inverso"]
  196 + actions = util.right_hand_actions if (is_right_hand) else util.left_hand_actions
  197 + hand_param = read_hand_param(js_movement)
  198 + bones = util.right_bones_conf if (is_right_hand) else util.left_bones_conf
  199 + ik = bpy.context.object.pose.bones["ik_FK.R" if (is_right_hand) else "ik_FK.L"]
  200 + if (js_movement["velocidade"] == "lento"):
  201 + period += 10
  202 + elif (js_movement["velocidade"] == "rapido"):
  203 + period -= 10
  204 + if (js_movement["plano"] == "frente-esquerda"):
  205 + x, y = 2, 0
  206 + elif (js_movement["plano"] == "frente-cima"):
  207 + x, y = 2, 1
  208 + else:
  209 + x, y = 0, 1
  210 + k = round(period / 2) if (opposite_side) else 0
  211 + x %= 3
  212 + y %= 3
  213 + if (reverse_way):
  214 + tmp = x
  215 + x = y
  216 + y = tmp
  217 + util.setPose(actions, hand_param, [current_frame], bones, False)
  218 + util.keyframe_insert(bones, "location", current_frame, False, False)
  219 + ik_loc = [ik.location[0], ik.location[1], ik.location[2]]
  220 + limit = period + k - 1
  221 + if (is_semicircular):
  222 + limit = round(period / 2) + k
  223 + for i in range(k, limit + 1):
  224 + bpy.context.object.pose_library = bpy.data.actions[util.conf_direita_id if (is_right_hand) else util.conf_esquerda_id]
  225 + bpy.ops.poselib.apply_pose(pose_index = hand_param[0])
  226 + bpy.context.object.pose_library = None
  227 + util.keyframe_insert(bones, "location", current_frame, False)
  228 + util.keyframe_insert(bones, "rotation_quaternion", current_frame, False)
  229 + ik.location[x] = ik_loc[x] + (ray * math.cos(i / period * (2 * math.pi)))
  230 + ik.location[y] = ik_loc[y] + (ray * math.sin(i / period * (2 * math.pi)))
  231 + util.keyframe_insert(ik, "location", current_frame)
  232 + util.keyframe_insert(ik, "rotation_quaternion", current_frame, False)
  233 + current_frame += 1
  234 + return current_frame
  235 +
  236 +def helicoidal(js_movement, current_frame, frame_jump, is_right_hand):
  237 + dict_ray = {
  238 + "pequeno": 0.5,
  239 + "normal": 1.0,
  240 + "grande": 1.5
  241 + }
  242 + dict_period = {
  243 + "lento": 55,
  244 + "normal": 45,
  245 + "rapido": 35
  246 + }
  247 + ray = dict_ray[js_movement["raio"]]
  248 + period = dict_period[js_movement["velocidade"]]
  249 + opposite_side = js_movement["lado_oposto"]
  250 + reverse_way = js_movement["sentido_inverso"]
  251 + actions = util.right_hand_actions if (is_right_hand) else util.left_hand_actions
  252 + hand_param = read_hand_param(js_movement)
  253 + bones = util.right_bones_conf if (is_right_hand) else util.left_bones_conf
  254 + ik = bpy.context.object.pose.bones["ik_FK.R" if (is_right_hand) else "ik_FK.L"]
  255 + if (js_movement["velocidade"] == "lento"):
  256 + period += 10
  257 + elif (js_movement["velocidade"] == "rapido"):
  258 + period -= 10
  259 + if (js_movement["plano"] == "frente-esquerda"):
  260 + x, y, z = 2, 0, 1
  261 + elif (js_movement["plano"] == "frente-cima"):
  262 + x, y, z = 2, 1, 0
159 else: 263 else:
160 - k = 0  
161 - # evita estouro dos indices 264 + x, y, z = 0, 1, 2
  265 + k = round(period / 2) if (opposite_side) else 0
162 x %= 3 266 x %= 3
163 y %= 3 267 y %= 3
164 - # inverte direcao do movimento  
165 - if (usar_sentido_oposto): 268 + if (reverse_way):
166 tmp = x 269 tmp = x
167 x = y 270 x = y
168 y = tmp 271 y = tmp
169 - # copia posicao inicial para transladar  
170 - loc = [obj.location[0], obj.location[1], obj.location[2]]  
171 - # semi-circular  
172 - limite = periodo + k  
173 - if (meia_volta):  
174 - limite = round(limite / 2)  
175 - for i in range(k, limite + 1):  
176 - # reduz a quantidade de keyframes  
177 - if (current_frame % 2 == 0):  
178 - obj.location[x] = loc[x] + (raio * math.cos(i / periodo * (2 * math.pi)))  
179 - obj.location[y] = loc[y] + (raio * math.sin(i / periodo * (2 * math.pi)))  
180 - util.keyframe_insert(obj, 'location', current_frame) 272 + util.setPose(actions, hand_param, [current_frame], bones, False)
  273 + util.keyframe_insert(bones, "location", current_frame, False, False)
  274 + ik_loc = [ik.location[0], ik.location[1], ik.location[2]]
  275 + limit = period + k - 1
  276 + for i in range(k, 2 * (limit + 1)):
  277 + bpy.context.object.pose_library = bpy.data.actions[util.conf_direita_id if (is_right_hand) else util.conf_esquerda_id]
  278 + bpy.ops.poselib.apply_pose(pose_index = hand_param[0])
  279 + bpy.context.object.pose_library = None
  280 + util.keyframe_insert(bones, "location", current_frame, False)
  281 + util.keyframe_insert(bones, "rotation_quaternion", current_frame, False)
  282 + ik.location[x] = ik_loc[x] + (ray * math.cos(i / period * (2 * math.pi)))
  283 + ik.location[y] = ik_loc[y] + (ray * math.sin(i / period * (2 * math.pi)))
  284 + ik.location[z] = ik_loc[z] + (i / period) - ray
  285 + util.keyframe_insert(ik, "location", current_frame)
  286 + util.keyframe_insert(ik, "rotation_quaternion", current_frame, False)
181 current_frame += 1 287 current_frame += 1
182 - util.keyframe_insert(obj, 'location', current_frame)  
183 - return periodo - 1 288 + return current_frame
184 289
185 def pontual(js_movement, current_frame, frame_jump, is_right_hand): 290 def pontual(js_movement, current_frame, frame_jump, is_right_hand):
186 hand_param = read_hand_param(js_movement) 291 hand_param = read_hand_param(js_movement)
187 bones = util.right_bones_conf if is_right_hand else util.left_bones_conf 292 bones = util.right_bones_conf if is_right_hand else util.left_bones_conf
188 hand_actions = util.right_hand_actions if is_right_hand else util.left_hand_actions 293 hand_actions = util.right_hand_actions if is_right_hand else util.left_hand_actions
189 - util.keyframe_insert(bones, 'location', current_frame) 294 + util.keyframe_insert(bones, "location", current_frame)
190 current_frame += frame_jump 295 current_frame += frame_jump
191 util.setPose(hand_actions, hand_param, [current_frame], bones) 296 util.setPose(hand_actions, hand_param, [current_frame], bones)
192 current_frame += frame_jump 297 current_frame += frame_jump
193 - util.keyframe_insert(bones, 'location', current_frame) 298 + util.keyframe_insert(bones, "location", current_frame)
194 return current_frame 299 return current_frame
195 300
196 def retilineo(js_movement, current_frame, frame_jump, is_right_hand): 301 def retilineo(js_movement, current_frame, frame_jump, is_right_hand):
197 - hand_param = [js_movement['configuracao'], js_movement['articulacao_inicial'], js_movement['orientacao']] 302 + hand_param = [js_movement["configuracao_inicial"], js_movement["articulacao_inicial"], js_movement["orientacao_inicial"]]
198 bones = util.right_bones_conf if is_right_hand else util.left_bones_conf 303 bones = util.right_bones_conf if is_right_hand else util.left_bones_conf
199 hand_actions = util.right_hand_actions if is_right_hand else util.left_hand_actions 304 hand_actions = util.right_hand_actions if is_right_hand else util.left_hand_actions
200 - util.keyframe_insert(bones, 'location', current_frame) 305 + util.keyframe_insert(bones, "location", current_frame)
201 current_frame += frame_jump 306 current_frame += frame_jump
202 util.setPose(hand_actions, hand_param, [current_frame], bones) 307 util.setPose(hand_actions, hand_param, [current_frame], bones)
203 - current_frame += 2* frame_jump  
204 - hand_param = [js_movement['configuracao'], js_movement['articulacao_final'], js_movement['orientacao']] 308 + current_frame += 2 * frame_jump
  309 + hand_param = [js_movement["configuracao_final"], js_movement["articulacao_final"], js_movement["orientacao_final"]]
205 util.setPose(hand_actions, hand_param, [current_frame], bones) 310 util.setPose(hand_actions, hand_param, [current_frame], bones)
206 - util.keyframe_insert(bones, 'location', current_frame) 311 + util.keyframe_insert(bones, "location", current_frame)
  312 + return current_frame
  313 +
  314 +def semicircular(js_movement, current_frame, frame_jump, is_right_hand):
  315 + return circular(js_movement, current_frame, frame_jump, is_right_hand, True)
  316 +
  317 +def senoidal(js_movement, current_frame, frame_jump, is_right_hand):
  318 + dict_ray = {
  319 + "pequeno": 0.5,
  320 + "normal": 1.0,
  321 + "grande": 1.5
  322 + }
  323 + dict_period = {
  324 + "lento": 55,
  325 + "normal": 45,
  326 + "rapido": 35
  327 + }
  328 + ray = dict_ray[js_movement["raio"]]
  329 + period = dict_period[js_movement["velocidade"]]
  330 + opposite_side = js_movement["lado_oposto"]
  331 + reverse_way = js_movement["sentido_inverso"]
  332 + actions = util.right_hand_actions if (is_right_hand) else util.left_hand_actions
  333 + hand_param = read_hand_param(js_movement)
  334 + bones = util.right_bones_conf if (is_right_hand) else util.left_bones_conf
  335 + ik = bpy.context.object.pose.bones["ik_FK.R" if (is_right_hand) else "ik_FK.L"]
  336 + if (js_movement["velocidade"] == "lento"):
  337 + period += 10
  338 + elif (js_movement["velocidade"] == "rapido"):
  339 + period -= 10
  340 + if (js_movement["plano"] == "frente-esquerda"):
  341 + x, y, z = 2, 0, 1
  342 + elif (js_movement["plano"] == "frente-cima"):
  343 + x, y, z = 2, 1, 0
  344 + else:
  345 + x, y, z = 0, 1, 2
  346 + k = round(period / 2) if (opposite_side) else 0
  347 + x %= 3
  348 + y %= 3
  349 + if (reverse_way):
  350 + tmp = x
  351 + x = y
  352 + y = tmp
  353 + util.setPose(actions, hand_param, [current_frame], bones, False)
  354 + util.keyframe_insert(bones, "location", current_frame, False, False)
  355 + ik_loc = [ik.location[0], ik.location[1], ik.location[2]]
  356 + limit = period + k - 1
  357 + for i in range(k, 2 * (limit + 1)):
  358 + bpy.context.object.pose_library = bpy.data.actions[util.conf_direita_id if (is_right_hand) else util.conf_esquerda_id]
  359 + bpy.ops.poselib.apply_pose(pose_index = hand_param[0])
  360 + bpy.context.object.pose_library = None
  361 + util.keyframe_insert(bones, "location", current_frame, False)
  362 + util.keyframe_insert(bones, "rotation_quaternion", current_frame, False)
  363 + ik.location[x] = ik_loc[x] + (ray * math.cos(i / period * (2 * math.pi)))
  364 + ik.location[y] = ik_loc[y] + (ray )#* math.sin(i / period * (2 * math.pi)))
  365 + #ik.location[z] = ik_loc[z] + (i / period) - ray
  366 + util.keyframe_insert(ik, "location", current_frame)
  367 + util.keyframe_insert(ik, "rotation_quaternion", current_frame, False)
  368 + current_frame += 1
207 return current_frame 369 return current_frame
208 \ No newline at end of file 370 \ No newline at end of file
1 # -*- coding: UTF-8 -*- 1 # -*- coding: UTF-8 -*-
2 2
3 -# @def Função para obter data e hora atual do sistema  
4 -# @param string Formato de data e hora  
5 -# @return string Retorna data e hora do sistema no momento da chamada  
6 -def getTimeStamp(dtFrmt='%Y-%m-%d_%H.%M.%S.%f'):  
7 - from datetime import datetime  
8 - if (dtFrmt == '%Y-%m-%d_%H.%M.%S.%f'):  
9 - # [:-3] Remove 3 casas decimais dos milisegundos (ms)  
10 - return datetime.now().strftime(dtFrmt)[:-3] 3 +import datetime
  4 +import logging
  5 +import os
  6 +import shutil
  7 +import sys
  8 +
  9 +# @def funcao para obter data e hora atual do sistema
  10 +# @param string formato de data e hora
  11 +# @return string retorna data e hora do sistema no momento da chamada
  12 +def getTimeStamp(date_fmt = "%Y-%m-%d %H:%M:%S.%f"):
  13 + if ("%f" in date_fmt):
  14 + # [:-3] remove 3 casas decimais dos milisegundos (ms)
  15 + return datetime.datetime.now().strftime(date_fmt)[:-3]
11 else: 16 else:
12 - return datetime.now().strftime(dtFrmt)  
13 -  
14 -# @def Função para gravar log dos eventos em arquivo  
15 -# @param string Mensagem a ser salva  
16 -# @param int indice do tipo de log 1: Debug, 2: Info, 3: Warn, 4: Error, 5: Critical  
17 -# @param String Caminho completo do arquivo de logs  
18 -# @param String Formato de tempo utilizado  
19 -def log(logMsg="", logLevel=2, logFile="events.log", dtFrmt='%Y-%m-%d %H:%M:%S'):  
20 - import logging  
21 -  
22 - logLevelArray = ["", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL" ]  
23 - logLevel %= len(logLevelArray)  
24 - print("[%s] log %s: %s" % (getTimeStamp(), logLevelArray[logLevel], logMsg))  
25 -  
26 - #logFormat='[%(asctime)s.%(msecs).03d] %(levelname)s: <User: %(name)s> <Module: %(module)s> <Function: %(funcName)s>: %(message)s'  
27 - logFormat='[%(asctime)s.%(msecs).03d] %(levelname)s: %(message)s'  
28 -  
29 - if (logLevel == 1):  
30 - logging.basicConfig(filename=logFile, datefmt=dtFrmt, format=logFormat, level=logging.DEBUG)  
31 - logging.Formatter(fmt='%(asctime)s',datefmt='%Y/%m/%d,%H:%M:%S.%f')  
32 - logging.debug(logMsg)  
33 -  
34 - elif (logLevel == 2):  
35 - logging.basicConfig(filename=logFile, datefmt=dtFrmt, format=logFormat, level=logging.INFO)  
36 - logging.Formatter(fmt='%(asctime)s',datefmt='%Y/%m/%d,%H:%M:%S.%f')  
37 - logging.info(logMsg)  
38 -  
39 - elif (logLevel == 3):  
40 - logging.basicConfig(filename=logFile, datefmt=dtFrmt, format=logFormat, level=logging.WARN)  
41 - logging.Formatter(fmt='%(asctime)s',datefmt='%Y/%m/%d,%H:%M:%S.%f')  
42 - logging.warn(logMsg)  
43 -  
44 - elif (logLevel == 4):  
45 - logging.basicConfig(filename=logFile, datefmt=dtFrmt, format=logFormat, level=logging.ERROR)  
46 - logging.Formatter(fmt='%(asctime)s',datefmt='%Y/%m/%d,%H:%M:%S.%f')  
47 - logging.error(logMsg)  
48 -  
49 - elif (logLevel == 5):  
50 - logging.basicConfig(filename=logFile, datefmt=dtFrmt, format=logFormat, level=logging.CRITICAL)  
51 - logging.Formatter(fmt='%(asctime)s',datefmt='%Y/%m/%d,%H:%M:%S.%f')  
52 - logging.critical(logMsg)  
53 -  
54 -def test_log():  
55 - msg = " This is a message "  
56 - log(msg + "Debug", 1)  
57 - log(msg + "Info", 2)  
58 - log(msg + "Warn", 3)  
59 - log(msg + "Error", 4)  
60 - log(msg + "Critical", 5)  
61 -  
62 -# test_log()  
63 -  
64 -# @def Função para exibir exceção  
65 -# @param string deve ser passado: "__file__" para identificar em qual arquivo ocorreu a exceção  
66 -# @return int Retorna 1  
67 -def print_stack_trace(fromFile):  
68 - from sys import exc_info  
69 - from os.path import basename 17 + return datetime.datetime.now().strftime(date_fmt)
  18 +
  19 +# @def funcao para gravar log dos eventos em arquivo
  20 +# @param string mensagem a ser salva
  21 +# @param int indice do tipo de log 0: apenas print, 1: debug, 2: info, 3: warn, 4: error, 5: critical
  22 +# @param string caminho completo do arquivo de logs
  23 +# @param string formato de tempo utilizado
  24 +# @return none
  25 +def log(msg = "", log_level = 2, log_file = "events.log"):
  26 + dict_level = {
  27 + 0: ["Print", None, None],
  28 + 1: ["DEBUG", logging.DEBUG, logging.debug],
  29 + 2: ["INFO", logging.INFO, logging.info],
  30 + 3: ["WARNING", logging.WARN, logging.warn],
  31 + 4: ["ERROR", logging.ERROR, logging.error],
  32 + 5: ["CRITICAL", logging.CRITICAL, logging.critical]
  33 + }
  34 + # log_format = "[%(asctime)s.%(msecs).03d] %(levelname)s: <User: %(name)s> <Module: %(module)s> <Function: %(funcName)s>: %(message)s"
  35 + log_format = "[%(asctime)s.%(msecs).03d] %(levelname)s: %(message)s"
  36 + date_fmt = "%Y-%m-%d %H:%M:%S"
  37 + logging.basicConfig(filename = log_file, datefmt = date_fmt, format = log_format, level = dict_level[log_level][1])
  38 + logging.Formatter(fmt = "%(asctime)s", datefmt = date_fmt)
  39 + log_level %= len(dict_level)
  40 + write_mode = dict_level[log_level][2]
  41 + print("[%s] %s: %s" % (getTimeStamp(), dict_level[log_level][0], msg))
  42 + if (write_mode != None):
  43 + write_mode(msg)
  44 + return
  45 +
  46 +# @def funcao para exibir excecao
  47 +# @param string deve ser passado: "__file__" para identificar em qual modulo ocorreu a excecao
  48 +# @return int retorna 1
  49 +def print_stack_trace():
70 error = "\n File name: %s\n Function name: %s\n Line code: %s\n Type exception: %s\n Message: %s" % ( 50 error = "\n File name: %s\n Function name: %s\n Line code: %s\n Type exception: %s\n Message: %s" % (
71 - basename(fromFile), # basename(exc_info()[2].tb_frame.f_code.co_filename),  
72 - exc_info()[2].tb_frame.f_code.co_name,  
73 - exc_info()[2].tb_lineno,  
74 - exc_info()[0].__name__,  
75 - exc_info()[1] 51 + os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename),
  52 + sys.exc_info()[2].tb_frame.f_code.co_name,
  53 + sys.exc_info()[2].tb_lineno,
  54 + sys.exc_info()[0].__name__,
  55 + sys.exc_info()[1]
76 ) 56 )
77 log(error, 4) 57 log(error, 4)
78 return 1 58 return 1
79 59
80 -# @def Função que verifica se um arquivo existe  
81 -# @param string filePath: Caminho do arquivo a ser checado  
82 -# @return bool Verdadeiro se o arquivo existir, Falso caso contrário  
83 -def file_exists(filePath):  
84 - from os.path import isfile, exists  
85 - if ((isfile(filePath) == 1) and (exists(filePath) == 1)): 60 +# @def funcao que verifica se um arquivo existe
  61 +# @param string caminho do arquivo a ser checado
  62 +# @return bool verdadeiro se o arquivo existir, falso caso contrario
  63 +def file_exists(file_path):
  64 + if ((os.path.isfile(file_path) == 1) and (os.path.exists(file_path) == 1)):
86 return True 65 return True
87 else: 66 else:
88 return False 67 return False
89 68
90 -# @def Função para renomear arquivo de video gerado pelo blender  
91 -# @see entrada: /temp/arquivo_video_0001-0250.mp4  
92 -# @see saida: /temp/arquivo_video.mp4  
93 -# @param string fileFullPath: Caminho do arquivo a ser renomeado  
94 -# @param bool useTimeStamp: Renomeia o arquivo de acordo com a data e hora do sistema  
95 -# @param bool overwrite: Sobreescreve o arquivo  
96 -# @return string Retorna o nome do arquivo renomeado  
97 -def file_rename(fileFullPath, useTimeStamp = False, overwrite = True):  
98 - from shutil import move  
99 - from os.path import abspath, basename, dirname, join, splitext  
100 - if (file_exists(fileFullPath) == False): 69 +# @def funcao para renomear arquivo de video gerado pelo blender
  70 +# entrada: /temp/arquivo_video_0001-0250.mp4
  71 +# saida: /temp/arquivo_video.mp4
  72 +# @param string caminho do arquivo a ser renomeado
  73 +# @param bool renomeia o arquivo de acordo com a data e hora do sistema
  74 +# @param bool sobreescreve o arquivo
  75 +# @return string retorna o nome do arquivo renomeado
  76 +def file_rename(file_full_path, use_time_stamp = False, overwrite = True):
  77 + if (file_exists(file_full_path) == False):
101 return "" 78 return ""
102 - filePath = dirname(abspath(fileFullPath))  
103 - filename = basename(splitext(fileFullPath)[0])  
104 - extension = splitext(fileFullPath)[1]  
105 - filenameInv = ""  
106 - isValidChar = False  
107 -  
108 - # Percorre o "filename" do final para o inicio copiando caracteres após o primeiro '_' encontrado 79 + file_path = os.path.dirname(os.path.abspath(file_full_path))
  80 + filename = os.path.basename(os.path.splitext(file_full_path)[0])
  81 + extension = os.path.splitext(file_full_path)[1]
  82 + filename_reversed = ""
  83 + valid_char = False
  84 + # percorre o "filename" do final para o inicio copiando caracteres apos o primeiro "_" encontrado
109 for char in reversed(filename): 85 for char in reversed(filename):
110 - if (isValidChar == True):  
111 - filenameInv += char  
112 - if (char == '_'):  
113 - isValidChar = True 86 + if (valid_char == True):
  87 + filename_reversed += char
  88 + if (char == "_"):
  89 + valid_char = True
114 try: 90 try:
115 -  
116 - # Inverte sequencia de caracteres que foi copiada  
117 - filenameInv = filenameInv[::-1]  
118 -  
119 - if (useTimeStamp == True):  
120 - # Recupera novo fullPath + nome do arquivo + data/hora + extensão  
121 - newFilename = join(filePath, "%s_%s%s" % (filenameInv, getTimeStamp(), extension)) 91 + # inverte sequencia de caracteres que foi copiada
  92 + filename_reversed = filename_reversed[::-1]
  93 + if (use_time_stamp == True):
  94 + # recupera novo file_full_path + nome do arquivo + data/hora + extensao
  95 + new_filename = os.path.join(file_path, "%s_%s%s" % (filename_reversed, getTimeStamp(), extension))
122 else: 96 else:
123 - # Recupera novo fullPath + nome do arquivo + extensão  
124 - newFilename = join(filePath, "%s%s" % (filenameInv, extension))  
125 -  
126 - # Enumera o nome do arquivo caso o parametro "overwrite" seja "False" e o arquivo já exista 97 + # recupera novo file_full_path + nome do arquivo + extensao
  98 + new_filename = os.path.join(file_path, "%s%s" % (filename_reversed, extension))
  99 + # Enumera o nome do arquivo caso o parametro "overwrite" seja "False" e o arquivo ja exista
127 if (overwrite == False): 100 if (overwrite == False):
128 count = 0 101 count = 0
129 - while (file_exists(newFilename) == True): 102 + while (file_exists(new_filename) == True):
130 count += 1 103 count += 1
131 - # newFilename = join(filePath, "%s_%i%s" % (filenameInv, count, extension))  
132 - newFilename = join(filePath, "%s_%0.4i%s" % (filenameInv, count, extension))  
133 -  
134 - log("Rename: '%s' to: '%s'" %(fileFullPath, newFilename))  
135 - move(fileFullPath, newFilename)  
136 - return newFilename  
137 -  
138 - except Exception as e:  
139 - printStackTrace(__file__) 104 + # new_filename = join(file_path, "%s_%i%s" % (filename_reversed, count, extension))
  105 + new_filename = os.path.join(file_path, "%s_%0.4i%s" % (filename_reversed, count, extension))
  106 + # log('rename: "%s" to: "%s"' %(file_full_path, new_filename))
  107 + shutil.move(file_full_path, new_filename)
  108 + return new_filename
  109 + except Exception:
  110 + print_stack_trace()
140 return "" 111 return ""
  112 +
  113 +"""
  114 +# unit test
  115 +def main():
  116 + msg = "This is a message of "
  117 + log(msg + "Print", 0)
  118 + log(msg + "Debug", 1)
  119 + log(msg + "Info", 2)
  120 + log(msg + "Warn", 3)
  121 + log(msg + "Error", 4)
  122 + log(msg + "Critical", 5)
  123 + filename = "sample_001-250.mp4"
  124 + video = open(filename, "w")
  125 + video.write
  126 + video.close
  127 + file_rename(filename)
  128 + return
  129 +
  130 +if __name__ == "__main__":
  131 + main()
  132 +"""
141 \ No newline at end of file 133 \ No newline at end of file
1 # -*- coding: UTF-8 -*- 1 # -*- coding: UTF-8 -*-
2 2
3 import bpy 3 import bpy
  4 +import copy
  5 +import json
4 import math 6 import math
5 import os 7 import os
6 -import sys  
7 -import copy  
8 import pyutil 8 import pyutil
  9 +import sys
9 from bmesh_collision import bmesh_check_intersect_objects 10 from bmesh_collision import bmesh_check_intersect_objects
10 11
11 armature = bpy.context.scene.objects.get('Armature.001') 12 armature = bpy.context.scene.objects.get('Armature.001')
@@ -20,15 +21,13 @@ dict_bones = { @@ -20,15 +21,13 @@ dict_bones = {
20 "07_facial": ['BnPescoco', 'BnCabeca', 'BnSobrancCentro.L', 'BnSobrancCentro.R', 'BnSobrancLateral.L', 'BnSobrancLateral.R', 'BnPalpebSuper.L', 'BnPalpebInfe.L', 'BnSobrancCentro', 'BnLabioCentroSuper', 'BnBochecha.L', 'BnBochecha.R', 'BnLabioCentroInfer', 'BnBocaCanto.L', 'BnBocaCanto.R', 'BnMandibula', 'BnLingua', 'BnLingua.003', 'BnLingua.001', 'BnLingua.002', 'BnPalpebSuper.R', 'BnPalpebInfe.R', 'BnOlhosMira', 'BnOlhoMira.L', 'BnOlhoMira.R', 'BnOlho.L', 'BnOlho.R'] 21 "07_facial": ['BnPescoco', 'BnCabeca', 'BnSobrancCentro.L', 'BnSobrancCentro.R', 'BnSobrancLateral.L', 'BnSobrancLateral.R', 'BnPalpebSuper.L', 'BnPalpebInfe.L', 'BnSobrancCentro', 'BnLabioCentroSuper', 'BnBochecha.L', 'BnBochecha.R', 'BnLabioCentroInfer', 'BnBocaCanto.L', 'BnBocaCanto.R', 'BnMandibula', 'BnLingua', 'BnLingua.003', 'BnLingua.001', 'BnLingua.002', 'BnPalpebSuper.R', 'BnPalpebInfe.R', 'BnOlhosMira', 'BnOlhoMira.L', 'BnOlhoMira.R', 'BnOlho.L', 'BnOlho.R']
21 } 22 }
22 23
23 -right_bones_conf = dict_bones["01_conf_direita"] + dict_bones["03_pa_direita"] + dict_bones["05_orient_direita"]  
24 -  
25 -left_bones_conf = dict_bones["02_conf_esquerda"] + dict_bones["04_pa_esquerda"] + dict_bones["06_orient_esquerda"]  
26 -  
27 -# Vetor com indices de cada bone do lado direito  
28 -#rightBonesConf = [1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]  
29 -  
30 -# Vetor com indices de cada bone do lado esquerdo  
31 -#leftBonesConf = [0, 43, 44, 45, 46, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82] 24 +dict_interpolation = {
  25 + "inicial": 20,
  26 + "lento": 15,
  27 + "normal": 10,
  28 + "rapido": 5,
  29 + "final": 20
  30 +}
32 31
33 # Movimento coçar - Índices de poses 32 # Movimento coçar - Índices de poses
34 cocar_mao_aberta_index = 55 33 cocar_mao_aberta_index = 55
@@ -36,21 +35,29 @@ cocar_mao_fechada_index = 24 @@ -36,21 +35,29 @@ cocar_mao_fechada_index = 24
36 cocar_orientation_index = 11 35 cocar_orientation_index = 11
37 36
38 # Action expressão facial 37 # Action expressão facial
39 -facial_expression_id = '07_facial' 38 +facial_expression_id = "07_facial"
40 facial_expression_action = [facial_expression_id] 39 facial_expression_action = [facial_expression_id]
41 40
42 # Actions mão direita 41 # Actions mão direita
43 -conf_direita_id = '01_conf_direita'  
44 -pa_direita_id = '03_pa_direita'  
45 -orient_direita_id = '05_orient_direita' 42 +conf_direita_id = "01_conf_direita"
  43 +pa_direita_id = "03_pa_direita"
  44 +orient_direita_id = "05_orient_direita"
46 right_hand_actions = [conf_direita_id, pa_direita_id, orient_direita_id] 45 right_hand_actions = [conf_direita_id, pa_direita_id, orient_direita_id]
47 46
48 # Actions mão esquerda 47 # Actions mão esquerda
49 -conf_esquerda_id = '02_conf_esquerda'  
50 -pa_esquerda_id = '04_pa_esquerda'  
51 -orient_esquerda_id = '06_orient_esquerda' 48 +conf_esquerda_id = "02_conf_esquerda"
  49 +pa_esquerda_id = "04_pa_esquerda"
  50 +orient_esquerda_id = "06_orient_esquerda"
52 left_hand_actions = [conf_esquerda_id, pa_esquerda_id, orient_esquerda_id] 51 left_hand_actions = [conf_esquerda_id, pa_esquerda_id, orient_esquerda_id]
53 52
  53 +all_actions = [conf_direita_id, conf_esquerda_id, pa_direita_id, pa_esquerda_id, orient_direita_id, orient_esquerda_id, facial_expression_id]
  54 +
  55 +all_bones = dict_bones[conf_direita_id] + dict_bones[conf_esquerda_id] + dict_bones[pa_direita_id] + dict_bones[pa_esquerda_id] + dict_bones[orient_direita_id] + dict_bones[orient_esquerda_id] + dict_bones[facial_expression_id]
  56 +
  57 +right_bones_conf = dict_bones[conf_direita_id] + dict_bones[pa_direita_id] + dict_bones[orient_direita_id]
  58 +
  59 +left_bones_conf = dict_bones[conf_esquerda_id] + dict_bones[pa_esquerda_id] + dict_bones[orient_esquerda_id]
  60 +
54 last_keyframe_dict = {} 61 last_keyframe_dict = {}
55 62
56 def select_bones(bones = bpy.context.object.pose.bones): 63 def select_bones(bones = bpy.context.object.pose.bones):
@@ -86,7 +93,6 @@ def delete_all_keyframes(): @@ -86,7 +93,6 @@ def delete_all_keyframes():
86 obj.animation_data_clear() 93 obj.animation_data_clear()
87 return 94 return
88 95
89 -# Função responsável por selecionar as pose-libs e setar os frames  
90 def setPose(actions, parametesConf, positionFrames, bones, collisionFlag = True): 96 def setPose(actions, parametesConf, positionFrames, bones, collisionFlag = True):
91 for x in range(len(positionFrames)): 97 for x in range(len(positionFrames)):
92 for l in range(len(actions)): 98 for l in range(len(actions)):
@@ -110,7 +116,7 @@ def internal_keyframe_insert(bone, path, positionFrame, collisionFlag = True, ro @@ -110,7 +116,7 @@ def internal_keyframe_insert(bone, path, positionFrame, collisionFlag = True, ro
110 if ("ik_FK" in bone.name and bone.location.z < 1): 116 if ("ik_FK" in bone.name and bone.location.z < 1):
111 bone.location.z = 1 117 bone.location.z = 1
112 bone.bone.select = True 118 bone.bone.select = True
113 - bone.keyframe_insert(data_path = path, index = -1, frame = positionFrame) 119 + bone.keyframe_insert(data_path = path, index = -1, group = bone.name, frame = positionFrame)
114 bone.bone.select = False 120 bone.bone.select = False
115 keyframe_id = bone.name + "_" + path 121 keyframe_id = bone.name + "_" + path
116 last_keyframe = last_keyframe_dict[keyframe_id] if keyframe_id in last_keyframe_dict else 0 122 last_keyframe = last_keyframe_dict[keyframe_id] if keyframe_id in last_keyframe_dict else 0
@@ -184,7 +190,6 @@ def check_collision(objName, otherObjName, initFrame, endFrame): @@ -184,7 +190,6 @@ def check_collision(objName, otherObjName, initFrame, endFrame):
184 scene = bpy.context.scene 190 scene = bpy.context.scene
185 startFrame = initFrame + int(math.fabs((endFrame - initFrame)/2)) 191 startFrame = initFrame + int(math.fabs((endFrame - initFrame)/2))
186 collisionFrame = -1 192 collisionFrame = -1
187 -  
188 for i in range(startFrame, endFrame + 1, 1): 193 for i in range(startFrame, endFrame + 1, 1):
189 scene.frame_set(i) 194 scene.frame_set(i)
190 obj = scene.objects.get(objName) 195 obj = scene.objects.get(objName)
@@ -222,10 +227,9 @@ def configure_output(): @@ -222,10 +227,9 @@ def configure_output():
222 bpy.context.scene.render.tile_y = 240 227 bpy.context.scene.render.tile_y = 240
223 return 228 return
224 229
225 -def render_sign(user_id, nome_sinal = "sinal", frame_final = bpy.context.scene.frame_end): 230 +def render_sign(user_id = "", sinal = "", frame_final = bpy.context.scene.frame_end):
226 getcwd = os.path.dirname(os.path.abspath(__file__)) 231 getcwd = os.path.dirname(os.path.abspath(__file__))
227 - bpy.context.scene.render.filepath = getcwd + "/users/" + str(user_id) + "/"+ nome_sinal + "_"  
228 - bpy.ops.wm.save_as_mainfile(filepath=getcwd + "/users/" + str(user_id) + "/"+ nome_sinal + ".blend") 232 + bpy.context.scene.render.filepath = os.path.join(getcwd, "users", user_id, sinal + "_")
229 bpy.context.scene.frame_end = frame_final 233 bpy.context.scene.frame_end = frame_final
230 pyutil.log("Gerando Video... Frames: %i" % (frame_final)) 234 pyutil.log("Gerando Video... Frames: %i" % (frame_final))
231 bpy.ops.render.render(animation = True, write_still = False, layer = "", scene = "") 235 bpy.ops.render.render(animation = True, write_still = False, layer = "", scene = "")
@@ -233,6 +237,39 @@ def render_sign(user_id, nome_sinal = &quot;sinal&quot;, frame_final = bpy.context.scene.f @@ -233,6 +237,39 @@ def render_sign(user_id, nome_sinal = &quot;sinal&quot;, frame_final = bpy.context.scene.f
233 bpy.ops.wm.quit_blender() 237 bpy.ops.wm.quit_blender()
234 return 238 return
235 239
  240 +def make_dir(directory):
  241 + if not os.path.exists(directory):
  242 + os.makedirs(directory)
  243 + return True
  244 + return False
  245 +
  246 +def export_blend(directory, filename, frame_start, frame_current, frame_end):
  247 + tmp_frame_start = bpy.context.scene.frame_start
  248 + tmp_frame_current = bpy.context.scene.frame_current
  249 + tmp_frame_end = bpy.context.scene.frame_end
  250 + bpy.context.scene.frame_start = frame_start
  251 + bpy.context.scene.frame_current = frame_current
  252 + bpy.context.scene.frame_end = frame_end
  253 + make_dir(directory)
  254 + bpy.ops.wm.save_as_mainfile(filepath = os.path.join(directory, filename))
  255 + bpy.context.scene.frame_start = tmp_frame_start
  256 + bpy.context.scene.frame_current = tmp_frame_current
  257 + bpy.context.scene.frame_end = tmp_frame_end
  258 +
  259 +def export_json(obj, directory, filename, inline = True):
  260 + make_dir(directory)
  261 + fp = open(os.path.join(directory, filename), 'w', encoding = "utf-8")
  262 + fp.write(
  263 + json.dumps(
  264 + obj,
  265 + ensure_ascii = False,
  266 + indent = None if (inline) else 4,
  267 + separators = (",", ":") if (inline) else None
  268 + )
  269 + )
  270 + fp.close
  271 + return
  272 +
236 def validate_rotation(bone, endFrame, startFrame = 0): 273 def validate_rotation(bone, endFrame, startFrame = 0):
237 if (endFrame - startFrame == 1): 274 if (endFrame - startFrame == 1):
238 return True 275 return True