WIP: Damage/frag system is implemented without ragdolls

This commit is contained in:
2025-02-03 23:03:36 +01:00
parent 7012846b00
commit b63b7a7d09
31 changed files with 5748 additions and 4972 deletions

View File

@ -0,0 +1,39 @@
extends CharacterBody3D
const SPEED = 5.0
const JUMP_VELOCITY = 4.5
var physics_bones: Array[Node]
func _ready() -> void:
var anim: AnimationPlayer = $Base/model/AnimationPlayer
anim.play("riffle_idle")
var skel_ph: PhysicalBoneSimulator3D = $Base/model/Body/Skeleton3D/PhysicalBoneSimulator3D
physics_bones = skel_ph.get_children().filter(func(x): return x is PhysicalBone3D)
func _input(event: InputEvent) -> void:
if Input.is_action_just_pressed("jump"):
var anim: AnimationPlayer = $Base/model/AnimationPlayer
anim.stop()
var skel_ph: PhysicalBoneSimulator3D = $Base/model/Body/Skeleton3D/PhysicalBoneSimulator3D
var target_skeleton = $Base/model/Body/Skeleton3D
for b: PhysicalBone3D in physics_bones:
#var target_transforms: Vector3 = target_skeleton.global_position * target_skeleton.get_bone_global_pose(b.get_bone_id())
print(target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin))
b.global_position = target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin)
skel_ph.physical_bones_start_simulation()
func _physics_process(delta: float) -> void:
for b: PhysicalBone3D in physics_bones:
var target_skeleton = $Base/model/Body/Skeleton3D
#var target_transforms: Vector3 = target_skeleton.global_position * target_skeleton.get_bone_global_pose(b.get_bone_id())
print(target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin))
b.global_position = target_skeleton.to_global(target_skeleton.get_bone_global_pose(b.get_bone_id()).origin)
# Add the gravity.
if not is_on_floor():
velocity += get_gravity() * delta
move_and_slide()

View File

@ -0,0 +1,13 @@
extends Node3D
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
$"Y-Bot/AnimationPlayer".play("T-Pose")
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -0,0 +1,31 @@
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)

View File

@ -0,0 +1,12 @@
extends Skeleton3D
@export var target_skeleton: Skeleton3D
var physical_bones
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View File

@ -0,0 +1,31 @@
[gd_scene load_steps=4 format=3 uid="uid://c3h6gm254tuoc"]
[ext_resource type="Script" path="res://scenes/_test/ragdoll/animated_skel.gd" id="2_14gej"]
[ext_resource type="PackedScene" uid="uid://dgb3r24su3er2" path="res://scenes/characters/base/base.tscn" id="2_vodd8"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vwp6f"]
height = 1.6
[node name="TestRagdoll" type="Node3D"]
[node name="Body" type="CharacterBody3D" parent="."]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 1.33032, 1.47238, 0)
collision_layer = 2
script = ExtResource("2_14gej")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Body"]
transform = Transform3D(1.06005, 0, 0, 0, 1.06005, 0, 0, 0, 1.06005, 0, 0.799564, 0)
shape = SubResource("CapsuleShape3D_vwp6f")
[node name="Base" parent="Body" instance=ExtResource("2_vodd8")]
[node name="CSGBox3D" type="CSGBox3D" parent="."]
use_collision = true
collision_layer = 17
size = Vector3(10, 0.5, 10)
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.16491, 0.986309, 0, -0.986309, 0.16491, 0, 3.4524, 0)
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(0.999981, -0.00165754, 0.00588508, 0.00118019, 0.996777, 0.0802076, -0.00599906, -0.0801992, 0.996761, 1.27162, 2.37388, 2.16416)