Add 'planet_realistic_gravity' setting to simulate realistic planet g…
…ravity Using the approximation for a sphere with homogeneous mass distributionmaster
parent
25f184dd1f
commit
9d9c7a462d
|
@ -169,8 +169,24 @@ void ClientEnvironment::step(float dtime)
|
|||
{
|
||||
// Gravity
|
||||
v3f speed = lplayer->getSpeed();
|
||||
if(!lplayer->in_liquid)
|
||||
speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2;
|
||||
|
||||
float gravity_coeff = 1;
|
||||
float planet_radius = g_settings->getU16("planet_radius") * MAP_BLOCKSIZE * BS;
|
||||
float height = planet_radius + lplayer->getPosition().Y;
|
||||
if (g_settings->getBool("planet_enable") && g_settings->getBool("planet_realistic_gravity")) {
|
||||
if (lplayer->getPosition().Y < 0)
|
||||
gravity_coeff = height / planet_radius;
|
||||
else
|
||||
gravity_coeff = (planet_radius * planet_radius) / (height * height);
|
||||
}
|
||||
|
||||
if(lplayer->in_liquid == false)
|
||||
speed.Y -= gravity_coeff * lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2;
|
||||
|
||||
// Planet: Apply centrifugal force
|
||||
if (g_settings->getBool("planet_enable") && g_settings->getBool("planet_centrifugal_enable") && lplayer->in_liquid == false)
|
||||
speed.Y += (speed.X * speed.X + speed.Z * speed.Z) /
|
||||
(g_settings->getU16("planet_radius") * MAP_BLOCKSIZE * BS + lplayer->getPosition().Y) * dtime_part * 2;
|
||||
|
||||
// Liquid floating / sinking
|
||||
if(lplayer->in_liquid && !lplayer->swimming_vertical)
|
||||
|
|
|
@ -394,6 +394,7 @@ void set_default_settings(Settings *settings)
|
|||
settings->setDefault("planet_radius", "30");
|
||||
settings->setDefault("planet_keep_scale", "true");
|
||||
settings->setDefault("planet_centrifugal_enable", "true");
|
||||
settings->setDefault("planet_realistic_gravity", "false");
|
||||
|
||||
// Server list announcing
|
||||
settings->setDefault("server_announce", "false");
|
||||
|
|
|
@ -664,11 +664,6 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
|
|||
else
|
||||
speedH = speedH.normalize() * movement_speed_walk;
|
||||
|
||||
// Planet: Apply centrifugal force
|
||||
if (g_settings->getBool("planet_enable") && g_settings->getBool("planet_centrifugal_enable") && in_liquid == false)
|
||||
speedV.Y += (speedH.X * speedH.X + speedH.Z * speedH.Z) /
|
||||
(g_settings->getU16("planet_radius") * MAP_BLOCKSIZE * BS + getPosition().Y) * dtime;
|
||||
|
||||
// Acceleration increase
|
||||
f32 incH = 0; // Horizontal (X, Z)
|
||||
f32 incV = 0; // Vertical (Y)
|
||||
|
|
Loading…
Reference in New Issue