Skip to content

Commit 5f188f7

Browse files
committed
fix gravity
1 parent 3b38b88 commit 5f188f7

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed

server/src/main.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,9 @@ async fn main() -> anyhow::Result<()> {
127127
loop {
128128
interval.tick().await;
129129
let mut game = game_state_for_physics.write().await;
130-
// Step physics with delta time of 1/60 second
131-
game.step_physics(1.0 / 60.0);
130+
// Step physics with delta time of 1.0 game second
131+
// Each real-time step (1/60 second) represents 1 game second (60x time scale)
132+
game.step_physics(1.0);
132133
}
133134
});
134135

server/src/physics.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,15 @@ impl PhysicsWorld {
127127
impulse_joint_set: ImpulseJointSet::new(),
128128
multibody_joint_set: MultibodyJointSet::new(),
129129
ccd_solver: CCDSolver::new(),
130-
// Earth gravity scaled for 60x time scale (1 real second = 60 game seconds)
131-
// Base gravity: 9.81 m/s² = 981 cm/s²
132-
// Scaled by 60² = 3600 (since acceleration = distance/time²)
133-
gravity: vector![0.0, -981.0 * 3600.0, 0.0], // 3,531,600 cm/s² in game time
134-
integration_parameters: IntegrationParameters::default(),
130+
// Earth gravity: 9.81 m/s² = 981 cm/s²
131+
// Physics steps represent game time (1 step = 1 game second), so use normal gravity
132+
gravity: vector![0.0, -981.0, 0.0], // 981 cm/s²
133+
integration_parameters: IntegrationParameters {
134+
// Each physics step represents 1 game second (60x time scale)
135+
// Real-time step is 1/60 second, but we simulate 1 game second per step
136+
dt: 1.0, // 1 game second per step
137+
..IntegrationParameters::default()
138+
},
135139
entity_handles: HashMap::new(),
136140
}
137141
}
@@ -152,10 +156,10 @@ impl PhysicsWorld {
152156
use rand::Rng;
153157

154158
// Random initial velocity for trajectory variation
155-
// Scaled by 60 for 60x time scale (1 real second = 60 game seconds)
159+
// Velocities are in game-time units (cm/game-second)
156160
let mut rng = rand::thread_rng();
157-
let vel_x = rng.gen_range(-100.0..100.0) * 60.0;
158-
let vel_z = rng.gen_range(-100.0..100.0) * 60.0;
161+
let vel_x = rng.gen_range(-100.0..100.0);
162+
let vel_z = rng.gen_range(-100.0..100.0);
159163
let vel_y = 0.0; // Zero vertical velocity
160164

161165
let rigid_body = RigidBodyBuilder::dynamic()
@@ -248,11 +252,11 @@ impl PhysicsWorld {
248252
if let Some(body) = self.rigid_body_set.get_mut(*handle) {
249253
let mut linvel = *body.linvel();
250254
// Random perturbation to velocity for trajectory variation
251-
// Scaled by 60 for 60x time scale
255+
// Velocities are in game-time units (cm/game-second)
252256
if linvel.y < 6.0 && linvel.y > -6.0 {
253257
// Near ground, add random horizontal component to maintain speed
254-
linvel.x += rng.gen_range(-20.0..20.0) * 60.0;
255-
linvel.z += rng.gen_range(-20.0..20.0) * 60.0;
258+
linvel.x += rng.gen_range(-20.0..20.0);
259+
linvel.z += rng.gen_range(-20.0..20.0);
256260
body.set_linvel(linvel, true);
257261
}
258262
}

0 commit comments

Comments
 (0)