Godot Version
v4.2.1
Question
Hello!
I’m making a game where you can pick up RigidBody3D element with multiple children colliders.
When I pick up the element, I apply force and torque to match my holder position and rotation (holder is just for a reference for rotation and position). I can touch or crash into other static and dynamic objects and everything works fine. Picked object always matches holder’s position and rotation, no matter how I move.
After I rotate the holder, picked object matches rotation and position of the holder, but it becomes very unstable, as soon as I touch any other static or dynamic objects, picked object loses control and starts spinning.
I have no idea how to fix this issue.
extends RigidBody3D
@onready var ray = $RayCast3D
@onready var holder = $Holder/Holder
var input = Vector3()
var pickedObject = null
var pickedObjectCollider = null
var hold_offset = Vector3(0, -3, 0)
var rrotate = 0
var rotate_target = 0
func _process(_delta):
input.x = Input.get_axis("move_left", "move_right")
input.z = Input.get_axis("move_up", "move_down")
input = input.normalized()
if Input.is_action_just_pressed("pickup"):
pickup()
if Input.is_action_just_pressed("drop"):
drop()
if Input.is_action_just_pressed("ui_left") and pickedObject:
holder.rotation_degrees.y = 90
func _physics_process(delta):
apply_central_force(input.normalized() * 1000 * delta)
if pickedObject:
movePickable(delta)
func pickup():
if !pickedObject and ray.is_colliding():
var collider = ray.get_collider()
if collider.is_in_group("pickable"):
pickedObject = collider
pickedObject.can_sleep = false
var shape_id = ray.get_collider_shape()
var owner_id = collider.shape_find_owner(shape_id)
pickedObjectCollider = collider.shape_owner_get_owner(owner_id)
func drop():
if pickedObject:
pickedObject.can_sleep = true
pickedObject = null
func movePickable(delta):
var target_position = global_transform.origin + global_transform.basis.y * hold_offset.y
var current_position = pickedObjectCollider.global_transform.origin
var force_direction = (target_position - current_position)
var force = force_direction * 3000 * delta
pickedObject.apply_central_force(force)
pickedObject.linear_velocity *= 0.9
var torque = (holder.global_rotation - pickedObjectCollider.global_rotation) * 1000 * delta
pickedObject.apply_torque(torque)
pickedObject.angular_velocity *= 0.9