@@ -46,6 +46,8 @@ var hand_right_grab_debounce_timer: float = 0.0
46
46
var last_hand_left_grab_state : bool = false
47
47
var last_hand_right_grab_state : bool = false
48
48
49
+ @export var linear_dampening : float = 0.45
50
+ @export var angular_dampening : float = 0.45
49
51
50
52
func _process (delta_time : float ) -> void :
51
53
var hand_left_grab : float = hand_left .get_float ("grip" )
@@ -64,41 +66,35 @@ func _process(delta_time: float) -> void:
64
66
65
67
if both_hands_just_grabbed ():
66
68
state = Mode .PINCH
67
- if not (hand_left_grab or hand_right_grab ):
68
- state = Mode .NONE
69
- delta_transform = Transform3D () # Reset delta_transform when not grabbing
70
- apply_velocity (delta_time ) # Apply stored velocities when not grabbing
69
+
70
+ if not (hand_left_grab and hand_right_grab ):
71
+ if state != Mode .NONE :
72
+ state = Mode .NONE
73
+ delta_transform = Transform3D () # Reset delta_transform when not grabbing
74
+ apply_velocity (delta_time ) # Apply stored velocities when not grabbing
71
75
72
76
match state :
73
77
Mode .NONE :
74
- if hand_left_grab and not left_hand_just_grabbed .value :
75
- state = Mode .GRAB
76
- elif hand_right_grab and not right_hand_just_grabbed .value :
77
- state = Mode .GRAB
78
-
79
- Mode .GRAB :
80
- if hand_left_grab and hand_right_grab :
81
- state = Mode .ORBIT
82
-
83
- set_pivot_and_transform (hand_left_grab , prev_hand_left_transform , hand_left .transform )
84
- set_pivot_and_transform (hand_right_grab , prev_hand_right_transform , hand_right .transform )
85
- store_velocity (prev_hand_left_transform , hand_left .transform , delta_time )
78
+ # Do nothing when no hands are grabbing
79
+ pass
86
80
87
81
Mode .PINCH :
88
- if not (hand_left_grab and hand_right_grab ) and both_hands_just_ungrabbed :
89
- state = Mode .GRAB
82
+ if not (hand_left_grab and hand_right_grab ):
83
+ state = Mode .NONE
90
84
91
- set_pinch_pivot_and_transform (prev_hand_left_transform .origin , prev_hand_right_transform .origin , hand_left .transform .origin , hand_right .transform .origin )
92
- store_velocity (prev_hand_left_transform , hand_left .transform , delta_time )
93
- store_velocity (prev_hand_right_transform , hand_right .transform , delta_time )
85
+ if hand_left_grab and hand_right_grab and hand_left_grab_debounce_timer >= debounce_duration and hand_right_grab_debounce_timer >= debounce_duration :
86
+ set_pinch_pivot_and_transform (prev_hand_left_transform .origin , prev_hand_right_transform .origin , hand_left .transform .origin , hand_right .transform .origin )
87
+ store_velocity (prev_hand_left_transform , hand_left .transform , delta_time )
88
+ store_velocity (prev_hand_right_transform , hand_right .transform , delta_time )
94
89
95
90
Mode .ORBIT :
96
91
if not (hand_left_grab and hand_right_grab ):
97
- state = Mode .GRAB
92
+ state = Mode .NONE
98
93
99
- set_orbit_pivot_and_transform (prev_hand_left_transform .origin , prev_hand_right_transform .origin , hand_left .transform .origin , hand_right .transform .origin )
100
- store_velocity (prev_hand_left_transform , hand_left .transform , delta_time )
101
- store_velocity (prev_hand_right_transform , hand_right .transform , delta_time )
94
+ if hand_left_grab and hand_right_grab and hand_left_grab_debounce_timer >= debounce_duration and hand_right_grab_debounce_timer >= debounce_duration :
95
+ set_orbit_pivot_and_transform (prev_hand_left_transform .origin , prev_hand_right_transform .origin , hand_left .transform .origin , hand_right .transform .origin )
96
+ store_velocity (prev_hand_left_transform , hand_left .transform , delta_time )
97
+ store_velocity (prev_hand_right_transform , hand_right .transform , delta_time )
102
98
103
99
# Integrate motion
104
100
target_transform = delta_transform * target_transform
@@ -112,7 +108,6 @@ func _process(delta_time: float) -> void:
112
108
prev_hand_left_grab = hand_left_grab
113
109
prev_hand_right_grab = hand_right_grab
114
110
115
-
116
111
func handle_debounce (current_grab_value : float , delta_time : float , is_left_hand : bool ) -> void :
117
112
var grab_debounce_timer : float = hand_right_grab_debounce_timer
118
113
@@ -145,11 +140,6 @@ func handle_debounce(current_grab_value: float, delta_time: float, is_left_hand:
145
140
else :
146
141
hand_right_grab_debounce_timer = grab_debounce_timer
147
142
148
-
149
- @export var linear_dampening : float = 0.45
150
- @export var angular_dampening : float = 0.45
151
-
152
-
153
143
func apply_velocity (delta_time : float ) -> void :
154
144
# Apply linear damping, reducing the velocity by the damping factor each frame
155
145
linear_velocity *= (1.0 - linear_dampening )
@@ -167,7 +157,6 @@ func apply_velocity(delta_time: float) -> void:
167
157
# Apply angular damping to reduce angular speed over time
168
158
angular_velocity *= (1.0 - angular_dampening )
169
159
170
-
171
160
func store_velocity (prev_hand_transform : Transform3D , hand_transform : Transform3D , delta_time : float ) -> void :
172
161
if delta_time > 0 :
173
162
var displacement = hand_transform .origin - prev_hand_transform .origin
@@ -186,30 +175,32 @@ func store_velocity(prev_hand_transform: Transform3D, hand_transform: Transform3
186
175
# Here the angular velocity will be the rotation axis scaled by the amount of rotation over time.
187
176
angular_velocity = rotation_axis * (rotation_amount / delta_time )
188
177
189
-
190
178
func both_hands_just_grabbed () -> bool :
191
179
return left_hand_just_grabbed .value and right_hand_just_grabbed .value
192
180
193
-
194
181
func update_hand_grab_status (hand_grab : float , prev_hand_grab : float , just_grabbed : BoolTimer , just_ungrabbed : BoolTimer ) -> void :
195
182
if hand_grab and not prev_hand_grab :
196
183
just_grabbed .set_true (max_pinch_time )
197
184
if not hand_grab and prev_hand_grab :
198
185
just_ungrabbed .set_true (max_pinch_time )
199
186
200
-
201
187
func set_pivot_and_transform (hand_grab : float , prev_hand_transform : Transform3D , hand_transform : Transform3D ) -> void :
202
188
if hand_grab :
203
189
from_pivot = prev_hand_transform .origin
204
190
to_pivot = prev_hand_transform .origin
205
191
delta_transform = _world_grab .get_grab_transform (prev_hand_transform , hand_transform )
206
192
207
-
208
193
func set_pinch_pivot_and_transform (prev_hand_left_origin : Vector3 , prev_hand_right_origin : Vector3 , hand_left_origin : Vector3 , hand_right_origin : Vector3 ) -> void :
209
- from_pivot = (prev_hand_left_origin + prev_hand_right_origin ) / 2.0
210
- to_pivot = (hand_left_origin + hand_right_origin ) / 2.0
211
- delta_transform = _world_grab .get_pinch_transform (prev_hand_left_origin , prev_hand_right_origin , hand_left_origin , hand_right_origin )
212
-
194
+ var prev_distance = prev_hand_left_origin .distance_to (prev_hand_right_origin )
195
+ var current_distance = hand_left_origin .distance_to (hand_right_origin )
196
+ var distance_change = current_distance - prev_distance
197
+ var deadzone_threshold : float = 0.01
198
+ if abs (distance_change ) > deadzone_threshold :
199
+ from_pivot = (prev_hand_left_origin + prev_hand_right_origin ) / 2.0
200
+ to_pivot = (hand_left_origin + hand_right_origin ) / 2.0
201
+ delta_transform = _world_grab .get_pinch_transform (prev_hand_left_origin , prev_hand_right_origin , hand_left_origin , hand_right_origin )
202
+ else :
203
+ delta_transform = Transform3D ()
213
204
214
205
func set_orbit_pivot_and_transform (prev_hand_left_origin : Vector3 , prev_hand_right_origin : Vector3 , hand_left_origin : Vector3 , hand_right_origin : Vector3 ) -> void :
215
206
from_pivot = prev_hand_left_origin
0 commit comments