32 lines
1.4 KiB
GDScript
32 lines
1.4 KiB
GDScript
extends Skeleton3D
|
|
|
|
@onready var physical_bone_sim = $PhysicalBoneSimulator3D
|
|
var physics_bones: Array[Node]
|
|
@export var target_skeleton: Skeleton3D = null
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
func _ready() -> void:
|
|
physics_bones = physical_bone_sim.get_children().filter(func(x): return x is PhysicalBone3D)
|
|
physical_bone_sim.physical_bones_start_simulation()
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta: float) -> void:
|
|
pass
|
|
|
|
func die() -> void:
|
|
for b: PhysicalBone3D in physics_bones:
|
|
#var target_transforms: Vector3 = target_skeleton.global_position * target_skeleton.get_bone_global_pose(b.get_bone_id())
|
|
b.global_position = target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin)
|
|
#var current_transforn: Transform3D = global_transform * get_bone_global_pose(b.get_bone_id())
|
|
#var position_difference: Vector3 = target_transforms.origin - current_transforn.origin
|
|
#var force: Vector3 = hookes_law(position_difference, b.linear_velocity, 200.0, 40.0)
|
|
#b.linear_velocity += force * delta
|
|
#
|
|
#var rotation_difference: Basis = target_transforms.basis * current_transforn.basis.inverse()
|
|
#var torgue = hookes_law(rotation_difference.get_euler(), b.angular_velocity, 200.0, 40.0)
|
|
#b.angular_velocity += torgue * delta
|
|
|
|
func hookes_law(dis: Vector3, cur_vel: Vector3, stif: float, damp: float):
|
|
return (stif * dis) - (damp * cur_vel)
|