Manually tweening IK influence

This commit is contained in:
Rob Kelly 2025-08-22 18:28:37 -06:00
parent 2567bff243
commit 618123a712
3 changed files with 55 additions and 230 deletions

View File

@ -378,9 +378,9 @@ surface_material_override/0 = SubResource("ShaderMaterial_yuift")
[node name="PhysicalBoneSimulator3D" type="PhysicalBoneSimulator3D" parent="ListenerModel/Armature/Skeleton3D" index="6"]
[node name="PhysicalBone3D" type="PhysicalBone3D" parent="ListenerModel/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(0.323526, 1.18154e-06, 1.20741, -1.0665e-08, 1.25, -1.22036e-06, -1.20741, 3.05553e-07, 0.323526, -4.82718e-06, 0.800007, -1.2209e-06)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.4398e-08, -5.86509e-06, 3.98532e-06)
body_offset = Transform3D(1.25, 1.11734e-08, -2.47359e-06, -1.11759e-08, 1.25, -1.23028e-06, 2.47359e-06, 1.23028e-06, 1.25, -6.79876e-08, 7.33137e-06, -4.98165e-06)
transform = Transform3D(0.323526, 1.18154e-06, 1.20741, -1.06739e-08, 1.25, -1.22036e-06, -1.20741, 3.05545e-07, 0.323526, -4.82718e-06, 0.800007, -1.2209e-06)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.43994e-08, -5.86509e-06, 3.98532e-06)
body_offset = Transform3D(1.25, 1.1182e-08, -2.83122e-06, -1.11848e-08, 1.25, -1.23028e-06, 2.83122e-06, 1.23028e-06, 1.25, -6.79879e-08, 7.33137e-06, -4.98165e-06)
bone_name = "Stem5"
[node name="RemoteTransform3D" type="RemoteTransform3D" parent="ListenerModel/Armature/Skeleton3D/PhysicalBoneSimulator3D/PhysicalBone3D"]
@ -422,7 +422,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.14, 0)
shape = SubResource("CylinderShape3D_dqq13")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="."]
transform = Transform3D(0.258815, 9.45212e-07, 0.96591, -8.53181e-09, 0.999981, -9.76273e-07, -0.965905, 2.44438e-07, 0.258817, -3.63961e-06, 0.875006, -9.19277e-07)
transform = Transform3D(0.258816, 9.45215e-07, 0.96591, -8.53895e-09, 0.999981, -9.76275e-07, -0.965905, 2.44432e-07, 0.258817, -3.63961e-06, 0.875006, -9.19278e-07)
shape = SubResource("CylinderShape3D_r42ft")
[node name="CooldownTimer" type="Timer" parent="."]

View File

@ -3,12 +3,30 @@ class_name ListenerModel extends Node3D
const TARGET_ACCELERATION := 8.0
var ik_influence := 0.0:
set = _set_ik_influence
var _open := false
var _ik_tween: Tween
@onready var target_target: Marker3D = %TargetTarget
@onready var ik_target: Marker3D = %IKTarget
@onready var ik_animation: AnimationPlayer = %IKAnimation
@onready var animation_player: AnimationPlayer = $AnimationPlayer
@onready var stem_ik_1: LookAtModifier3D = %StemIK1
@onready var stem_ik_2: LookAtModifier3D = %StemIK2
@onready var stem_ik_3: LookAtModifier3D = %StemIK3
@onready var stem_ik_4: LookAtModifier3D = %StemIK4
@onready var stem_ik_5: LookAtModifier3D = %StemIK5
func _get_ik_tween() -> Tween:
if _ik_tween and _ik_tween.is_valid():
_ik_tween.kill()
_ik_tween = create_tween()
return _ik_tween
func lock_target(target: Vector3) -> void:
@ -16,17 +34,38 @@ func lock_target(target: Vector3) -> void:
if not _open:
_open = true
ik_animation.play("open")
animation_player.play("open", 0.2)
(
_get_ik_tween()
. tween_property(self, "ik_influence", 1, animation_player.current_animation_length)
. set_ease(Tween.EASE_IN_OUT)
. set_trans(Tween.TRANS_CUBIC)
)
func release_target() -> void:
if _open:
ik_animation.play("close")
animation_player.play("close", 0.2)
(
_get_ik_tween()
. tween_property(self, "ik_influence", 0, animation_player.current_animation_length)
. set_ease(Tween.EASE_IN_OUT)
. set_trans(Tween.TRANS_CUBIC)
)
_open = false
func _set_ik_influence(value: float) -> void:
ik_influence = value
stem_ik_1.influence = value
stem_ik_2.influence = value
stem_ik_3.influence = value
stem_ik_4.influence = value
stem_ik_5.influence = value
func _process(delta: float) -> void:
var weight := 1.0 - exp(-TARGET_ACCELERATION * delta)
var target_weight := 1.0 - exp(-TARGET_ACCELERATION * delta)
ik_target.global_position = ik_target.global_position.lerp(
target_target.global_position, weight
target_target.global_position, target_weight
)

View File

@ -1,222 +1,9 @@
[gd_scene load_steps=8 format=3 uid="uid://c2c0ooj1re3dk"]
[gd_scene load_steps=4 format=3 uid="uid://c2c0ooj1re3dk"]
[ext_resource type="PackedScene" uid="uid://coucghe370fff" path="res://assets/grunk/listener/listener.gltf" id="1_lgdkx"]
[ext_resource type="Script" uid="uid://co4gkdwyhdbmc" path="res://src/world/mechanics/listener/listener_model.gd" id="2_yh3g4"]
[ext_resource type="Material" uid="uid://bmab6i16v748m" path="res://assets/materials/grunk_jittery.material" id="3_xijsm"]
[sub_resource type="Animation" id="Animation_yh3g4"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Armature/Skeleton3D/StemIK1:influence")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D/StemIK2:influence")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D/StemIK3:influence")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D/StemIK4:influence")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D/StemIK5:influence")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [0.0]
}
[sub_resource type="Animation" id="Animation_xijsm"]
resource_name = "close"
length = 2.5
tracks/0/type = "animation"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("AnimationPlayer")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"clips": PackedStringArray("close"),
"times": PackedFloat32Array(0)
}
tracks/1/type = "bezier"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D/StemIK1:influence")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 1, 0, 0, -0.8, 0, 0.25, 0),
"times": PackedFloat32Array(0, 1.46667)
}
tracks/2/type = "bezier"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D/StemIK2:influence")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 1.618, 0, 0, -1, 0, 0.25, 0),
"times": PackedFloat32Array(0.133333, 1.9)
}
tracks/3/type = "bezier"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D/StemIK3:influence")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 1.618, 0, 0, -1, 0, 0.25, 0),
"times": PackedFloat32Array(0.333333, 2.3)
}
tracks/4/type = "bezier"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D/StemIK4:influence")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 1, 0, 0, -1, 0, 0.25, 0),
"times": PackedFloat32Array(0.566667, 2.4)
}
tracks/5/type = "bezier"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D/StemIK5:influence")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"handle_modes": PackedInt32Array(0, 0),
"points": PackedFloat32Array(1, -0.25, 0, 0.8, 0, 0, -1, 0, 0.25, 0),
"times": PackedFloat32Array(0.966667, 2.5)
}
[sub_resource type="Animation" id="Animation_lgdkx"]
resource_name = "open"
length = 0.42
tracks/0/type = "animation"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("AnimationPlayer")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"clips": PackedStringArray("open"),
"times": PackedFloat32Array(0)
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Armature/Skeleton3D/StemIK1:influence")
tracks/1/interp = 2
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.133333, 0.366667),
"transitions": PackedFloat32Array(0.618, 1),
"update": 0,
"values": [0.0, 1.0]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Armature/Skeleton3D/StemIK2:influence")
tracks/2/interp = 2
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0.1, 0.333333),
"transitions": PackedFloat32Array(0.618, 1),
"update": 0,
"values": [0.0, 1.0]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Armature/Skeleton3D/StemIK3:influence")
tracks/3/interp = 2
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.0666667, 0.3),
"transitions": PackedFloat32Array(0.618, 1),
"update": 0,
"values": [0.0, 1.0]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Armature/Skeleton3D/StemIK4:influence")
tracks/4/interp = 2
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.0333333, 0.266667),
"transitions": PackedFloat32Array(0.618, 1),
"update": 0,
"values": [0.0, 1.0]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Armature/Skeleton3D/StemIK5:influence")
tracks/5/interp = 2
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0, 0.233333),
"transitions": PackedFloat32Array(0.618, 1),
"update": 0,
"values": [0.0, 1.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xijsm"]
_data = {
&"RESET": SubResource("Animation_yh3g4"),
&"close": SubResource("Animation_xijsm"),
&"open": SubResource("Animation_lgdkx")
}
[node name="ListenerModel" instance=ExtResource("1_lgdkx")]
script = ExtResource("2_yh3g4")
@ -224,6 +11,7 @@ script = ExtResource("2_yh3g4")
surface_material_override/0 = ExtResource("3_xijsm")
[node name="StemIK1" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="1"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem1"
@ -240,6 +28,7 @@ secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK2" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="2"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem2"
@ -256,6 +45,7 @@ secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK3" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="3"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem3"
@ -272,6 +62,7 @@ secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK4" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="4"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem4"
@ -288,6 +79,7 @@ secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK5" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="5"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem5"
@ -307,11 +99,5 @@ secondary_damp_threshold = 0.0
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
[node name="IKAnimation" type="AnimationPlayer" parent="." index="3"]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_xijsm")
}
[node name="TargetTarget" type="Marker3D" parent="." index="4"]
[node name="TargetTarget" type="Marker3D" parent="." index="3"]
unique_name_in_owner = true