Commit e48ef0c6f4ac799071121415883b3eb24cafdcb9
1 parent
f89e6e67
Exists in
master
Adiciona movimento circular otimizado e remove o antigo, adiciona argumento '--'…
… a linha de comando do controller para evitar que o blender interprete o argumento JSON como path para um arquivo
Showing
7 changed files
with
115 additions
and
207 deletions
Show diff stats
@@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
1 | +[2015-07-28 22:23:30.895] ERROR: | ||
2 | + File name: libras.py | ||
3 | + Function name: <module> | ||
4 | + Line code: 23 | ||
5 | + Type exception: ValueError | ||
6 | + Message: Expecting value: line 1 column 1 (char 0) | ||
7 | +[2015-07-28 22:25:38.946] INFO: All frames: 163 | ||
8 | +[2015-07-28 22:28:30.474] INFO: Rename: '/media/truecrypt1/Lavid/wikilibras/tmp/wikilibras-core/users/4/teste circular_0001-0163.mp4' to: '/media/truecrypt1/Lavid/wikilibras/tmp/wikilibras-core/users/4/teste circular.mp4' | ||
9 | +[2015-07-28 23:17:31.963] INFO: All frames: 163 | ||
10 | +[2015-07-28 23:18:15.833] INFO: Rename: '/media/truecrypt1/Lavid/wikilibras/tmp/wikilibras-core/users/4/teste circular_0001-0163.mp4' to: '/media/truecrypt1/Lavid/wikilibras/tmp/wikilibras-core/users/4/teste circular.mp4' | ||
11 | +[2015-07-28 23:35:35.942] INFO: All frames: 163 | ||
12 | +[2015-07-28 23:35:38.782] ERROR: | ||
13 | + File name: controller.py | ||
14 | + Function name: <module> | ||
15 | + Line code: 18 | ||
16 | + Type exception: KeyboardInterrupt | ||
17 | + Message: |
Makefile
1 | -BLEND = avatar_cartoon_v2.70.blend | 1 | +BLEND = avatar_cartoon_v2.74.blend |
2 | CONTROLLER = controller.py | 2 | CONTROLLER = controller.py |
3 | MAIN = libras.py | 3 | MAIN = libras.py |
4 | # Circular: ['circular', x, x, Raio=1, Voltas=3 CfM=0, PAr=80, Ori=0] | 4 | # Circular: ['circular', x, x, Raio=1, Voltas=3 CfM=0, PAr=80, Ori=0] |
@@ -20,7 +20,7 @@ py: | @@ -20,7 +20,7 @@ py: | ||
20 | @echo "[\33[32;5mExecutando\33[m]\33[34;5m $(PYTHON) "$(CONTROLLER)" {JSON} ...\33[m"; $(PYTHON) "$(CONTROLLER)" $(JSON) && echo "$(DONE)" || echo "$(FAIL)" | 20 | @echo "[\33[32;5mExecutando\33[m]\33[34;5m $(PYTHON) "$(CONTROLLER)" {JSON} ...\33[m"; $(PYTHON) "$(CONTROLLER)" $(JSON) && echo "$(DONE)" || echo "$(FAIL)" |
21 | 21 | ||
22 | bpy: | 22 | bpy: |
23 | - @echo "[\33[32;5mExecutando\33[m]\33[34;5m $(BLENDER) -b "$(BLEND)" -P "$(MAIN)" {JSON} ...\33[m"; $(BLENDER) -b "$(BLEND)" -P "$(MAIN)" $(JSON) && echo "$(DONE)" || echo "$(FAIL)" | 23 | + @echo "[\33[32;5mExecutando\33[m]\33[34;5m $(BLENDER) -b "$(BLEND)" -P "$(MAIN)" -- {JSON} ...\33[m"; $(BLENDER) -b "$(BLEND)" -P "$(MAIN)" -- $(JSON) && echo "$(DONE)" || echo "$(FAIL)" |
24 | 24 | ||
25 | help: | 25 | help: |
26 | @echo "" | 26 | @echo "" |
__init__.py
avatar_cartoon_v2.74.blend
No preview for this file type
controller.py
@@ -8,14 +8,14 @@ getcwd = dirname(abspath(__file__)) | @@ -8,14 +8,14 @@ getcwd = dirname(abspath(__file__)) | ||
8 | 8 | ||
9 | from pyutil import printStackTrace | 9 | from pyutil import printStackTrace |
10 | 10 | ||
11 | -blend_path = join(getcwd, "avatar_cartoon_v2.70.blend") | 11 | +blend_path = join(getcwd, "avatar_cartoon_v2.74.blend") |
12 | main_path = join(getcwd, "libras.py") | 12 | main_path = join(getcwd, "libras.py") |
13 | result = 0 | 13 | result = 0 |
14 | 14 | ||
15 | try: | 15 | try: |
16 | # Caso seja necessário gravar logs do blender utilizar a linha de código abaixo | 16 | # Caso seja necessário gravar logs do blender utilizar a linha de código abaixo |
17 | - # result = call(['blender', '-b', blend_path, '-P', main_path, argv[1]], stdout = open('bpy.log', 'w')) | ||
18 | - result = call(['blender', '-b', blend_path, '-P', main_path, argv[1]]) | 17 | + # result = call(['blender', '-b', blend_path, '-P', main_path, '--', argv[1]], stdout = open('bpy.log', 'w')) |
18 | + result = call(['blender', '-b', blend_path, '-P', main_path, '--', argv[1]]) | ||
19 | except: | 19 | except: |
20 | result = printStackTrace(__file__) | 20 | result = printStackTrace(__file__) |
21 | 21 |
libras.py
@@ -20,7 +20,7 @@ from pyutil import printStackTrace | @@ -20,7 +20,7 @@ from pyutil import printStackTrace | ||
20 | 20 | ||
21 | # tenta decodificar o argumento JSON recebido | 21 | # tenta decodificar o argumento JSON recebido |
22 | try: | 22 | try: |
23 | - json_input = json.loads(argv[5]) | 23 | + json_input = json.loads(argv[6]) |
24 | except Exception: | 24 | except Exception: |
25 | printStackTrace(__file__) | 25 | printStackTrace(__file__) |
26 | exit(1) | 26 | exit(1) |
@@ -71,14 +71,14 @@ def configureHands(): | @@ -71,14 +71,14 @@ def configureHands(): | ||
71 | 71 | ||
72 | if(move in ["circular", "semicircular"]): | 72 | if(move in ["circular", "semicircular"]): |
73 | orientation, direction, radius, laps = json_input[hands[i]][1:5] | 73 | orientation, direction, radius, laps = json_input[hands[i]][1:5] |
74 | - endFrame = moves.circular_or_semiCircular(pose, orientation, direction, radius, laps, 5) | 74 | + #endFrame = moves.circular_or_semiCircular(pose, orientation, direction, radius, laps, 5) |
75 | setHandConfiguration(actions[i], handParam, [endFrame], bones_[i]) | 75 | setHandConfiguration(actions[i], handParam, [endFrame], bones_[i]) |
76 | elif(move == "retilineo"): | 76 | elif(move == "retilineo"): |
77 | setHandConfiguration(actions[i], json_input[hands[i]][-6:-3], util.hands_default_frames, bones_[i]) | 77 | setHandConfiguration(actions[i], json_input[hands[i]][-6:-3], util.hands_default_frames, bones_[i]) |
78 | setHandConfiguration(actions[i], handParam, util.hands_frames_retilineo, bones_[i]) | 78 | setHandConfiguration(actions[i], handParam, util.hands_frames_retilineo, bones_[i]) |
79 | elif(move == "senoidal"): | 79 | elif(move == "senoidal"): |
80 | orientation, direction, radius, laps = json_input[hands[i]][1:5] | 80 | orientation, direction, radius, laps = json_input[hands[i]][1:5] |
81 | - endFrame = circular_or_semiCircular(pose, orientation, direction, radius, laps, 5) | 81 | + #endFrame = circular_or_semiCircular(pose, orientation, direction, radius, laps, 5) |
82 | setHandConfiguration(actions[i], handParam, [endFrame], bones_[i]) | 82 | setHandConfiguration(actions[i], handParam, [endFrame], bones_[i]) |
83 | elif(move == "contato"): | 83 | elif(move == "contato"): |
84 | endFrame = moves.contato(actions[i], json_input[hands[i]], bones_[i], pose) | 84 | endFrame = moves.contato(actions[i], json_input[hands[i]], bones_[i], pose) |
@@ -89,12 +89,14 @@ def configureFace(): | @@ -89,12 +89,14 @@ def configureFace(): | ||
89 | if(json_input["facialExp"] != []): | 89 | if(json_input["facialExp"] != []): |
90 | setFaceConfiguration(json_input["facialExp"], [endFrame/4], util.faceBonesConf) | 90 | setFaceConfiguration(json_input["facialExp"], [endFrame/4], util.faceBonesConf) |
91 | 91 | ||
92 | -poseDefault([1]) | ||
93 | -configureHands() | ||
94 | -configureFace() | ||
95 | -poseDefault([endFrame + 15]) | ||
96 | - | ||
97 | -# Default Pose | ||
98 | -print("Total frames: %.3i" % (endFrame)) | ||
99 | - | ||
100 | -util.render_sign(json_input["userId"], json_input["signName"], 1, endFrame + 25) | ||
101 | \ No newline at end of file | 92 | \ No newline at end of file |
93 | +def main(): | ||
94 | + poseDefault([1]) | ||
95 | + configureHands() | ||
96 | + configureFace() | ||
97 | + poseDefault([endFrame + 15]) | ||
98 | + # Default Pose | ||
99 | + print("Total frames: %.3i" % (endFrame)) | ||
100 | + util.render_sign(json_input["userId"], json_input["signName"], 1, endFrame + 25) | ||
101 | + | ||
102 | +if __name__ == "__main__": | ||
103 | + main() |
moves.py
@@ -7,7 +7,7 @@ import util | @@ -7,7 +7,7 @@ import util | ||
7 | def contato(action, input_hand, bones, pose, initialFrame = 18): | 7 | def contato(action, input_hand, bones, pose, initialFrame = 18): |
8 | currentFrame = initialFrame | 8 | currentFrame = initialFrame |
9 | contact_type = input_hand[1] | 9 | contact_type = input_hand[1] |
10 | - | 10 | + |
11 | if (contact_type == "alisar"): | 11 | if (contact_type == "alisar"): |
12 | currentFrame = alisar(action, input_hand, pose, bones, initialFrame) | 12 | currentFrame = alisar(action, input_hand, pose, bones, initialFrame) |
13 | elif (contact_type == "cocar"): | 13 | elif (contact_type == "cocar"): |
@@ -23,19 +23,19 @@ def riscar(action, input_hand, bones, pose, initialFrame = 18, bnAntBracoDegree | @@ -23,19 +23,19 @@ def riscar(action, input_hand, bones, pose, initialFrame = 18, bnAntBracoDegree | ||
23 | endFrame = initialFrame + 2 * frameJump | 23 | endFrame = initialFrame + 2 * frameJump |
24 | handParam = input_hand[-3:] | 24 | handParam = input_hand[-3:] |
25 | lado = "R" if util.rightBonesConf == bones else "L" | 25 | lado = "R" if util.rightBonesConf == bones else "L" |
26 | - | 26 | + |
27 | bnAntBraco = bpy.context.object.pose.bones["BnAntBraco." + lado] | 27 | bnAntBraco = bpy.context.object.pose.bones["BnAntBraco." + lado] |
28 | bnAntBraco.bone.select = True | 28 | bnAntBraco.bone.select = True |
29 | util.apply_rotation(bnAntBraco, "Z", currentFrame, endFrame, bnAntBracoDegree) | 29 | util.apply_rotation(bnAntBraco, "Z", currentFrame, endFrame, bnAntBracoDegree) |
30 | currentFrame += frameJump | 30 | currentFrame += frameJump |
31 | util.apply_rotation(bnAntBraco, "Z", currentFrame, endFrame, (-1)*(bnAntBracoDegree+1)) | 31 | util.apply_rotation(bnAntBraco, "Z", currentFrame, endFrame, (-1)*(bnAntBracoDegree+1)) |
32 | bnAntBraco.bone.select = False | 32 | bnAntBraco.bone.select = False |
33 | - | 33 | + |
34 | currentFrame = initialFrame | 34 | currentFrame = initialFrame |
35 | util.setPose(action, handParam, [currentFrame], bones) | 35 | util.setPose(action, handParam, [currentFrame], bones) |
36 | bnMao = bpy.context.object.pose.bones["BnMao." + lado] | 36 | bnMao = bpy.context.object.pose.bones["BnMao." + lado] |
37 | bnMao.bone.select = True | 37 | bnMao.bone.select = True |
38 | - util.apply_rotation(bnMao, "Y", currentFrame, endFrame, bnMaoDegree) | 38 | + util.apply_rotation(bnMao, "Y", currentFrame, endFrame, bnMaoDegree) |
39 | currentFrame += frameJump | 39 | currentFrame += frameJump |
40 | util.apply_rotation(bnMao, "Y", currentFrame, endFrame, (-2)*bnMaoDegree) | 40 | util.apply_rotation(bnMao, "Y", currentFrame, endFrame, (-2)*bnMaoDegree) |
41 | currentFrame += frameJump | 41 | currentFrame += frameJump |
@@ -55,18 +55,18 @@ def tocar(action, input_hand, bones, pose, initialFrame = 18, degree = 30, frame | @@ -55,18 +55,18 @@ def tocar(action, input_hand, bones, pose, initialFrame = 18, degree = 30, frame | ||
55 | bnMao = bpy.context.object.pose.bones[lado] | 55 | bnMao = bpy.context.object.pose.bones[lado] |
56 | bnMao.bone.select = True | 56 | bnMao.bone.select = True |
57 | currentFrame += frameJump | 57 | currentFrame += frameJump |
58 | - util.apply_rotation(bnMao, "X", currentFrame, endFrame, -degree) | 58 | + util.apply_rotation(bnMao, "X", currentFrame, endFrame, -degree) |
59 | currentFrame += frameJump | 59 | currentFrame += frameJump |
60 | util.apply_rotation(bnMao, "X", currentFrame, endFrame, degree) | 60 | util.apply_rotation(bnMao, "X", currentFrame, endFrame, degree) |
61 | util.setPose([action[0]], [handParam[0]], [currentFrame], bones) | 61 | util.setPose([action[0]], [handParam[0]], [currentFrame], bones) |
62 | currentFrame += frameJump | 62 | currentFrame += frameJump |
63 | bnMao.bone.select = False | 63 | bnMao.bone.select = False |
64 | return currentFrame | 64 | return currentFrame |
65 | - | 65 | + |
66 | def cocar(action, input_hand, bones, initialFrame = 18, repetition = 2, frameJump = 6): | 66 | def cocar(action, input_hand, bones, initialFrame = 18, repetition = 2, frameJump = 6): |
67 | - currentFrame = initialFrame | 67 | + currentFrame = initialFrame |
68 | pa_index = input_hand[-1] | 68 | pa_index = input_hand[-1] |
69 | - | 69 | + |
70 | for i in range(0, repetition): | 70 | for i in range(0, repetition): |
71 | 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) |
72 | currentFrame += frameJump | 72 | currentFrame += frameJump |
@@ -80,7 +80,7 @@ def alisar(action, input_hand, pose, bones, initialFrame = 18, frameJump = 10, w | @@ -80,7 +80,7 @@ def alisar(action, input_hand, pose, bones, initialFrame = 18, frameJump = 10, w | ||
80 | orientation, repetition = input_hand[2:4] | 80 | orientation, repetition = input_hand[2:4] |
81 | handParam = input_hand[-3:] | 81 | handParam = input_hand[-3:] |
82 | util.setPose(action, handParam, util.hands_default_frames, bones) | 82 | util.setPose(action, handParam, util.hands_default_frames, bones) |
83 | - | 83 | + |
84 | if (orientation == "perpendicular"): | 84 | if (orientation == "perpendicular"): |
85 | currentFrame = alisar_xy(pose, 1, repetition, initialFrame, frameJump, width) | 85 | currentFrame = alisar_xy(pose, 1, repetition, initialFrame, frameJump, width) |
86 | elif (orientation == "paralelo"): | 86 | elif (orientation == "paralelo"): |
@@ -89,16 +89,16 @@ def alisar(action, input_hand, pose, bones, initialFrame = 18, frameJump = 10, w | @@ -89,16 +89,16 @@ def alisar(action, input_hand, pose, bones, initialFrame = 18, frameJump = 10, w | ||
89 | currentFrame = alisar_diagonal(pose, True, repetition, initialFrame, frameJump, width) | 89 | currentFrame = alisar_diagonal(pose, True, repetition, initialFrame, frameJump, width) |
90 | elif (orientation == "diagonal-esquerda"): | 90 | elif (orientation == "diagonal-esquerda"): |
91 | currentFrame = alisar_diagonal(pose, False, repetition, initialFrame, frameJump, width) | 91 | currentFrame = alisar_diagonal(pose, False, repetition, initialFrame, frameJump, width) |
92 | - | 92 | + |
93 | util.setPose(action, handParam, [currentFrame], bones) | 93 | util.setPose(action, handParam, [currentFrame], bones) |
94 | return currentFrame | 94 | return currentFrame |
95 | 95 | ||
96 | def alisar_xy(pose, orientation_index, repetition, initialFrame = 18, frameJump = 10, width = 0.25): | 96 | def alisar_xy(pose, orientation_index, repetition, initialFrame = 18, frameJump = 10, width = 0.25): |
97 | currentFrame = initialFrame | 97 | currentFrame = initialFrame |
98 | center = pose.location.x, pose.location.y, pose.location.z | 98 | center = pose.location.x, pose.location.y, pose.location.z |
99 | - | 99 | + |
100 | for i in range(0, repetition): | 100 | for i in range(0, repetition): |
101 | - pose.location[orientation_index] = center[orientation_index] - width | 101 | + pose.location[orientation_index] = center[orientation_index] - width |
102 | util.keyframe_insert(pose, 'location', currentFrame) | 102 | util.keyframe_insert(pose, 'location', currentFrame) |
103 | currentFrame += frameJump | 103 | currentFrame += frameJump |
104 | pose.location[orientation_index] = center[orientation_index] + width | 104 | pose.location[orientation_index] = center[orientation_index] + width |
@@ -109,25 +109,27 @@ def alisar_xy(pose, orientation_index, repetition, initialFrame = 18, frameJump | @@ -109,25 +109,27 @@ def alisar_xy(pose, orientation_index, repetition, initialFrame = 18, frameJump | ||
109 | 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): |
110 | currentFrame = initialFrame | 110 | currentFrame = initialFrame |
111 | center = pose.location.x, pose.location.y, pose.location.z | 111 | center = pose.location.x, pose.location.y, pose.location.z |
112 | - | 112 | + |
113 | for i in range(0, repetition): | 113 | for i in range(0, repetition): |
114 | pose.location[0] = center[0] - width if to_right else center[0] - width | 114 | pose.location[0] = center[0] - width if to_right else center[0] - width |
115 | pose.location[1] = center[1] - width if to_right else center[1] + width | 115 | pose.location[1] = center[1] - width if to_right else center[1] + width |
116 | - | 116 | + |
117 | util.keyframe_insert(pose, 'location', currentFrame) | 117 | util.keyframe_insert(pose, 'location', currentFrame) |
118 | currentFrame += frameJump | 118 | currentFrame += frameJump |
119 | - | 119 | + |
120 | pose.location[0] = center[0] + width if to_right else center[0] + width | 120 | pose.location[0] = center[0] + width if to_right else center[0] + width |
121 | 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 |
122 | util.keyframe_insert(pose, 'location', currentFrame) | 122 | util.keyframe_insert(pose, 'location', currentFrame) |
123 | currentFrame += frameJump | 123 | currentFrame += frameJump |
124 | return currentFrame | 124 | return currentFrame |
125 | 125 | ||
126 | +""" | ||
127 | +# descontinuada: circular_or_semiCircular | ||
126 | def circular_or_semiCircular(pose, orientation, direction, radius, laps, intensity = 5, initialFrame = 18, turn = None): | 128 | def circular_or_semiCircular(pose, orientation, direction, radius, laps, intensity = 5, initialFrame = 18, turn = None): |
127 | center = pose.location.x, pose.location.y, pose.location.z | 129 | center = pose.location.x, pose.location.y, pose.location.z |
128 | if(orientation == 'perpendicular'): | 130 | if(orientation == 'perpendicular'): |
129 | if(direction == 'horario'): | 131 | if(direction == 'horario'): |
130 | - endFrame = locationCircular(center, radius, 1, 0, 2, pose, 0, laps, intensity, initialFrame, turn) | 132 | + endFrame = circular(center, radius, 1, 0, 2, pose, 0, laps, intensity, initialFrame, turn) |
131 | else: | 133 | else: |
132 | endFrame = locationCircular(center, radius, 0, 1, 2, pose, 0, laps, intensity, initialFrame, turn) | 134 | endFrame = locationCircular(center, radius, 0, 1, 2, pose, 0, laps, intensity, initialFrame, turn) |
133 | elif(orientation == 'paralelo'): | 135 | elif(orientation == 'paralelo'): |
@@ -141,177 +143,56 @@ def circular_or_semiCircular(pose, orientation, direction, radius, laps, intensi | @@ -141,177 +143,56 @@ def circular_or_semiCircular(pose, orientation, direction, radius, laps, intensi | ||
141 | else: | 143 | else: |
142 | endFrame = locationCircular(center, radius, 0, 2, 1, pose, 0, laps, intensity, initialFrame, turn) | 144 | endFrame = locationCircular(center, radius, 0, 2, 1, pose, 0, laps, intensity, initialFrame, turn) |
143 | return endFrame | 145 | return endFrame |
144 | - | ||
145 | -# center[3]: float vector (posição xyz centro) | ||
146 | -# radius: float (distancia do centro) | ||
147 | -# i_axis: int (indice do eixo i [0 | 1 | 2]) | ||
148 | -# j_axis: int (indice do eixo j [0 | 1 | 2]) | ||
149 | -# k_axis: int (indice do eixo k [0 | 1 | 2]) | ||
150 | -def locationCircular(center, radius, i_axis, j_axis, k_axis, pose, initialPosition, laps, frameJump = 5, initialFrame = 18, turn = None): | ||
151 | - sqrt22 = radius * (math.sqrt(2) / 2) | ||
152 | - rad2 = (radius/2) | ||
153 | - currentFrame = initialFrame | ||
154 | - for l in range(initialPosition, initialPosition + math.floor(8 * laps) + 1): | ||
155 | - if ((l % 8) == 0): | ||
156 | - pose.location[i_axis] = center[i_axis] + radius | ||
157 | - pose.location[j_axis] = center[j_axis] | ||
158 | - pose.location[k_axis] = center[k_axis] | ||
159 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
160 | - currentFrame += frameJump | ||
161 | - if ((l % 8) == 1): | ||
162 | - pose.location[i_axis] = center[i_axis] + sqrt22 | ||
163 | - pose.location[j_axis] = center[j_axis] + sqrt22 | ||
164 | - pose.location[k_axis] = center[k_axis] | ||
165 | - if(turn == 1): | ||
166 | - pose.location[i_axis] = center[i_axis] + sqrt22 | ||
167 | - pose.location[j_axis] = center[j_axis] + rad2 | ||
168 | - pose.location[k_axis] = center[k_axis] - rad2 | ||
169 | - elif(turn == -1): | ||
170 | - pose.location[i_axis] = center[i_axis] + sqrt22 | ||
171 | - pose.location[j_axis] = center[j_axis] + rad2 | ||
172 | - pose.location[k_axis] = center[k_axis] + rad2 | ||
173 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
174 | - currentFrame += frameJump | ||
175 | - if ((l % 8) == 2): | ||
176 | - pose.location[i_axis] = center[i_axis] | ||
177 | - pose.location[j_axis] = center[j_axis] + radius | ||
178 | - pose.location[k_axis] = center[k_axis] | ||
179 | - if(turn == 1): | ||
180 | - pose.location[j_axis] = center[j_axis] + sqrt22 | ||
181 | - pose.location[k_axis] = center[k_axis] - sqrt22 | ||
182 | - elif(turn == -1): | ||
183 | - pose.location[j_axis] = center[j_axis] + sqrt22 | ||
184 | - pose.location[k_axis] = center[k_axis] + sqrt22 | ||
185 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
186 | - currentFrame += frameJump | ||
187 | - if ((l % 8) == 3): | ||
188 | - pose.location[i_axis] = center[i_axis] - sqrt22 | ||
189 | - pose.location[j_axis] = center[j_axis] + sqrt22 | ||
190 | - pose.location[k_axis] = center[k_axis] | ||
191 | - if(turn == 1): | ||
192 | - pose.location[i_axis] = center[i_axis] - sqrt22 | ||
193 | - pose.location[j_axis] = center[j_axis] + rad2 | ||
194 | - pose.location[k_axis] = center[k_axis] - rad2 | ||
195 | - elif(turn == -1): | ||
196 | - pose.location[i_axis] = center[i_axis] - sqrt22 | ||
197 | - pose.location[j_axis] = center[j_axis] + rad2 | ||
198 | - pose.location[k_axis] = center[k_axis] + rad2 | ||
199 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
200 | - currentFrame += frameJump | ||
201 | - | ||
202 | - if ((l % 8) == 4): | ||
203 | - pose.location[i_axis] = center[i_axis] - radius | ||
204 | - pose.location[j_axis] = center[j_axis] | ||
205 | - pose.location[k_axis] = center[k_axis] | ||
206 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
207 | - currentFrame += frameJump | ||
208 | - | ||
209 | - if ((l % 8) == 5): | ||
210 | - pose.location[i_axis] = center[i_axis] - sqrt22 | ||
211 | - pose.location[j_axis] = center[j_axis] - sqrt22 | ||
212 | - pose.location[k_axis] = center[k_axis] | ||
213 | - if(turn == 1): | ||
214 | - pose.location[i_axis] = center[i_axis] - sqrt22 | ||
215 | - pose.location[j_axis] = center[j_axis] - rad2 | ||
216 | - pose.location[k_axis] = center[k_axis] + rad2 | ||
217 | - elif(turn == -1): | ||
218 | - pose.location[i_axis] = center[i_axis] - sqrt22 | ||
219 | - pose.location[j_axis] = center[j_axis] - rad2 | ||
220 | - pose.location[k_axis] = center[k_axis] - rad2 | ||
221 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
222 | - currentFrame += frameJump | ||
223 | - | ||
224 | - if ((l % 8) == 6): | ||
225 | - pose.location[i_axis] = center[i_axis] | ||
226 | - pose.location[j_axis] = center[j_axis] - radius | ||
227 | - pose.location[k_axis] = center[k_axis] | ||
228 | - if(turn == 1): | ||
229 | - pose.location[j_axis] = center[j_axis] - sqrt22 | ||
230 | - pose.location[k_axis] = center[k_axis] + sqrt22 | ||
231 | - elif(turn == -1): | ||
232 | - pose.location[j_axis] = center[j_axis] - sqrt22 | ||
233 | - pose.location[k_axis] = center[k_axis] - sqrt22 | ||
234 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
235 | - currentFrame += frameJump | ||
236 | - | ||
237 | - if ((l % 8) == 7): | ||
238 | - pose.location[i_axis] = center[i_axis] + sqrt22 | ||
239 | - pose.location[j_axis] = center[j_axis] - sqrt22 | ||
240 | - pose.location[k_axis] = center[k_axis] | ||
241 | - if(turn == 1): | ||
242 | - pose.location[i_axis] = center[i_axis] + sqrt22 | ||
243 | - pose.location[j_axis] = center[j_axis] - rad2 | ||
244 | - pose.location[k_axis] = center[k_axis] + rad2 | ||
245 | - elif(turn == -1): | ||
246 | - pose.location[i_axis] = center[i_axis] + sqrt22 | ||
247 | - pose.location[j_axis] = center[j_axis] - rad2 | ||
248 | - pose.location[k_axis] = center[k_axis] - rad2 | ||
249 | - util.keyframe_insert(pose, 'location', currentFrame) | ||
250 | - currentFrame += frameJump | ||
251 | - currentFrame -= frameJump | ||
252 | - return currentFrame | ||
253 | - | ||
254 | -def locationHelicoidal(center, startRadius, incRadius, x, y, z,pose, currentLoc, laps, frameJump): | ||
255 | - sqrt22 = radius * math.sqrt(2) / 2 | ||
256 | - allLaps = math.floor(8 * laps) + 1 | ||
257 | - | ||
258 | - #for i in range(currentLoc, currentLoc + math.floor(8 * laps) + 1): | ||
259 | - for i in range(currentLoc, currentLoc + allLaps): | ||
260 | - print("All Laps:", allLaps) | ||
261 | - if ((i % 8) == 0 ): | ||
262 | - pose.location[x] = center[x] + radius | ||
263 | - pose.location[y] = center[y] | ||
264 | - pose.location[z] += incRadius /allLaps | ||
265 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
266 | - bpy.context.scene.frame_end += frameJump | ||
267 | - | ||
268 | - if ((i % 8) == 1): | ||
269 | - pose.location[x] = center[x] + sqrt22 | ||
270 | - pose.location[y] = center[y] + sqrt22 | ||
271 | - pose.location[z] += incRadius /allLaps | ||
272 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
273 | - bpy.context.scene.frame_end += frameJump | ||
274 | - | ||
275 | - if ((i % 8) == 2): | ||
276 | - pose.location[x] = center[x] | ||
277 | - pose.location[y] = center[y] + radius | ||
278 | - pose.location[z] += incRadius /allLaps | ||
279 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
280 | - bpy.context.scene.frame_end += frameJump | ||
281 | - | ||
282 | - if ((i % 8) == 3): | ||
283 | - pose.location[x] = center[x] - sqrt22 | ||
284 | - pose.location[y] = center[y] + sqrt22 | ||
285 | - pose.location[z] += incRadius /allLaps | ||
286 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
287 | - bpy.context.scene.frame_end += frameJump | ||
288 | - | ||
289 | - if ((i % 8) == 4): | ||
290 | - pose.location[x] = center[x] - radius | ||
291 | - pose.location[y] = center[y] | ||
292 | - pose.location[z] += incRadius /allLaps | ||
293 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
294 | - bpy.context.scene.frame_end += frameJump | ||
295 | - | ||
296 | - if ((i % 8) == 5): | ||
297 | - pose.location[x] = center[x] - sqrt22 | ||
298 | - pose.location[y] = center[y] - sqrt22 | ||
299 | - pose.location[z] += incRadius /allLaps | ||
300 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
301 | - bpy.context.scene.frame_end += frameJump | ||
302 | - | ||
303 | - if ((i % 8) == 6): | ||
304 | - pose.location[x] = center[x] | ||
305 | - pose.location[y] = center[y] - radius | ||
306 | - pose.location[z] += incRadius /allLaps | ||
307 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
308 | - bpy.context.scene.frame_end += frameJump | ||
309 | - | ||
310 | - if ((i % 8) == 7): | ||
311 | - pose.location[x] = center[x] + sqrt22 | ||
312 | - pose.location[y] = center[y] - sqrt22 | ||
313 | - pose.location[z] += incRadius /allLaps | ||
314 | - util.keyframe_insert(pose, 'location', bpy.context.scene.frame_end) | ||
315 | - bpy.context.scene.frame_end += frameJump | ||
316 | - | ||
317 | - bpy.context.scene.frame_end -= frameJump | 146 | +""" |
147 | + | ||
148 | +# Obs.: A velocidade do movimento vai ser a relacao entre tamanho do raio e o periodo | ||
149 | +# quanto maior o periodo mais keyframes | ||
150 | +# quanto menor o raio mais rapido | ||
151 | +# exemplos: | ||
152 | +# raio: "pequeno" raio = 0.5, velocidade: "rapido" periodo = 25 | ||
153 | +# raio: "pequeno" raio = 0.5, velocidade: "normal" periodo = 35 | ||
154 | +# raio: "pequeno" raio = 0.5, velocidade: "lento" periodo = 45 | ||
155 | +# raio: "normal" raio = 1.0, velocidade: "rapido" periodo = 35 | ||
156 | +# raio: "normal" raio = 1.0, velocidade: "normal" periodo = 45 | ||
157 | +# raio: "normal" raio = 1.0, velocidade: "lento" periodo = 55 | ||
158 | +# raio: "grande" raio = 1.5, velocidade: "rapido" periodo = 45 | ||
159 | +# raio: "grande" raio = 1.5, velocidade: "normal" periodo = 55 | ||
160 | +# raio: "grande" raio = 1.5, velocidade: "lento" periodo = 65 | ||
161 | +# @param obj: (objeto) bone, mesh, e.g. | ||
162 | +# @param itFrame: (int) posicao onde o primeiro keyframe vai ser inserido | ||
163 | +# @param raio: (int) raio da circunferencia | ||
164 | +# @param periodo: (int) quantidade de keyframes necessarios para completar uma volta completa | ||
165 | +# @param x: (int) in [0,1,2] define qual eixo vai variar no seno (0 = eixo X, 1 = eixo Y, 2 = eixo Z) | ||
166 | +# @param y: (int) in [0,1,2] define qual eixo vai variar no cosseno (0 = eixo X, 1 = eixo Y, 2 = eixo Z) | ||
167 | +# @param ladoOposto: (bool) inverte o lado da primeira posicao (pode ser util em alguns casos para espelhar) | ||
168 | +# @param inverterDirecao (bool) inverte o sentido do movimento (horario para anti-horario) | ||
169 | +def circular(obj, itFrame, raio, periodo, x = 0, y = 1, ladoOposto = False, inverterDirecao = False): | ||
170 | + # limita inferiormente | ||
171 | + if (periodo < 16): | ||
172 | + periodo = 16 | ||
173 | + # limita superiormente | ||
174 | + elif (periodo > 360): | ||
175 | + periodo = 360 | ||
176 | + # muda lado inicial | ||
177 | + if (ladoOposto): | ||
178 | + k = round(periodo / 2) | ||
179 | + else: | ||
180 | + k = 0 | ||
181 | + # evita estouro dos indices | ||
182 | + x %= 3 | ||
183 | + y %= 3 | ||
184 | + # inverte direcao do movimento | ||
185 | + if (inverterDirecao): | ||
186 | + tmp = x | ||
187 | + x = y | ||
188 | + y = tmp | ||
189 | + # copia posicao inicial para transladar | ||
190 | + loc = [obj.location[0], obj.location[1], obj.location[2]] | ||
191 | + for i in range(k, periodo + k): | ||
192 | + # pequena otimizacao para reduzir a quantidade de keyframes | ||
193 | + if (itFrame % 2 == 0): | ||
194 | + obj.location[x] = loc[x] + (raio * math.cos(i / periodo * (2 * math.pi))) | ||
195 | + obj.location[y] = loc[y] + (raio * math.sin(i / periodo * (2 * math.pi))) | ||
196 | + obj.keyframe_insert(data_path='location', frame=itFrame, index=-1) | ||
197 | + itFrame += 1 | ||
198 | + return periodo - 1 |