@@ -8,10 +8,12 @@ use rapier_testbed2d::{
8
8
KeyCode , PhysicsState , TestbedGraphics ,
9
9
} ;
10
10
11
- #[ derive( PartialEq , Eq , Clone , Copy , Debug ) ]
11
+ pub type CharacterSpeed = Real ;
12
+
13
+ #[ derive( PartialEq , Clone , Copy , Debug ) ]
12
14
pub enum CharacterControlMode {
13
- Kinematic ,
14
- Pid ,
15
+ Kinematic ( CharacterSpeed ) ,
16
+ Pid ( CharacterSpeed ) ,
15
17
}
16
18
17
19
pub fn update_character (
@@ -27,28 +29,28 @@ pub fn update_character(
27
29
28
30
if * control_mode != prev_control_mode {
29
31
match control_mode {
30
- CharacterControlMode :: Kinematic => physics. bodies [ character_handle]
32
+ CharacterControlMode :: Kinematic ( _ ) => physics. bodies [ character_handle]
31
33
. set_body_type ( RigidBodyType :: KinematicPositionBased , false ) ,
32
- CharacterControlMode :: Pid => {
34
+ CharacterControlMode :: Pid ( _ ) => {
33
35
physics. bodies [ character_handle] . set_body_type ( RigidBodyType :: Dynamic , true )
34
36
}
35
37
}
36
38
}
37
39
38
40
match * control_mode {
39
- CharacterControlMode :: Kinematic => {
40
- update_kinematic_controller ( graphics, physics, character_handle, controller)
41
+ CharacterControlMode :: Kinematic ( speed ) => {
42
+ update_kinematic_controller ( graphics, physics, character_handle, controller, speed )
41
43
}
42
- CharacterControlMode :: Pid => {
43
- update_pid_controller ( graphics, physics, character_handle, pid)
44
+ CharacterControlMode :: Pid ( speed ) => {
45
+ update_pid_controller ( graphics, physics, character_handle, pid, speed )
44
46
}
45
47
}
46
48
}
47
49
48
50
fn character_movement_from_inputs (
49
51
gfx : & TestbedGraphics ,
50
52
mut speed : Real ,
51
- artificial_gravity : bool ,
53
+ artificial_gravity : Option < Real > ,
52
54
) -> Vector < Real > {
53
55
let mut desired_movement = Vector :: zeros ( ) ;
54
56
@@ -75,8 +77,8 @@ fn character_movement_from_inputs(
75
77
76
78
desired_movement *= speed;
77
79
78
- if artificial_gravity {
79
- desired_movement - = Vector :: y ( ) * speed ;
80
+ if let Some ( artificial_gravity ) = artificial_gravity {
81
+ desired_movement + = Vector :: y ( ) * artificial_gravity ;
80
82
}
81
83
82
84
desired_movement
@@ -87,8 +89,10 @@ fn update_pid_controller(
87
89
phx : & mut PhysicsState ,
88
90
character_handle : RigidBodyHandle ,
89
91
pid : & mut PidController ,
92
+ speed : Real ,
90
93
) {
91
- let desired_movement = character_movement_from_inputs ( gfx, 0.1 , false ) ;
94
+ let desired_movement = character_movement_from_inputs ( gfx, speed, None ) ;
95
+
92
96
let character_body = & mut phx. bodies [ character_handle] ;
93
97
94
98
// Adjust the controlled axis depending on the keys pressed by the user.
@@ -123,9 +127,9 @@ fn update_kinematic_controller(
123
127
phx : & mut PhysicsState ,
124
128
character_handle : RigidBodyHandle ,
125
129
controller : & KinematicCharacterController ,
130
+ speed : Real ,
126
131
) {
127
- let speed = 0.1 ;
128
- let desired_movement = character_movement_from_inputs ( gfx, speed, true ) ;
132
+ let desired_movement = character_movement_from_inputs ( gfx, speed, Some ( phx. gravity . y ) ) ;
129
133
130
134
let character_body = & phx. bodies [ character_handle] ;
131
135
let character_collider = & phx. colliders [ character_body. colliders ( ) [ 0 ] ] ;
@@ -139,7 +143,7 @@ fn update_kinematic_controller(
139
143
& phx. query_pipeline ,
140
144
character_collider. shape ( ) ,
141
145
character_collider. position ( ) ,
142
- desired_movement. cast :: < Real > ( ) ,
146
+ desired_movement,
143
147
QueryFilter :: new ( ) . exclude_rigid_body ( character_handle) ,
144
148
|c| collisions. push ( c) ,
145
149
) ;
@@ -178,29 +182,34 @@ fn character_control_ui(
178
182
ComboBox :: from_label ( "control mode" )
179
183
. selected_text ( format ! ( "{:?}" , * control_mode) )
180
184
. show_ui ( ui, |ui| {
181
- ui. selectable_value ( control_mode, CharacterControlMode :: Kinematic , "Kinematic" ) ;
182
- ui. selectable_value ( control_mode, CharacterControlMode :: Pid , "Pid" ) ;
185
+ ui. selectable_value (
186
+ control_mode,
187
+ CharacterControlMode :: Kinematic ( 0.1 ) ,
188
+ "Kinematic" ,
189
+ ) ;
190
+ ui. selectable_value ( control_mode, CharacterControlMode :: Pid ( 0.1 ) , "Pid" ) ;
183
191
} ) ;
184
192
185
193
match control_mode {
186
- CharacterControlMode :: Kinematic => {
187
- kinematic_control_ui ( ui, character_controller) ;
194
+ CharacterControlMode :: Kinematic ( speed ) => {
195
+ kinematic_control_ui ( ui, character_controller, speed ) ;
188
196
}
189
- CharacterControlMode :: Pid => {
190
- pid_control_ui ( ui, pid_controller) ;
197
+ CharacterControlMode :: Pid ( speed ) => {
198
+ pid_control_ui ( ui, pid_controller, speed ) ;
191
199
}
192
200
}
193
201
} ) ;
194
202
}
195
203
196
- fn pid_control_ui ( ui : & mut Ui , pid_controller : & mut PidController ) {
204
+ fn pid_control_ui ( ui : & mut Ui , pid_controller : & mut PidController , speed : & mut Real ) {
197
205
let mut lin_kp = pid_controller. pd . lin_kp . x ;
198
206
let mut lin_ki = pid_controller. lin_ki . x ;
199
207
let mut lin_kd = pid_controller. pd . lin_kd . x ;
200
208
let mut ang_kp = pid_controller. pd . ang_kp ;
201
209
let mut ang_ki = pid_controller. ang_ki ;
202
210
let mut ang_kd = pid_controller. pd . ang_kd ;
203
211
212
+ ui. add ( Slider :: new ( speed, 0.0 ..=1.0 ) . text ( "speed" ) ) ;
204
213
ui. add ( Slider :: new ( & mut lin_kp, 0.0 ..=100.0 ) . text ( "linear Kp" ) ) ;
205
214
ui. add ( Slider :: new ( & mut lin_ki, 0.0 ..=10.0 ) . text ( "linear Ki" ) ) ;
206
215
ui. add ( Slider :: new ( & mut lin_kd, 0.0 ..=1.0 ) . text ( "linear Kd" ) ) ;
@@ -216,7 +225,13 @@ fn pid_control_ui(ui: &mut Ui, pid_controller: &mut PidController) {
216
225
pid_controller. pd . ang_kd = ang_kd;
217
226
}
218
227
219
- fn kinematic_control_ui ( ui : & mut Ui , character_controller : & mut KinematicCharacterController ) {
228
+ fn kinematic_control_ui (
229
+ ui : & mut Ui ,
230
+ character_controller : & mut KinematicCharacterController ,
231
+ speed : & mut Real ,
232
+ ) {
233
+ ui. add ( Slider :: new ( speed, 0.0 ..=1.0 ) . text ( "Speed" ) )
234
+ . on_hover_text ( "The speed applied each simulation tick." ) ;
220
235
ui. checkbox ( & mut character_controller. slide , "slide" )
221
236
. on_hover_text ( "Should the character try to slide against the floor if it hits it?" ) ;
222
237
#[ allow( clippy:: useless_conversion) ]
0 commit comments