Body step 2.1: climbing, mantling, crawling, legs, playground, 144 Hz

- Step rule + lower-body collider: no walking onto tables, steps <= 0.35 m
- Structural hand strength: two-hand mantle/pull-up works, one hand can't
- Arms aim from the physical shoulder horizontally, keep True Body pose vertically
- Crawl pose, crawl carry, 35 deg slope limit, ground feed-forward ignores
  play-space corrections (fixes a runaway feedback loop)
- Grab static world (climbing), procedural visual legs
- Playground sandbox; menu strength slider, spectator (old drag) and turn toggles
- Physics 144 Hz with interpolation; legacy chase-body spikes pin 90 Hz
- RagdollSpike: 27 phases incl. mantle, pull-up, crawl, ledge drop, ramps

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
FoxyzandClaude Opus 5.5 committed 2026-10-02 07:56:08 +03:00
1 parent d83273dd2f
commit 2aff2b61da
26 files changed
+1243 -70

No files matched your search

+50
View File
@@ -0,0 +1,50 @@
using Godot;
// Dev tool (not shipped gameplay): renders a few overview screenshots of the playground to
// user-supplied paths. godot-mono --path . tools/playground_shots.tscn -- <outdir>
public partial class PlaygroundShots : Node3D
{
private int _frame;
private int _shot;
private Camera3D _cam;
private string _dir = "user://";
private readonly (Vector3 Pos, Vector3 Look)[] _views =
{
(new Vector3(0f, 9f, 14f), new Vector3(0f, 0f, -1f)),
(new Vector3(3f, 4f, 3f), new Vector3(9f, 1f, -4f)),
(new Vector3(-2f, 3.5f, 4f), new Vector3(-7f, 1f, -1f)),
(new Vector3(0f, 2.5f, 11f), new Vector3(1f, 0.6f, 7f)),
};
public override void _Ready()
{
foreach (string a in OS.GetCmdlineUserArgs())
_dir = a;
AddChild(new DirectionalLight3D { RotationDegrees = new Vector3(-50f, -30f, 0f), ShadowEnabled = true });
AddChild(new WorldEnvironment { Environment = new Environment { BackgroundMode = Environment.BGMode.Color, BackgroundColor = new Color(0.55f, 0.65f, 0.8f), AmbientLightSource = Environment.AmbientSource.Color, AmbientLightColor = new Color(0.5f, 0.5f, 0.55f) } });
StaticBody3D floor = new();
floor.AddChild(new CollisionShape3D { Shape = new BoxShape3D { Size = new Vector3(40, 0.1f, 40) }, Position = new Vector3(0, -0.05f, 0) });
floor.AddChild(new MeshInstance3D { Mesh = new PlaneMesh { Size = new Vector2(40, 40) } });
AddChild(floor);
AddChild(new Playground());
_cam = new Camera3D { Current = true };
AddChild(_cam);
SetView();
}
private void SetView() => _cam.LookAtFromPosition(_views[_shot].Pos, _views[_shot].Look);
public override void _Process(double delta)
{
if (++_frame < 30)
return;
GetViewport().GetTexture().GetImage().SavePng($"{_dir}/view{_shot}.png");
_frame = 0;
if (++_shot >= _views.Length)
{
GetTree().Quit();
return;
}
SetView();
}
}
+1
View File
@@ -0,0 +1 @@
uid://ceamhylc4wq66
+6
View File
@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://tools/PlaygroundShots.cs" id="1"]
[node name="PlaygroundShots" type="Node3D"]
script = ExtResource("1")