Commit 42f9b71dfdf89a60aa1a3885a06117450f618fb8

Authored by André Araújo
1 parent 2b000538
Exists in master

Adiciona movimento retilíneo

Makefile
1   -#JSON = $(JSON_CIRCULAR)
2   -JSON = $(JSON_PONTUAL)
  1 +JSON = $(JSON_RETILINEO)
  2 +
  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)
  15 +# ----------------------------
3 16  
4 17 JSON_CIRCULAR = \
5 18 '{ \
... ... @@ -8,11 +21,7 @@ JSON_CIRCULAR = \
8 21 "interpolacao": "normal", \
9 22 "movimentos": [ \
10 23 { \
11   - "facial": { \
12   - "expressao": 10, \
13   - "transicao": "normal", \
14   - "duracao": "normal" \
15   - }, \
  24 + "facial": {}, \
16 25 "mao_esquerda": { \
17 26 "circular": { \
18 27 "plano": "esquerda-cima", \
... ... @@ -25,27 +34,104 @@ JSON_CIRCULAR = \
25 34 "orientacao": 20 \
26 35 } \
27 36 }, \
  37 + "mao_direita": {} \
  38 + } \
  39 + ] \
  40 +}'
  41 +
  42 +JSON_CONTATO_ALISAR = \
  43 +'{ \
  44 + "userId": "lavid", \
  45 + "sinal": "modelo_contato_alisar", \
  46 + "interpolacao": "normal", \
  47 + "movimentos": [ \
  48 + { \
  49 + "facial": {}, \
28 50 "mao_direita": { \
29   - } \
30   - }, \
  51 + "contato": { \
  52 + "movimento_orientacao": "paralelo", \
  53 + "alisar": { \
  54 + "articulacao": 71, \
  55 + "configuracao": 19, \
  56 + "orientacao": 11 \
  57 + } \
  58 + } \
  59 + }, \
  60 + "mao_esquerda": {} \
  61 + } \
  62 + ] \
  63 +}'
  64 +
  65 +JSON_CONTATO_COCAR = \
  66 +'{ \
  67 + "userId": "lavid", \
  68 + "sinal": "modelo_contato_cocar", \
  69 + "interpolacao": "normal", \
  70 + "movimentos": [ \
31 71 { \
32   - "facial": { \
33   - "expressao": 11, \
34   - "transicao": "normal", \
35   - "duracao": "normal" \
  72 + "facial": {}, \
  73 + "mao_direita": { \
  74 + "contato": { \
  75 + "cocar": { \
  76 + "articulacao": 71, \
  77 + "configuracao": 19, \
  78 + "orientacao": 11 \
  79 + } \
  80 + } \
36 81 }, \
37   - "mao_esquerda": { \
  82 + "mao_esquerda": {} \
  83 + } \
  84 + ] \
  85 +}'
  86 +
  87 +JSON_CONTATO_TOCAR = \
  88 +'{ \
  89 + "userId": "lavid", \
  90 + "sinal": "modelo_contato_tocar", \
  91 + "interpolacao": "normal", \
  92 + "movimentos": [ \
  93 + { \
  94 + "facial": {}, \
  95 + "mao_direita": { \
  96 + "contato": { \
  97 + "tocar": { \
  98 + "articulacao": 71, \
  99 + "configuracao": 19, \
  100 + "orientacao": 11 \
  101 + } \
  102 + } \
38 103 }, \
  104 + "mao_esquerda": {} \
  105 + } \
  106 + ] \
  107 +}'
  108 +
  109 +JSON_CONTATO_RISCAR = \
  110 +'{ \
  111 + "userId": "lavid", \
  112 + "sinal": "modelo_contato_riscar", \
  113 + "interpolacao": "normal", \
  114 + "movimentos": [ \
  115 + { \
  116 + "facial": {}, \
39 117 "mao_direita": { \
40   - } \
  118 + "contato": { \
  119 + "riscar": { \
  120 + "articulacao": 71, \
  121 + "configuracao": 19, \
  122 + "orientacao": 11 \
  123 + } \
  124 + } \
  125 + }, \
  126 + "mao_esquerda": {} \
41 127 } \
42 128 ] \
43 129 }'
44 130  
45   -JSON_PONTUAL = \
  131 +JSON_FACIAL = \
46 132 '{ \
47 133 "userId": "lavid", \
48   - "sinal": "modelo_pontual", \
  134 + "sinal": "modelo_facial", \
49 135 "interpolacao": "normal", \
50 136 "movimentos": [ \
51 137 { \
... ... @@ -54,6 +140,53 @@ JSON_PONTUAL = \
54 140 "transicao": "normal", \
55 141 "duracao": "normal" \
56 142 }, \
  143 + "mao_direita": {}, \
  144 + "mao_esquerda": {} \
  145 + }, \
  146 + { \
  147 + "facial": { \
  148 + "expressao": 11, \
  149 + "transicao": "normal", \
  150 + "duracao": "normal" \
  151 + } \
  152 + "mao_direita": {}, \
  153 + "mao_esquerda": {} \
  154 + } \
  155 + ] \
  156 +}'
  157 +
  158 +JSON_HELICOIDAL = \
  159 +'{ \
  160 + "userId": "lavid", \
  161 + "sinal": "modelo_helicoidal", \
  162 + "interpolacao": "normal", \
  163 + "movimentos": [ \
  164 + { \
  165 + "facial": {}, \
  166 + "mao_esquerda": { \
  167 + "helicoidal": { \
  168 + "plano": "esquerda-cima", \
  169 + "raio": "pequeno", \
  170 + "velocidade": "normal", \
  171 + "lado_oposto": false, \
  172 + "sentido_inverso": false, \
  173 + "articulacao": 80, \
  174 + "configuracao": 10, \
  175 + "orientacao": 20 \
  176 + } \
  177 + }, \
  178 + "mao_direita": {} \
  179 + } \
  180 +}'
  181 +
  182 +JSON_PONTUAL = \
  183 +'{ \
  184 + "userId": "lavid", \
  185 + "sinal": "modelo_pontual", \
  186 + "interpolacao": "normal", \
  187 + "movimentos": [ \
  188 + { \
  189 + "facial": {}, \
57 190 "mao_direita": { \
58 191 "pontual": { \
59 192 "articulacao": 71, \
... ... @@ -67,6 +200,82 @@ JSON_PONTUAL = \
67 200 ] \
68 201 }'
69 202  
  203 +JSON_RETILINEO = \
  204 +'{ \
  205 + "userId": "lavid", \
  206 + "sinal": "modelo_retilineo", \
  207 + "interpolacao": "normal", \
  208 + "movimentos": [ \
  209 + { \
  210 + "facial": {}, \
  211 + "mao_direita": { \
  212 + "retilineo": { \
  213 + "articulacao_inicial": 71, \
  214 + "articulacao_final": 75, \
  215 + "configuracao": 19, \
  216 + "orientacao": 11 \
  217 + } \
  218 + }, \
  219 + "mao_esquerda": { \
  220 + } \
  221 + } \
  222 + ] \
  223 +}'
  224 +
  225 +JSON_SEMI_CIRCULAR = \
  226 +'{ \
  227 + "userId": "lavid", \
  228 + "sinal": "modelo_semi_circular", \
  229 + "interpolacao": "normal", \
  230 + "movimentos": [ \
  231 + { \
  232 + "facial": {}, \
  233 + "mao_esquerda": { \
  234 + "circular": { \
  235 + "plano": "esquerda-cima", \
  236 + "raio": "pequeno", \
  237 + "velocidade": "normal", \
  238 + "lado_oposto": false, \
  239 + "sentido_inverso": false, \
  240 + "articulacao": 80, \
  241 + "configuracao": 10, \
  242 + "orientacao": 20 \
  243 + } \
  244 + }, \
  245 + "mao_direita": {} \
  246 + } \
  247 + ] \
  248 +}'
  249 +
  250 +JSON_SENOIDAL = \
  251 +'{ \
  252 + "userId": "lavid", \
  253 + "sinal": "modelo_senoidal", \
  254 + "interpolacao": "normal", \
  255 + "movimentos": [ \
  256 + { \
  257 + "facial": { \
  258 + "expressao": 10, \
  259 + "transicao": "normal", \
  260 + "duracao": "normal" \
  261 + }, \
  262 + "mao_esquerda": { \
  263 + "circular": { \
  264 + "plano": "esquerda-cima", \
  265 + "raio": "pequeno", \
  266 + "velocidade": "normal", \
  267 + "lado_oposto": false, \
  268 + "sentido_inverso": false, \
  269 + "articulacao": 80, \
  270 + "configuracao": 10, \
  271 + "orientacao": 20 \
  272 + } \
  273 + }, \
  274 + "mao_direita": { \
  275 + } \
  276 + } \
  277 +}'
  278 +
70 279 BLEND = avatar_cartoon_v2.74.blend
71 280 CONTROLLER = controller.py
72 281 MAIN = libras.py
... ...
decode.py
... ... @@ -3,9 +3,16 @@ import moves
3 3 import util
4 4  
5 5 def circular_semicircular(js_movement, current_frame, frame_jump, is_right_hand, is_semicircular):
6   - # const
7   - dict_ray = {'pequeno': 0.5, 'normal': 1.0, 'grande': 1.5}
8   - dict_period = {'lento': 55, 'normal': 45, 'rapido': 35}
  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 + }
9 16 # decodificar valores
10 17 ray = dict_ray[js_movement['raio']]
11 18 period = dict_period[js_movement['velocidade']]
... ... @@ -39,21 +46,24 @@ def contato(js_movement, current_frame, frame_jump, is_right_hand):
39 46 current_frame = current_frame + 2*frame_jump
40 47 return moves.contato(action, sub_type, mov_param, bones, is_right_hand, current_frame, frame_jump)
41 48  
42   -def espiral(js_movement, current_frame, frame_jump, is_right_hand):
43   - pass
44   -
45   -def redemoinho(js_movement, current_frame, frame_jump, is_right_hand):
46   - pass
  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)
47 51  
48 52 def pontual(js_movement, current_frame, frame_jump, is_right_hand):
49 53 return moves.pontual(js_movement, current_frame, frame_jump, is_right_hand)
50 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 +
51 61 def senoidal(js_movement, current_frame, frame_jump, is_right_hand):
52   - pass
  62 + return moves.senoidal(js_movement, current_frame, frame_jump, is_right_hand)
53 63  
54 64 def hand_mov(current_frame, frame_jump, js_mao, is_right_hand):
55 65 if (js_mao == {}):
56   - return
  66 + return current_frame
57 67 movement_name = next(iter(js_mao.keys()))
58 68 if (movement_name == 'circular'):
59 69 current_frame = circular_semicircular(js_mao[movement_name], current_frame, frame_jump, is_right_hand, False)
... ... @@ -61,12 +71,12 @@ def hand_mov(current_frame, frame_jump, js_mao, is_right_hand):
61 71 current_frame = circular_semicircular(js_mao[movement_name], current_frame, frame_jump, is_right_hand, True)
62 72 elif (movement_name == 'contato'):
63 73 current_frame = contato(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
64   - elif (movement_name == 'espiral'):
  74 + elif (movement_name == 'helicoidal'):
65 75 current_frame = espiral(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
66   - elif (movement_name == 'redemoinho'):
67   - current_frame = redemoinho(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
68 76 elif (movement_name == 'pontual'):
69 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)
70 80 elif (movement_name == 'senoidal'):
71 81 current_frame = senoidal(js_mao[movement_name], current_frame, frame_jump, is_right_hand)
72 82 return current_frame + frame_jump
... ...
libras.py
... ... @@ -64,10 +64,11 @@ def main():
64 64  
65 65 # setar pose padrao inicial em todos os bones ('location' e 'rotation_quaternion')
66 66 endFrame += pose_default(dict_interpolation['inicial'])
67   - timeline_mao_esquerda = endFrame
68   - timeline_mao_direita = endFrame
69 67  
70 68 for i in range(0, len(js_movimentos)):
  69 + timeline_mao_esquerda = endFrame
  70 + timeline_mao_direita = endFrame
  71 +
71 72 # tenta decodificar objetos JSON
72 73 try:
73 74 js_facial = js_movimentos[i]['facial']
... ... @@ -84,21 +85,24 @@ def main():
84 85  
85 86 # faz tratamento dos objetos
86 87 if (js_facial == {}):
87   - pyutil.log("<Vazio> js_movimentos[%d] >> Exp facial" % (i))
  88 + print("movimento [%d] Exp facial = <Vazio>" % (i))
88 89 timeline_facial = facial.set_expression(timeline_facial, 0)
89 90 else:
  91 + print("movimento [%d] Exp facial = [%d]" % (i, js_facial["expressao"]))
90 92 timeline_facial = facial.decode_expression(timeline_facial, js_facial)
91 93  
92 94 if (js_mao_esquerda == {}):
93   - pyutil.log("<Vazio> js_movimentos[%d] >> Mao esquerda" % (i))
  95 + print("movimento [%d] Mao Esquerda = <Vazio>" % (i))
94 96 # TODO posicionar mao esquerda na lateral do corpo
95 97 else:
  98 + print("movimento [%d] Mao Esquerda = [%s]" % (i, next(iter(js_mao_esquerda.keys()))))
96 99 timeline_mao_esquerda = decode.hand_mov(timeline_mao_esquerda, frame_jump, js_mao_esquerda, False)
97 100  
98 101 if (js_mao_direita == {}):
99   - pyutil.log("<Vazio> js_movimentos[%d] >> Mao direita" % (i))
  102 + print("movimento [%d] Mao Direita = <Vazio>" % (i))
100 103 # TODO posicionar mao direita na lateral do corpo
101 104 else:
  105 + print("movimento [%d] Mao Direita = [%s]" % (i, next(iter(js_mao_direita.keys()))))
102 106 timeline_mao_direita = decode.hand_mov(timeline_mao_direita, frame_jump, js_mao_direita, True)
103 107  
104 108 endFrame = max(timeline_facial, timeline_mao_esquerda, timeline_mao_direita)
... ...
moves.py
... ... @@ -186,10 +186,22 @@ def pontual(js_movement, current_frame, frame_jump, is_right_hand):
186 186 hand_param = read_hand_param(js_movement)
187 187 bones = util.right_bones_conf if is_right_hand else util.left_bones_conf
188 188 hand_actions = util.right_hand_actions if is_right_hand else util.left_hand_actions
189   -
190 189 util.keyframe_insert(bones, 'location', current_frame)
191 190 current_frame += frame_jump
192 191 util.setPose(hand_actions, hand_param, [current_frame], bones)
193 192 current_frame += frame_jump
194 193 util.keyframe_insert(bones, 'location', current_frame)
195 194 return current_frame
  195 +
  196 +def retilineo(js_movement, current_frame, frame_jump, is_right_hand):
  197 + hand_param = [js_movement['configuracao'], js_movement['articulacao_inicial'], js_movement['orientacao']]
  198 + 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
  200 + util.keyframe_insert(bones, 'location', current_frame)
  201 + current_frame += frame_jump
  202 + 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']]
  205 + util.setPose(hand_actions, hand_param, [current_frame], bones)
  206 + util.keyframe_insert(bones, 'location', current_frame)
  207 + return current_frame
196 208 \ No newline at end of file
... ...
util.py
... ... @@ -225,6 +225,7 @@ def configure_output():
225 225 def render_sign(user_id, nome_sinal = "sinal", frame_final = bpy.context.scene.frame_end):
226 226 getcwd = os.path.dirname(os.path.abspath(__file__))
227 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")
228 229 bpy.context.scene.frame_end = frame_final
229 230 pyutil.log("Gerando Video... Frames: %i" % (frame_final))
230 231 bpy.ops.render.render(animation = True, write_still = False, layer = "", scene = "")
... ...