make pelvis get lower when legs are stretched
This commit is contained in:
@@ -6,9 +6,12 @@ class_name MechSkeletonModifier extends SkeletonModifier3D
|
|||||||
@export var _ankle_bone_r: String = "Ankle_R"
|
@export var _ankle_bone_r: String = "Ankle_R"
|
||||||
@export var _leg_ik_target_r: Node3D
|
@export var _leg_ik_target_r: Node3D
|
||||||
|
|
||||||
|
@export var _feet_stretch_pelvis_lowering_factor: float = 0.3
|
||||||
|
|
||||||
var _skeleton: Skeleton3D
|
var _skeleton: Skeleton3D
|
||||||
|
|
||||||
var _pelvis_rest_y: float
|
var _pelvis_rest_y: float
|
||||||
|
var _feet_rest_distance: float
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
@@ -23,6 +26,7 @@ func _ready() -> void:
|
|||||||
_pelvis_rest_y = (
|
_pelvis_rest_y = (
|
||||||
pelvis_rest.origin.y - (ankle_rest_l.origin.y + ankle_rest_r.origin.y) / 2
|
pelvis_rest.origin.y - (ankle_rest_l.origin.y + ankle_rest_r.origin.y) / 2
|
||||||
)
|
)
|
||||||
|
_feet_rest_distance = ankle_rest_l.origin.distance_to(ankle_rest_r.origin)
|
||||||
|
|
||||||
|
|
||||||
func _process_modification() -> void:
|
func _process_modification() -> void:
|
||||||
@@ -38,5 +42,13 @@ func _process_modification() -> void:
|
|||||||
var pelvis_pos := (leg_target_pos_l + leg_target_pos_r) / 2
|
var pelvis_pos := (leg_target_pos_l + leg_target_pos_r) / 2
|
||||||
pelvis_pos.y = minf(leg_target_pos_l.y, leg_target_pos_r.y) + _pelvis_rest_y
|
pelvis_pos.y = minf(leg_target_pos_l.y, leg_target_pos_r.y) + _pelvis_rest_y
|
||||||
|
|
||||||
|
var feet_distance := (leg_target_pos_l * Vector3(1, 0, 1)).distance_to(
|
||||||
|
leg_target_pos_r * Vector3(1, 0, 1)
|
||||||
|
)
|
||||||
|
var feet_stretch_pelvis_lowering := (
|
||||||
|
(feet_distance - _feet_rest_distance) * _feet_stretch_pelvis_lowering_factor
|
||||||
|
)
|
||||||
|
pelvis_pos.y -= clampf(feet_stretch_pelvis_lowering, 0, _pelvis_rest_y)
|
||||||
|
|
||||||
pelvis_bone_pose.origin = pelvis_pos
|
pelvis_bone_pose.origin = pelvis_pos
|
||||||
_skeleton.set_bone_global_pose(pelvis_bone, pelvis_bone_pose)
|
_skeleton.set_bone_global_pose(pelvis_bone, pelvis_bone_pose)
|
||||||
|
|||||||
Reference in New Issue
Block a user