Fix sliding while on planet by getting closest gravity
This commit is contained in:
parent
1d0935e688
commit
725c717446
@ -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
|
||||
|
@ -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
|
||||
|
25
Planets.gd
25
Planets.gd
@ -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():
|
||||
|
@ -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
38
Player.tscn
Normal file
File diff suppressed because one or more lines are too long
@ -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
|
||||
|
79
World.tscn
79
World.tscn
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user