41 lines
1.5 KiB
GDScript
41 lines
1.5 KiB
GDScript
extends XROrigin3D
|
|
|
|
|
|
@onready var _hand_rigidbody_left : RigidBody3D = $leftHand/leftRigid
|
|
@onready var _hand_rigidbody_right : RigidBody3D = $rightHand/rightRigid
|
|
|
|
@onready var _hand_contr_left : Node3D = $leftHand
|
|
@onready var _hand_contr_right : Node3D = $rightHand
|
|
|
|
func _ready() -> void:
|
|
_hand_rigidbody_left.top_level = true
|
|
_hand_rigidbody_right.top_level = true
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
$MeshInstance3D.position = $XRCamera3D.position
|
|
if self.position.y <= -10:
|
|
self.position = Vector3(0,0,0)
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
_move_hand_rigidbody_to_contr(_hand_rigidbody_left, _hand_contr_left)
|
|
_move_hand_rigidbody_to_contr(_hand_rigidbody_right, _hand_contr_right)
|
|
|
|
|
|
func _move_hand_rigidbody_to_contr(hand_rigidbody: RigidBody3D, hand_contr: Node3D) -> void:
|
|
# 1 force hand rigidbody to hand contr
|
|
var move_delta : Vector3 = hand_contr.global_position - hand_rigidbody.global_position
|
|
|
|
var coef_force := 300.0
|
|
hand_rigidbody.apply_central_force(move_delta * coef_force)
|
|
|
|
# 2 torque hand rigidbody to hand contr
|
|
var quat_hand_rigidbody : Quaternion = hand_rigidbody.global_transform.basis.get_rotation_quaternion()
|
|
var quat_hand_contr : Quaternion = hand_contr.global_transform.basis.get_rotation_quaternion()
|
|
var quat_delta : Quaternion = quat_hand_contr * (quat_hand_rigidbody.inverse())
|
|
var rotation_delta : Vector3 = Vector3(quat_delta.x, quat_delta.y, quat_delta.z) * quat_delta.w
|
|
|
|
var coef_torque := 6.0
|
|
hand_rigidbody.apply_torque(rotation_delta * coef_torque)
|