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,7 +35,8 @@ act = bpy.context.scene.animation_data_create() | ||
35 | def poseDefault(positionFrames, collisionFlag = False): | 35 | def poseDefault(positionFrames, collisionFlag = False): |
36 | handDefaultParam = [0, 0, 0] | 36 | handDefaultParam = [0, 0, 0] |
37 | util.setPose(util.right_hand_actions, handDefaultParam, positionFrames, util.rightBonesConf, collisionFlag) | 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 | #setFaceConfiguration([0], positionFrames, util.faceBonesConf) | 40 | #setFaceConfiguration([0], positionFrames, util.faceBonesConf) |
40 | 41 | ||
41 | # Função responsável por setar as configurações das mãos | 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,7 +40,7 @@ def riscar(action, input_hand, bones, pose, initialFrame = 18, bnAntBracoDegree | ||
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 |
42 | util.apply_rotation(bnMao, "Y", currentFrame, endFrame, bnMaoDegree) | 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 | currentFrame += frameJump | 44 | currentFrame += frameJump |
45 | bnMao.bone.select = False | 45 | bnMao.bone.select = False |
46 | return currentFrame | 46 | return currentFrame |
@@ -193,6 +193,6 @@ def circular(obj, itFrame, raio, periodo, x = 0, y = 1, ladoOposto = False, inve | @@ -193,6 +193,6 @@ def circular(obj, itFrame, raio, periodo, x = 0, y = 1, ladoOposto = False, inve | ||
193 | if (itFrame % 2 == 0): | 193 | if (itFrame % 2 == 0): |
194 | obj.location[x] = loc[x] + (raio * math.cos(i / periodo * (2 * math.pi))) | 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))) | 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 | itFrame += 1 | 197 | itFrame += 1 |
198 | return periodo - 1 | 198 | return periodo - 1 |
util.py
@@ -90,7 +90,7 @@ def resetBnMaoPosition(isRightHand): | @@ -90,7 +90,7 @@ def resetBnMaoPosition(isRightHand): | ||
90 | 90 | ||
91 | def checkRotation(bone, positionFrame, last_keyframe): | 91 | def checkRotation(bone, positionFrame, last_keyframe): |
92 | scene = bpy.context.scene | 92 | scene = bpy.context.scene |
93 | - frame_current = bpy.context.scene.frame_current | 93 | + frame_current = scene.frame_current |
94 | scene.frame_set(positionFrame) | 94 | scene.frame_set(positionFrame) |
95 | boneRQ = bone.rotation_quaternion.to_euler() | 95 | boneRQ = bone.rotation_quaternion.to_euler() |
96 | scene.frame_set(frame_current) | 96 | scene.frame_set(frame_current) |
@@ -104,36 +104,54 @@ def checkRotation(bone, positionFrame, last_keyframe): | @@ -104,36 +104,54 @@ def checkRotation(bone, positionFrame, last_keyframe): | ||
104 | bone.keyframe_insert(data_path = 'rotation_quaternion', index = -1, frame = positionFrame) | 104 | bone.keyframe_insert(data_path = 'rotation_quaternion', index = -1, frame = positionFrame) |
105 | 105 | ||
106 | def checkCollision(bone, path, positionFrame, last_keyframe): | 106 | def checkCollision(bone, path, positionFrame, last_keyframe): |
107 | + if (last_keyframe == positionFrame): | ||
108 | + return | ||
109 | + | ||
107 | isRightHand = ".R" in bone.name | 110 | isRightHand = ".R" in bone.name |
108 | resetIKPosition(isRightHand) | 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 | def handle_collision(bone, path, positionFrame, collisionFrame, rollbackFrames = 0): | 123 | def handle_collision(bone, path, positionFrame, collisionFrame, rollbackFrames = 0): |
115 | scene = bpy.context.scene | 124 | scene = bpy.context.scene |
116 | - frame_current = bpy.context.scene.frame_current | 125 | + frame_current = scene.frame_current |
117 | scene.frame_set(collisionFrame - rollbackFrames) | 126 | scene.frame_set(collisionFrame - rollbackFrames) |
118 | bone.keyframe_insert(data_path = path, index = -1, frame = positionFrame) | 127 | bone.keyframe_insert(data_path = path, index = -1, frame = positionFrame) |
119 | bpy.context.scene.frame_set(frame_current) | 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 | scene = bpy.context.scene | 134 | scene = bpy.context.scene |
123 | - frame_current = bpy.context.scene.frame_current | 135 | + frame_current = scene.frame_current |
124 | startFrame = initFrame + int(math.fabs((endFrame - initFrame)/2)) | 136 | startFrame = initFrame + int(math.fabs((endFrame - initFrame)/2)) |
125 | collisionFrame = -1 | 137 | collisionFrame = -1 |
126 | for i in range(startFrame, endFrame + 1, 1): | 138 | for i in range(startFrame, endFrame + 1, 1): |
127 | scene.frame_set(i) | 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 | collisionFrame = i | 144 | collisionFrame = i |
133 | break | 145 | break |
134 | scene.frame_set(frame_current) | 146 | scene.frame_set(frame_current) |
135 | return collisionFrame | 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 | # Função que limpa todos os keyframes e define a quantidade de frames | 155 | # Função que limpa todos os keyframes e define a quantidade de frames |
138 | def erase_all_keyframes(): | 156 | def erase_all_keyframes(): |
139 | for i in bpy.data.objects: | 157 | for i in bpy.data.objects: |
@@ -202,12 +220,12 @@ def validate_rotation(bone, endFrame, startFrame = 0): | @@ -202,12 +220,12 @@ def validate_rotation(bone, endFrame, startFrame = 0): | ||
202 | 220 | ||
203 | rotFrames = [[]] | 221 | rotFrames = [[]] |
204 | scene = bpy.context.scene | 222 | scene = bpy.context.scene |
205 | - frame_current = bpy.context.scene.frame_current | 223 | + frame_current = scene.frame_current |
206 | 224 | ||
207 | for i in range(startFrame+1, endFrame+1, 1): | 225 | for i in range(startFrame+1, endFrame+1, 1): |
208 | scene.frame_set(i) | 226 | scene.frame_set(i) |
209 | rotFrames[-1] = bone.rotation_quaternion.to_euler() | 227 | rotFrames[-1] = bone.rotation_quaternion.to_euler() |
210 | - rotFrames.append( [] ) | 228 | + rotFrames.append([]) |
211 | 229 | ||
212 | rotFrames.remove([]) | 230 | rotFrames.remove([]) |
213 | scene.frame_set(frame_current) | 231 | scene.frame_set(frame_current) |
@@ -225,10 +243,4 @@ def apply_rotation(bone, axis, currentFrame, endFrame, degree): | @@ -225,10 +243,4 @@ def apply_rotation(bone, axis, currentFrame, endFrame, degree): | ||
225 | new_rotation = new_rotation.to_quaternion() | 243 | new_rotation = new_rotation.to_quaternion() |
226 | 244 | ||
227 | bone.rotation_quaternion = new_rotation | 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 | \ No newline at end of file | 246 | \ No newline at end of file |
247 | + keyframe_insert(bone, 'rotation_quaternion', currentFrame, False, True) | ||
236 | \ No newline at end of file | 248 | \ No newline at end of file |