mirror of
https://github.com/godotengine/godot.git
synced 2025-12-08 06:09:55 +00:00
Fix rigid body ray cast CCD in 2D and 3D Godot Physics
For 2D: Raycast CCD now works the same as in 3D, it changes the body's velocity to place it at the impact position instead of generating a contact point that causes a wrong push back. For both 2D and 3D: The raycast CCD process reads and modifies body velocities, so it needs to be moved to pre_solve() instead of setup() to be processed linearly on the main thread, otherwise multithreading can cause some CCD results to be randomly lost when multiple collisions occur.
This commit is contained in:
parent
f1e3c87244
commit
30a608b7b9
4 changed files with 94 additions and 40 deletions
|
|
@ -79,10 +79,11 @@ class GodotBodyPair2D : public GodotConstraint2D {
|
|||
Contact contacts[MAX_CONTACTS];
|
||||
int contact_count = 0;
|
||||
bool collided = false;
|
||||
bool check_ccd = false;
|
||||
bool oneway_disabled = false;
|
||||
bool report_contacts_only = false;
|
||||
|
||||
bool _test_ccd(real_t p_step, GodotBody2D *p_A, int p_shape_A, const Transform2D &p_xform_A, GodotBody2D *p_B, int p_shape_B, const Transform2D &p_xform_B, bool p_swap_result = false);
|
||||
bool _test_ccd(real_t p_step, GodotBody2D *p_A, int p_shape_A, const Transform2D &p_xform_A, GodotBody2D *p_B, int p_shape_B, const Transform2D &p_xform_B);
|
||||
void _validate_contacts();
|
||||
static void _add_contact(const Vector2 &p_point_A, const Vector2 &p_point_B, void *p_self);
|
||||
_FORCE_INLINE_ void _contact_added_callback(const Vector2 &p_point_A, const Vector2 &p_point_B);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue