Fix sliding while on planet by getting closest gravity

This commit is contained in:
karl 2021-06-16 20:31:49 +02:00
parent 1d0935e688
commit 725c717446
7 changed files with 94 additions and 65 deletions

View File

@ -3,7 +3,7 @@
[ext_resource path="res://Resources/gas_planet_flowmap.png" type="Texture" id=1]
[ext_resource path="res://Resources/gas_planet_base.png" type="Texture" id=2]
[sub_resource type="Shader" id=14]
[sub_resource type="Shader" id=1]
resource_local_to_scene = true
code = "shader_type spatial;
@ -38,7 +38,7 @@ void fragment(){
"
[resource]
shader = SubResource( 14 )
shader = SubResource( 1 )
shader_param/color = Color( 1, 0.890196, 0.172549, 1 )
shader_param/flow_speed = 0.2
shader_param/flow_intensity = 0.8

View File

@ -31,7 +31,7 @@ func _process(delta):
velocity = (translation - translation_before) / delta
# Rotate according to gravity
var gravity_acceleration = get_node(solar_system).get_gravitation_acceleration(global_transform.origin)
var gravity_acceleration = get_node(solar_system).get_gravity_acceleration(global_transform.origin)
# Rotate down vector to face center of gravity
var down = gravity_acceleration

View File

@ -13,7 +13,30 @@ const distance_multiplier = 318550 # thus, a radius of 20 results in an earth-
const gravity_multiplier = 10.0
func get_gravitation_acceleration(position: Vector3) -> Vector3:
# Return the gravity acceleration vector to the closest planet, not taking all other planets into
# account.
# This is useful for keeping something firmly on the planet while it is touching it, or for creating
# a predictable orbit.
func get_closest_gravity_acceleration(position: Vector3) -> Vector3:
var closest_planet_distance = INF
var closest_force = 0.0
for planet in get_children():
var pos_to_center = (planet.transform.origin - position)
var distance = pos_to_center.length()
if distance < closest_planet_distance:
var force = _gravity(planet.mass * mass_multiplier, distance * distance_multiplier)
force *= gravity_multiplier
closest_force = (pos_to_center / distance) * force
closest_planet_distance = distance
return closest_force
# Return the total gravity acceleration vector experienced at that position.
func get_gravity_acceleration(position: Vector3) -> Vector3:
var total_force = Vector3.ZERO
for planet in get_children():

View File

@ -63,13 +63,10 @@ func _physics_process(delta):
# Make movement local
move_acceleration = transform.basis * move_acceleration
print(on_ground)
# Jumping and Gravity
var gravity_acceleration = get_node(solar_system).get_gravitation_acceleration(transform.origin)
#if on_ground:
# FIXME: This breaks some things, but seems to be the right principle
#gravity_acceleration = Vector3.ZERO
var gravity_acceleration = get_node(solar_system).get_gravity_acceleration(transform.origin)
if $GroundCheckRay.is_colliding():
gravity_acceleration = get_node(solar_system).get_closest_gravity_acceleration(transform.origin)
apply_acceleration((move_acceleration + gravity_acceleration) * delta)

38
Player.tscn Normal file

File diff suppressed because one or more lines are too long

View File

@ -26,7 +26,7 @@ func _physics_process(delta):
)
if target:
var gravity = solar_system.get_gravitation_acceleration(global_transform.origin)
var gravity = solar_system.get_gravity_acceleration(global_transform.origin)
look_at(target, gravity)
global_transform.origin += velocity * delta

File diff suppressed because one or more lines are too long