Add 'planet_realistic_gravity' setting to simulate realistic planet g…

…ravity

Using the approximation for a sphere with homogeneous mass distribution
master
Evert 2018-03-20 19:05:37 +02:00
parent 25f184dd1f
commit 9d9c7a462d
No known key found for this signature in database
GPG Key ID: 1688DA83D222D0B5
3 changed files with 19 additions and 7 deletions

View File

@ -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)

View File

@ -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");

View File

@ -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)