From 618123a712a1d1ed8972e54e4c022e9a9c662848 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Fri, 22 Aug 2025 18:28:37 -0600 Subject: [PATCH] Manually tweening IK influence --- src/world/mechanics/listener/listener.tscn | 8 +- .../mechanics/listener/listener_model.gd | 49 +++- .../mechanics/listener/listener_model.tscn | 228 +----------------- 3 files changed, 55 insertions(+), 230 deletions(-) diff --git a/src/world/mechanics/listener/listener.tscn b/src/world/mechanics/listener/listener.tscn index 80d9127..7657812 100644 --- a/src/world/mechanics/listener/listener.tscn +++ b/src/world/mechanics/listener/listener.tscn @@ -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="."] diff --git a/src/world/mechanics/listener/listener_model.gd b/src/world/mechanics/listener/listener_model.gd index e94e3f1..9670ffe 100644 --- a/src/world/mechanics/listener/listener_model.gd +++ b/src/world/mechanics/listener/listener_model.gd @@ -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 ) diff --git a/src/world/mechanics/listener/listener_model.tscn b/src/world/mechanics/listener/listener_model.tscn index 4c28991..b86cf89 100644 --- a/src/world/mechanics/listener/listener_model.tscn +++ b/src/world/mechanics/listener/listener_model.tscn @@ -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