46 lines
1.4 KiB
GDScript
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)
|