extends RigidBody3D @onready var mesh = $BallMesh @onready var body = $BallBody @onready var body_anchor = $AnchorBody @export var speed : float @export var gravity : Vector3 @export var stiffness : float func _ready(): linear_velocity = linear_velocity.normalized() * speed DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) func _physics_process(delta): if global_position.length() >= 100: print("ball escaped") queue_free() # Visual var collision : KinematicCollision3D = body.move_and_collide(linear_velocity * delta, true) if collision: var collision_position = collision.get_position() mesh.look_at(collision_position, Vector3.UP) if collision.get_collider().owner.is_in_group("balls"): mesh.scale.z = (global_position - collision.get_collider().global_position).length() else: mesh.scale.z = (collision_position - global_position).length() * 2 var scalexy = clamp(sqrt(1 / mesh.scale.z), 0.0, 2.0) mesh.scale.x = scalexy mesh.scale.y = scalexy else: mesh.scale = Vector3.ONE # Physics body_anchor.velocity = (global_position - body_anchor.global_position).normalized() * speed if not body_anchor.move_and_slide(): body_anchor.global_position = global_position constant_force = gravity + (body_anchor.global_position - global_position) * stiffness * pow(speed, 2) linear_velocity = linear_velocity.normalized() * clamp(linear_velocity.length(), 0, speed)