Commit 9e22a297e6305b47ed3bd068535ba2347accd05a
1 parent
e48ef0c6
Exists in
master
Adicionado o tratamento de colisão com o corpo do avatar.
Showing
4 changed files
with
35 additions
and
22 deletions
Show diff stats
avatar_cartoon_v2.74.blend
No preview for this file type
libras.py
... | ... | @@ -35,7 +35,8 @@ act = bpy.context.scene.animation_data_create() |
35 | 35 | def poseDefault(positionFrames, collisionFlag = False): |
36 | 36 | handDefaultParam = [0, 0, 0] |
37 | 37 | util.setPose(util.right_hand_actions, handDefaultParam, positionFrames, util.rightBonesConf, collisionFlag) |
38 | - util.setPose(util.left_hand_actions, handDefaultParam, positionFrames, util.leftBonesConf, collisionFlag) | |
38 | + if(json_input["leftHand"] != []): | |
39 | + util.setPose(util.left_hand_actions, handDefaultParam, positionFrames, util.leftBonesConf, collisionFlag) | |
39 | 40 | #setFaceConfiguration([0], positionFrames, util.faceBonesConf) |
40 | 41 | |
41 | 42 | # Função responsável por setar as configurações das mãos | ... | ... |
moves.py
... | ... | @@ -40,7 +40,7 @@ def riscar(action, input_hand, bones, pose, initialFrame = 18, bnAntBracoDegree |
40 | 40 | util.apply_rotation(bnMao, "Y", currentFrame, endFrame, (-2)*bnMaoDegree) |
41 | 41 | currentFrame += frameJump |
42 | 42 | util.apply_rotation(bnMao, "Y", currentFrame, endFrame, bnMaoDegree) |
43 | - util.setPose([action[0]], [handParam[0]], [currentFrame], bones) | |
43 | + util.setPose(action[0:2], handParam[0:2], [currentFrame], bones) | |
44 | 44 | currentFrame += frameJump |
45 | 45 | bnMao.bone.select = False |
46 | 46 | return currentFrame |
... | ... | @@ -193,6 +193,6 @@ def circular(obj, itFrame, raio, periodo, x = 0, y = 1, ladoOposto = False, inve |
193 | 193 | if (itFrame % 2 == 0): |
194 | 194 | obj.location[x] = loc[x] + (raio * math.cos(i / periodo * (2 * math.pi))) |
195 | 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) | |
196 | + util.keyframe_insert(obj, 'location', itFrame) | |
197 | 197 | itFrame += 1 |
198 | 198 | return periodo - 1 | ... | ... |
util.py
... | ... | @@ -90,7 +90,7 @@ def resetBnMaoPosition(isRightHand): |
90 | 90 | |
91 | 91 | def checkRotation(bone, positionFrame, last_keyframe): |
92 | 92 | scene = bpy.context.scene |
93 | - frame_current = bpy.context.scene.frame_current | |
93 | + frame_current = scene.frame_current | |
94 | 94 | scene.frame_set(positionFrame) |
95 | 95 | boneRQ = bone.rotation_quaternion.to_euler() |
96 | 96 | scene.frame_set(frame_current) |
... | ... | @@ -104,36 +104,54 @@ def checkRotation(bone, positionFrame, last_keyframe): |
104 | 104 | bone.keyframe_insert(data_path = 'rotation_quaternion', index = -1, frame = positionFrame) |
105 | 105 | |
106 | 106 | def checkCollision(bone, path, positionFrame, last_keyframe): |
107 | + if (last_keyframe == positionFrame): | |
108 | + return | |
109 | + | |
107 | 110 | isRightHand = ".R" in bone.name |
108 | 111 | resetIKPosition(isRightHand) |
109 | - collisionFrame = check_collision(last_keyframe, positionFrame) | |
112 | + handCollisionFrame = check_hand_collision(last_keyframe, positionFrame) | |
110 | 113 | |
111 | - if (last_keyframe != positionFrame and collisionFrame != -1): | |
112 | - handle_collision(bone, path, positionFrame, collisionFrame) | |
114 | + if (handCollisionFrame != -1): | |
115 | + handle_collision(bone, path, positionFrame, handCollisionFrame) | |
116 | + return | |
117 | + | |
118 | + bodyCollisionFrame = check_body_collision(isRightHand, last_keyframe, positionFrame) | |
119 | + if (bodyCollisionFrame != -1): | |
120 | + handle_collision(bone, path, positionFrame, bodyCollisionFrame) | |
121 | + return | |
113 | 122 | |
114 | 123 | def handle_collision(bone, path, positionFrame, collisionFrame, rollbackFrames = 0): |
115 | 124 | scene = bpy.context.scene |
116 | - frame_current = bpy.context.scene.frame_current | |
125 | + frame_current = scene.frame_current | |
117 | 126 | scene.frame_set(collisionFrame - rollbackFrames) |
118 | 127 | bone.keyframe_insert(data_path = path, index = -1, frame = positionFrame) |
119 | 128 | bpy.context.scene.frame_set(frame_current) |
120 | 129 | |
121 | -def check_collision(initFrame, endFrame): | |
130 | +def check_hand_collision(initFrame, endFrame): | |
131 | + return check_collision('right_hand_box', 'left_hand_box', initFrame, endFrame) | |
132 | + | |
133 | +def check_collision(objName, otherObjName, initFrame, endFrame): | |
122 | 134 | scene = bpy.context.scene |
123 | - frame_current = bpy.context.scene.frame_current | |
135 | + frame_current = scene.frame_current | |
124 | 136 | startFrame = initFrame + int(math.fabs((endFrame - initFrame)/2)) |
125 | 137 | collisionFrame = -1 |
126 | 138 | for i in range(startFrame, endFrame + 1, 1): |
127 | 139 | scene.frame_set(i) |
128 | - right_cube = bpy.context.scene.objects.get('right_hand_box') | |
129 | - left_cube = bpy.context.scene.objects.get('left_hand_box') | |
140 | + obj = scene.objects.get(objName) | |
141 | + otherObj = scene.objects.get(otherObjName) | |
130 | 142 | |
131 | - if (bmesh_check_intersect_objects(right_cube, left_cube)): | |
143 | + if (bmesh_check_intersect_objects(obj, otherObj)): | |
132 | 144 | collisionFrame = i |
133 | 145 | break |
134 | 146 | scene.frame_set(frame_current) |
135 | 147 | return collisionFrame |
136 | 148 | |
149 | +def check_body_collision(isRightHand, initFrame, endFrame): | |
150 | + hand_box = 'right_hand_box' if isRightHand else 'left_hand_box' | |
151 | + body_box = 'body_box' | |
152 | + result = check_collision(hand_box, body_box, initFrame, endFrame) | |
153 | + return result | |
154 | + | |
137 | 155 | # Função que limpa todos os keyframes e define a quantidade de frames |
138 | 156 | def erase_all_keyframes(): |
139 | 157 | for i in bpy.data.objects: |
... | ... | @@ -202,12 +220,12 @@ def validate_rotation(bone, endFrame, startFrame = 0): |
202 | 220 | |
203 | 221 | rotFrames = [[]] |
204 | 222 | scene = bpy.context.scene |
205 | - frame_current = bpy.context.scene.frame_current | |
223 | + frame_current = scene.frame_current | |
206 | 224 | |
207 | 225 | for i in range(startFrame+1, endFrame+1, 1): |
208 | 226 | scene.frame_set(i) |
209 | 227 | rotFrames[-1] = bone.rotation_quaternion.to_euler() |
210 | - rotFrames.append( [] ) | |
228 | + rotFrames.append([]) | |
211 | 229 | |
212 | 230 | rotFrames.remove([]) |
213 | 231 | scene.frame_set(frame_current) |
... | ... | @@ -225,10 +243,4 @@ def apply_rotation(bone, axis, currentFrame, endFrame, degree): |
225 | 243 | new_rotation = new_rotation.to_quaternion() |
226 | 244 | |
227 | 245 | bone.rotation_quaternion = new_rotation |
228 | - keyframe_insert(bone, 'rotation_quaternion', currentFrame) | |
229 | - | |
230 | - valid_rotation = validate_rotation(bone, endFrame) | |
231 | - if (not valid_rotation): | |
232 | - new_rotation *= (-1) | |
233 | - bone.rotation_quaternion = new_rotation | |
234 | - keyframe_insert(bone, 'rotation_quaternion', currentFrame) | |
235 | 246 | \ No newline at end of file |
247 | + keyframe_insert(bone, 'rotation_quaternion', currentFrame, False, True) | |
236 | 248 | \ No newline at end of file | ... | ... |