Update pose descriptions and rotation values

This commit is contained in:
ckinpdx
2025-12-15 13:34:58 -08:00
committed by GitHub
parent a7cff39763
commit 1cc2a58acd
+122 -44
View File
@@ -635,23 +635,55 @@ DANCE_POSES = {
}
},
"step_right": {
"description": "Weight shifted to right leg",
"description": "Weight on right leg, left foot lifted",
"rotations": {
"right_knee": {"bend": 15},
"left_knee": {"bend": 5},
"spine": {"tilt": -8},
"right_hip": {"raise": -5},
"left_hip": {"raise": 8},
"right_knee": {"bend": 20},
"left_hip": {"forward": 35, "raise": 15},
"left_knee": {"bend": 45},
"spine": {"tilt": -5},
}
},
"step_left": {
"description": "Weight shifted to left leg",
"description": "Weight on left leg, right foot lifted",
"rotations": {
"left_knee": {"bend": 20},
"right_hip": {"forward": 35, "raise": 15},
"right_knee": {"bend": 45},
"spine": {"tilt": 5},
}
},
"kick_right": {
"description": "Right leg kicked forward",
"rotations": {
"left_knee": {"bend": 15},
"right_knee": {"bend": 5},
"spine": {"tilt": 8},
"left_hip": {"raise": -5},
"right_hip": {"raise": 8},
"right_hip": {"forward": 50},
"right_knee": {"bend": -10},
"spine": {"forward": -5},
}
},
"kick_left": {
"description": "Left leg kicked forward",
"rotations": {
"right_knee": {"bend": 15},
"left_hip": {"forward": 50},
"left_knee": {"bend": -10},
"spine": {"forward": -5},
}
},
"march_right": {
"description": "Right knee raised (marching)",
"rotations": {
"left_knee": {"bend": 10},
"right_hip": {"forward": 60},
"right_knee": {"bend": 70},
}
},
"march_left": {
"description": "Left knee raised (marching)",
"rotations": {
"right_knee": {"bend": 10},
"left_hip": {"forward": 60},
"left_knee": {"bend": 70},
}
},
"arms_crossed_low": {
@@ -678,27 +710,49 @@ DANCE_POSES = {
}
# Move sequences for different energy levels
# Designed to FLOW - no constant neutral resets, poses lead into each other
MOVE_SEQUENCES = {
"low": [
["neutral", "head_down", "neutral"],
["neutral", "lean_left", "neutral", "lean_right", "neutral"],
["neutral", "hip_left", "neutral", "hip_right", "neutral"],
["neutral", "look_left", "neutral", "look_right", "neutral"],
# Gentle swaying
["lean_left", "lean_right", "lean_left", "lean_right"],
["hip_left", "hip_right", "hip_left", "hip_right"],
["look_left", "head_down", "look_right", "head_down"],
# Subtle stepping
["step_left", "step_right", "step_left", "step_right"],
["lean_left", "step_left", "lean_right", "step_right"],
],
"medium": [
["neutral", "pump_right", "neutral", "pump_left", "neutral"],
["neutral", "crouch", "neutral"],
["neutral", "arms_out", "neutral"],
["lean_left", "neutral", "lean_right", "neutral"],
["step_left", "neutral", "step_right", "neutral"],
["neutral", "arms_crossed_low", "neutral"],
# Arm flows
["pump_right", "pump_left", "pump_right", "pump_left"],
["arms_out", "arms_crossed_low", "arms_out", "arms_crossed_low"],
["pump_right", "arms_up", "pump_left", "arms_up"],
# Body flows
["lean_left", "crouch", "lean_right", "crouch"],
["crouch", "arms_out", "crouch", "arms_up"],
# Stepping flows
["step_left", "step_right", "step_left", "step_right"],
["step_left", "pump_left", "step_right", "pump_right"],
["march_left", "march_right", "march_left", "march_right"],
# Combined
["lean_left", "pump_right", "lean_right", "pump_left"],
["hip_left", "arms_up", "hip_right", "arms_out"],
],
"high": [
["neutral", "arms_up", "crouch", "arms_up", "neutral"],
["crouch", "arms_up", "crouch"],
# High energy arm combos
["arms_up", "crouch", "arms_up", "crouch"],
["pump_right", "arms_up", "pump_left", "arms_up"],
["arms_out", "crouch", "arms_up", "neutral"],
["crouch", "arms_up", "head_back", "neutral"],
["arms_out", "arms_up", "arms_out", "crouch"],
# Kicks and marches
["kick_right", "kick_left", "kick_right", "kick_left"],
["march_left", "arms_up", "march_right", "arms_up"],
["kick_right", "arms_up", "kick_left", "arms_up"],
# Full body flows
["crouch", "arms_up", "lean_left", "arms_out", "lean_right", "crouch"],
["step_left", "arms_up", "step_right", "crouch", "step_left", "arms_out"],
["march_left", "pump_left", "march_right", "pump_right"],
# Explosive
["crouch", "arms_up", "crouch", "kick_right", "crouch", "kick_left"],
["head_back", "arms_up", "crouch", "arms_up"],
],
}
@@ -1007,22 +1061,28 @@ class SCAILBeatDrivenPose:
head_snap = onset * onset_int * 15
result = self._apply_rotation(result, "head", "nod", head_snap)
# === GROUND CONSTRAINT: Keep ankles from lifting ===
# If ankles moved up (negative Y in most coords), push them back down
# and adjust the rest of the leg to compensate
# === GROUND CONSTRAINT: Prevent BOTH feet from lifting simultaneously ===
# One foot can lift (stepping), but not both (floating)
r_ankle_delta_y = result[10, 1] - r_ankle_orig[1]
l_ankle_delta_y = result[13, 1] - l_ankle_orig[1]
# If ankle lifted (delta negative = moved up), correct it
if r_ankle_delta_y < -2: # small threshold
correction = r_ankle_delta_y + 2
result[10, 1] -= correction
result[9, 1] -= correction * 0.5 # knee partial correction
# Negative delta = foot lifted up
r_lifted = r_ankle_delta_y < -5
l_lifted = l_ankle_delta_y < -5
if l_ankle_delta_y < -2:
correction = l_ankle_delta_y + 2
result[13, 1] -= correction
result[12, 1] -= correction * 0.5
# If BOTH feet are lifting, push the lower one back down
if r_lifted and l_lifted:
# Whichever lifted less stays down
if r_ankle_delta_y > l_ankle_delta_y:
# Right foot lifted less, plant it
correction = r_ankle_delta_y + 2
result[10, 1] -= correction
result[9, 1] -= correction * 0.3
else:
# Left foot lifted less, plant it
correction = l_ankle_delta_y + 2
result[13, 1] -= correction
result[12, 1] -= correction * 0.3
return result
@@ -1064,6 +1124,7 @@ class SCAILBeatDrivenPose:
keyframes = []
current_sequence = []
sequence_idx = 0
last_pose = "neutral"
for i, beat_frame in enumerate(beat_frames):
is_downbeat = beat_frame in downbeat_frames
@@ -1073,6 +1134,7 @@ class SCAILBeatDrivenPose:
else:
energy_level = energy_style
# Get next pose from sequence, or start new sequence
if sequence_idx >= len(current_sequence):
current_sequence = self._select_move_sequence(energy_level, rng, pose_variation)
sequence_idx = 0
@@ -1080,17 +1142,33 @@ class SCAILBeatDrivenPose:
pose_name = current_sequence[sequence_idx]
sequence_idx += 1
if is_downbeat and rng.random() < 0.5:
big_moves = ["arms_up", "crouch", "arms_out"]
pose_name = big_moves[rng.integers(0, len(big_moves))]
# On downbeats, maybe add emphasis without breaking flow
if is_downbeat and rng.random() < 0.3:
# Pick emphasis moves that work as transitions
if last_pose in ["lean_left", "lean_right", "hip_left", "hip_right"]:
pose_name = "crouch" # Ground the sway with a drop
elif last_pose in ["pump_right", "pump_left"]:
pose_name = "arms_up" # Escalate the arm motion
elif last_pose in ["step_left", "step_right", "march_left", "march_right"]:
pose_name = "crouch" # Drop after stepping
elif last_pose == "crouch":
pose_name = "arms_up" # Pop up from crouch
keyframes.append((int(beat_frame), pose_name, is_downbeat))
last_pose = pose_name
# Add neutral at start and end
if len(keyframes) == 0 or keyframes[0][0] > 5:
# Only add neutral at very start if needed (let it start moving immediately)
if len(keyframes) == 0:
keyframes.append((0, "neutral", False))
elif keyframes[0][0] > 10:
# Long gap at start - ease in from neutral
keyframes.insert(0, (0, "neutral", False))
if len(keyframes) == 0 or keyframes[-1][0] < frame_count - 5:
keyframes.append((frame_count - 1, "neutral", False))
# End: return to a rest pose (not necessarily neutral)
if len(keyframes) > 0 and keyframes[-1][0] < frame_count - 10:
# Ease out to something relaxed
final_pose = "neutral" if last_pose in ["arms_up", "kick_right", "kick_left"] else last_pose
keyframes.append((frame_count - 1, final_pose, False))
print(f"[SCAIL-BeatDriven] Created {len(keyframes)} keyframes")