From 3a6da57079667691cf28bb34398896a31815d67e Mon Sep 17 00:00:00 2001 From: Rendo Date: Thu, 13 Nov 2025 21:31:06 +0500 Subject: [PATCH] proximity rotation --- scenes/draggable_object.tscn | 9 +++++++-- scenes/interactible_object.tscn | 3 +++ src/interactible/proximity_rotator.gd | 23 +++++++++++++---------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/scenes/draggable_object.tscn b/scenes/draggable_object.tscn index 423d3c7..b310b2f 100644 --- a/scenes/draggable_object.tscn +++ b/scenes/draggable_object.tscn @@ -13,7 +13,7 @@ height = 0.7 [sub_resource type="CylinderMesh" id="CylinderMesh_627mb"] top_radius = 0.1 -bottom_radius = 0.1 +bottom_radius = 0.08 height = 0.5 [node name="DraggableObject" type="Area3D"] @@ -23,6 +23,9 @@ script = ExtResource("1_vcwhe") shape = SubResource("SphereShape3D_vcwhe") [node name="InteractionArea" type="Area3D" parent="."] +collision_layer = 2 +collision_mask = 2 +input_ray_pickable = false script = ExtResource("2_627mb") [node name="CollisionShape3D" type="CollisionShape3D" parent="InteractionArea"] @@ -31,8 +34,10 @@ shape = SubResource("CapsuleShape3D_vcwhe") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] mesh = SubResource("CylinderMesh_627mb") -[node name="ProximityRotator" type="Node" parent="."] +[node name="ProximityRotator" type="Node" parent="." node_paths=PackedStringArray("rotated")] script = ExtResource("3_00eeh") +rotated = NodePath("../MeshInstance3D") +proximity_radius = 0.496 [connection signal="drag_ended" from="." to="InteractionArea" method="request_interaction"] [connection signal="interaction_reciever_entered" from="InteractionArea" to="ProximityRotator" method="_on_interaction_area_interaction_reciever_entered"] diff --git a/scenes/interactible_object.tscn b/scenes/interactible_object.tscn index 1c5ab67..82b7080 100644 --- a/scenes/interactible_object.tscn +++ b/scenes/interactible_object.tscn @@ -10,6 +10,9 @@ height = 1.0 radius = 0.75 [node name="InteractibleObject" type="Area3D"] +collision_layer = 2 +collision_mask = 2 +input_ray_pickable = false script = ExtResource("1_auicg") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] diff --git a/src/interactible/proximity_rotator.gd b/src/interactible/proximity_rotator.gd index 9d80599..c2b888c 100644 --- a/src/interactible/proximity_rotator.gd +++ b/src/interactible/proximity_rotator.gd @@ -1,23 +1,26 @@ extends Node @export var rotated: Node3D +@export var proximity_radius: float @onready var start_rotation = rotated.quaternion -var reiciever: InteractionReciever +var reciever: InteractionReciever -func _on_interaction_area_interaction_reciever_entered(reicever: InteractionReciever) -> void: - if self.reicever == null: - self.reciever = reicever +func _on_interaction_area_interaction_reciever_entered(rec: InteractionReciever) -> void: + if reciever == null: + reciever = rec -func _on_interaction_area_interaction_reciever_exited(reicever: InteractionReciever) -> void: - if self.reicever == reicever: - self.reciever = null +func _on_interaction_area_interaction_reciever_exited(rec: InteractionReciever) -> void: + if reciever == rec: + reciever = null func _process(_delta: float) -> void: - if reiciever == null: + if reciever == null: rotated.quaternion = start_rotation + return var camera: Camera3D = get_viewport().get_camera_3d() - var angle_to: Quaternion = Quaternion(-camera.basis.z,1.5707963267948966) - var calculated_angle: Quaternion = start_rotation.slerp() + var rotation_direction : float = -sign(camera.basis.x.dot(reciever.global_position - rotated.global_position)) + var result_quaternion: Quaternion = Quaternion(-camera.basis.z,PI + 1.5707963267948966 * rotation_direction) + var calculated_angle: Quaternion = start_rotation.slerp(result_quaternion,clamp(proximity_radius/rotated.global_position.distance_to(reciever.global_position),0,1)) rotated.quaternion = calculated_angle