Godot_Bouncy_Ball_Prototype/Ball/ball_test.gd

46 lines
1.4 KiB
GDScript

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)