Render-clock tracking timestamps (menu toggle), physics step cap 6, docs for step 2.7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
22159aa902
commit
ca60df3d75
9 files changed
+111
-11
No files matched your search
@@ -83,6 +83,7 @@ public partial class RagdollSpike : Node3D
|
||||
AddChild(_ragdoll);
|
||||
|
||||
_phases.Add(("hinge sign", SetupHinge, TickHinge, 0.3f, FinishHinge));
|
||||
_phases.Add(("pose filter: render-timed tracking moves evenly (no 18 Hz beat)", Rest, _ => { }, 0.05f, FinishPoseFilter));
|
||||
_phases.Add(("stands still, head on the camera, hands on the controllers", Rest, _ => { }, 4f, FinishStand));
|
||||
_phases.Add(("reaches forward, out and overhead", Rest, TickReach, 4.5f, FinishReach));
|
||||
_phases.Add(("fast arm swings stay attached", Rest, TickSwing, 3f, FinishSwing));
|
||||
@@ -233,6 +234,38 @@ public partial class RagdollSpike : Node3D
|
||||
|
||||
private int NewSnaps => _ragdoll.Snaps - _snapsAtStart;
|
||||
|
||||
// A controller moving at 1 m/s, sampled once per 90 Hz frame (predicted for that frame's render
|
||||
// time), read by 144 Hz ticks. Per-tick output steps should all be 1/144 m: timestamped by
|
||||
// arrival they alternate (1 or 2 ticks late), timestamped by render time they don't.
|
||||
private static bool FinishPoseFilter()
|
||||
{
|
||||
float Spread(bool stamped)
|
||||
{
|
||||
PoseFilter f = new();
|
||||
float min = float.MaxValue, max = 0f;
|
||||
Vector3 prev = Vector3.Zero;
|
||||
for (int tick = 0; tick < 300; tick++)
|
||||
{
|
||||
double now = tick / 144.0;
|
||||
long frame = (long)Math.Floor(now * 90.0); // the last frame delivered before this tick
|
||||
double render = (frame + 1) / 90.0; // its predicted display time
|
||||
Transform3D raw = new(Basis.Identity, new Vector3((float)render, 0f, 0f));
|
||||
Vector3 p = f.Sample(raw, now, stamped ? render : null).Origin;
|
||||
if (tick > 20)
|
||||
{
|
||||
float step = p.X - prev.X;
|
||||
min = Mathf.Min(min, step);
|
||||
max = Mathf.Max(max, step);
|
||||
}
|
||||
prev = p;
|
||||
}
|
||||
return (max - min) * 144f; // spread of the per-tick speed, m/s
|
||||
}
|
||||
float arrival = Spread(false), stamped = Spread(true);
|
||||
GD.Print($"RAGDOLL: pose filter at 1 m/s: per-tick speed spread {arrival:F3} m/s by arrival, {stamped:F3} m/s render-timed");
|
||||
return stamped < 0.05f && stamped < arrival;
|
||||
}
|
||||
|
||||
private static StaticBody3D MakeStatic(Vector3 size, Vector3 pos, uint mask = 0)
|
||||
{
|
||||
StaticBody3D body = new() { Position = pos, CollisionMask = mask };
|
||||
|
||||
Reference in new issue
Block a user