generated from krampus/template-godot4
Manually tweening IK influence
This commit is contained in:
parent
2567bff243
commit
618123a712
@ -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="."]
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user