Commit 91c658b763e131997bd49e86041798e070e25d53

Authored by Adabriand Furtado
1 parent 1348fa47
Exists in master

Adicionado o movimento Riscar

Showing 2 changed files with 90 additions and 16 deletions   Show diff stats
@@ -3,27 +3,74 @@ @@ -3,27 +3,74 @@
3 import bpy 3 import bpy
4 import math 4 import math
5 import util 5 import util
6 -from pyutil import log  
7 6
8 -def contato(action, input_hand, bones, pose, initialFrame = 18, frameJump = 10): 7 +def contato(action, input_hand, bones, pose, initialFrame = 18):
9 currentFrame = initialFrame 8 currentFrame = initialFrame
10 contact_type = input_hand[1] 9 contact_type = input_hand[1]
11 10
12 if (contact_type == "alisar"): 11 if (contact_type == "alisar"):
13 - currentFrame = alisar(action, input_hand, pose, bones, initialFrame, frameJump) 12 + currentFrame = alisar(action, input_hand, pose, bones, initialFrame)
14 elif (contact_type == "cocar"): 13 elif (contact_type == "cocar"):
15 currentFrame = cocar(action, input_hand, bones, initialFrame) 14 currentFrame = cocar(action, input_hand, bones, initialFrame)
  15 + elif (contact_type == "tocar"):
  16 + currentFrame = tocar(action, input_hand, bones, initialFrame)
  17 + elif (contact_type == "riscar"):
  18 + currentFrame = riscar(action, input_hand, bones, initialFrame)
16 return currentFrame 19 return currentFrame
17 20
18 -def cocar(action, input_hand, bones, initialFrame = 18, repetition = 2, frameJump = 6): 21 +def riscar(action, input_hand, bones, pose, initialFrame = 18, bnAntBracoDegree = 2, bnMaoDegree = 45, frameJump = 10):
19 currentFrame = initialFrame 22 currentFrame = initialFrame
20 - action[0] = util.movimento_mao_action_index 23 + endFrame = initialFrame + 2 * frameJump
  24 + handParam = input_hand[-3:]
  25 + lado = "R" if util.rightBonesConf == bones else "L"
21 26
  27 + bnAntBraco = bpy.context.object.pose.bones["BnAntBraco." + lado]
  28 + bnAntBraco.bone.select = True
  29 + util.apply_rotation(bnAntBraco, "Z", currentFrame, endFrame, bnAntBracoDegree)
  30 + currentFrame += frameJump
  31 + util.apply_rotation(bnAntBraco, "Z", currentFrame, endFrame, (-1)*(bnAntBracoDegree+1))
  32 + bnAntBraco.bone.select = False
  33 +
  34 + currentFrame = initialFrame
  35 + util.setPose(action, handParam, [currentFrame], bones)
  36 + bnMao = bpy.context.object.pose.bones["BnMao." + lado]
  37 + bnMao.bone.select = True
  38 + util.apply_rotation(bnMao, "Y", currentFrame, endFrame, bnMaoDegree)
  39 + currentFrame += frameJump
  40 + util.apply_rotation(bnMao, "Y", currentFrame, endFrame, (-2)*bnMaoDegree)
  41 + currentFrame += frameJump
  42 + util.apply_rotation(bnMao, "Y", currentFrame, endFrame, bnMaoDegree)
  43 + util.setPose([action[0]], [handParam[0]], [currentFrame], bones)
  44 + currentFrame += frameJump
  45 + bnMao.bone.select = False
  46 + return currentFrame
  47 +
  48 +def tocar(action, input_hand, bones, pose, initialFrame = 18, degree = 30, frameJump = 10):
  49 + currentFrame = initialFrame
  50 + endFrame = initialFrame + 2 * frameJump
  51 + handParam = input_hand[-3:]
  52 + util.setPose(action, handParam, [initialFrame], bones)
  53 +
  54 + lado = "BnMao.R" if util.rightBonesConf == bones else "BnMao.L"
  55 + bnMao = bpy.context.object.pose.bones[lado]
  56 + bnMao.bone.select = True
  57 + currentFrame += frameJump
  58 + util.apply_rotation(bnMao, "X", currentFrame, endFrame, -degree)
  59 + currentFrame += frameJump
  60 + util.apply_rotation(bnMao, "X", currentFrame, endFrame, degree)
  61 + util.setPose([action[0]], [handParam[0]], [currentFrame], bones)
  62 + currentFrame += frameJump
  63 + bnMao.bone.select = False
  64 + return currentFrame
  65 +
  66 +def cocar(action, input_hand, bones, initialFrame = 18, repetition = 2, frameJump = 6):
  67 + currentFrame = initialFrame
22 pa_index = input_hand[-1] 68 pa_index = input_hand[-1]
23 - # TODO mão esquerda 69 +
24 for i in range(0, repetition): 70 for i in range(0, repetition):
25 util.setPose(action, [util.cocar_mao_aberta_index, pa_index, util.cocar_orientation_index], [currentFrame], bones) 71 util.setPose(action, [util.cocar_mao_aberta_index, pa_index, util.cocar_orientation_index], [currentFrame], bones)
26 currentFrame += frameJump 72 currentFrame += frameJump
  73 + lastFrame = i == repetition - 1
27 util.setPose(action, [util.cocar_mao_fechada_index, pa_index, util.cocar_orientation_index], [currentFrame], bones) 74 util.setPose(action, [util.cocar_mao_fechada_index, pa_index, util.cocar_orientation_index], [currentFrame], bones)
28 currentFrame += frameJump 75 currentFrame += frameJump
29 return currentFrame 76 return currentFrame
@@ -57,7 +104,6 @@ def alisar_xy(pose, orientation_index, repetition, initialFrame = 18, frameJump @@ -57,7 +104,6 @@ def alisar_xy(pose, orientation_index, repetition, initialFrame = 18, frameJump
57 pose.location[orientation_index] = center[orientation_index] + width 104 pose.location[orientation_index] = center[orientation_index] + width
58 pose.keyframe_insert(frame = currentFrame, index = -1, data_path = 'location') 105 pose.keyframe_insert(frame = currentFrame, index = -1, data_path = 'location')
59 currentFrame += frameJump 106 currentFrame += frameJump
60 -  
61 return currentFrame 107 return currentFrame
62 108
63 def alisar_diagonal(pose, to_right, repetition, initialFrame = 18, frameJump = 10, width = 0.25): 109 def alisar_diagonal(pose, to_right, repetition, initialFrame = 18, frameJump = 10, width = 0.25):
@@ -75,7 +121,6 @@ def alisar_diagonal(pose, to_right, repetition, initialFrame = 18, frameJump = 1 @@ -75,7 +121,6 @@ def alisar_diagonal(pose, to_right, repetition, initialFrame = 18, frameJump = 1
75 pose.location[1] = center[1] + width if to_right else center[1] - width 121 pose.location[1] = center[1] + width if to_right else center[1] - width
76 pose.keyframe_insert(frame = currentFrame, index = -1, data_path = 'location') 122 pose.keyframe_insert(frame = currentFrame, index = -1, data_path = 'location')
77 currentFrame += frameJump 123 currentFrame += frameJump
78 -  
79 return currentFrame 124 return currentFrame
80 125
81 def circular_or_semiCircular(pose, orientation, direction, radius, laps, intensity = 5, initialFrame = 18, turn = None): 126 def circular_or_semiCircular(pose, orientation, direction, radius, laps, intensity = 5, initialFrame = 18, turn = None):
@@ -5,8 +5,6 @@ import math @@ -5,8 +5,6 @@ import math
5 5
6 armature = bpy.context.scene.objects.get('Armature.001') 6 armature = bpy.context.scene.objects.get('Armature.001')
7 7
8 -bones = ["BnMao.R", "BnMao.L"]  
9 -  
10 # Vetor com indices de cada bone do lado direito 8 # Vetor com indices de cada bone do lado direito
11 rightBonesConf = [1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66] 9 rightBonesConf = [1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]
12 10
@@ -25,13 +23,10 @@ hands_default_frames = [15, 18] @@ -25,13 +23,10 @@ hands_default_frames = [15, 18]
25 # define a posição dos keyframes 23 # define a posição dos keyframes
26 hands_frames_retilineo = [30, 33] 24 hands_frames_retilineo = [30, 33]
27 25
28 -# Movimento de mão action  
29 -movimento_mao_action_index = 7  
30 -  
31 # Movimento coçar - Índices de poses 26 # Movimento coçar - Índices de poses
32 -cocar_mao_aberta_index = 0  
33 -cocar_mao_fechada_index = 1  
34 -cocar_orientation_index = 12 27 +cocar_mao_aberta_index = 56
  28 +cocar_mao_fechada_index = 24
  29 +cocar_orientation_index = 20
35 30
36 # Função responsável por selecionar as pose-libs e setar os frames 31 # Função responsável por selecionar as pose-libs e setar os frames
37 def setPose(actions, parametesConf, positionFrames, bones): 32 def setPose(actions, parametesConf, positionFrames, bones):
@@ -107,3 +102,37 @@ def get_endFrame(json_input, hands_frames_retilineo): @@ -107,3 +102,37 @@ def get_endFrame(json_input, hands_frames_retilineo):
107 elif(json_input["rightHand"][0] == "retilineo"): 102 elif(json_input["rightHand"][0] == "retilineo"):
108 endsFrame.append(max(hands_frames_retilineo)) 103 endsFrame.append(max(hands_frames_retilineo))
109 return(max(endsFrame)) 104 return(max(endsFrame))
  105 +
  106 +def validate_rotation(bone, endFrame):
  107 + rotFrames = [[]]
  108 + scene = bpy.context.scene
  109 + frame_current = bpy.context.scene.frame_current
  110 +
  111 + for i in range(0, endFrame + 1,1):
  112 + scene.frame_set(i)
  113 + rotFrames[-1] = bone.rotation_quaternion.to_euler()
  114 + rotFrames.append( [] )
  115 +
  116 + rotFrames.remove([])
  117 + scene.frame_set(frame_current)
  118 +
  119 + for k in range(1, endFrame + 1, 1):
  120 + for i in range(0, 3, 1):
  121 + if (math.fabs(rotFrames[k][i] - rotFrames[k-1][i])) > math.pi :
  122 + return False
  123 + return True
  124 +
  125 +# Axis: "X", "Y" e "Z"
  126 +def apply_rotation(bone, axis, currentFrame, endFrame, degree):
  127 + new_rotation = bone.rotation_quaternion.to_euler()
  128 + new_rotation.rotate_axis(axis, math.radians(degree))
  129 + new_rotation = new_rotation.to_quaternion()
  130 +
  131 + bone.rotation_quaternion = new_rotation
  132 + bone.keyframe_insert(data_path = 'rotation_quaternion', index = -1, frame = currentFrame)
  133 +
  134 + valid_rotation = validate_rotation(bone, endFrame)
  135 + if (not valid_rotation):
  136 + new_rotation *= (-1)
  137 + bone.rotation_quaternion = new_rotation
  138 + bone.keyframe_insert(data_path = 'rotation_quaternion', index = -1, frame = currentFrame)
110 \ No newline at end of file 139 \ No newline at end of file