Open NatePlays95 opened 9 months ago
Can you please try this with a supported version, like 4.1.3 (only the latest patch version is supported, and it might already be fixed)
can confirm bug on v4.1.3.stable.official [f06b6836a]
EDIT: can also confirm bug on v4.2.rc1.official [ad72de508]
That's not the only issue with CSGPrimitives and physics. They are also known to miss body_entered signals for Rigidbodies. It's unfortunate but they are just not suited to be used in this context. I still consider it a bug, but since it has been a long standing issue and doesn't seem to be fixed soon, these physics- side limitations should be mentioned explicitly in the docs.
And for Jolt: It will hit backfaces by default when casting. Could explain your problem when using flipped faces.
I'm dealing with ConvexPolygonShape3D, those created from Qodot, and the results have been really bad when trying to check if an object was above the player but after changing the margin to 0.15 in my case (I'm using a BoxCollider for the shapecast, which is not very big, less than 1m3), I finally managed to get it working decently. Also I'm calling force_shapecast_update() after move_and_slide(), if that could help.
For my needs it is fine but it is definetely a problem is someone needs more precision/smaller colliders and I wouldn't be surprised if it fails with other geometry.
Godot 4.2.1, Godot Physics.
Godot version
v4.1.1.stable.official [bd6af8e0e]
System information
Godot v4.1.1.stable - Windows 10.0.22621 - Vulkan (Forward+) - dedicated NVIDIA GeForce RTX 3050 Laptop GPU (NVIDIA; 31.0.15.4617) - 12th Gen Intel(R) Core(TM) i5-12500H (16 Threads)
Issue description
A ShapeCast3D with a sphere shape set is varying its collision distance from another collider wildly when moving a few units parallel to its extend direction. This problem does not show itself with RayCast3D.
How I expect it to work
Cast a shape downwards, onto a collider like a CSGBox, and the shapecast cast will stay at one Y level. Move the shapecast origin in the X and Z axis, and the Y level of the cast should stay the same.
How it actually performs
Move the shapecast origin in the X and Z axis, and the Y level of the cast changes. Using debug shapes, the sphere shape visibly bounces, even though the origin's height stays the same. Variations of >0.0001 aren't great for physics sims, but I can see variations of >0.1, which are unacceptable!
My observations:
StaticBodies from meshes do not show this problem if the shapecast hits the front-side of a tri, but do show if the shapecast hits the back-side of a tri. CSGBoxes with large sizes show this problem very often, as an user tends to make one single large csgbox instead of one for each cubic meter of space.
This behavior would usually not occur in Godot-JoltPhysics, but if I use a CSGBox with flipped faces there, it does. My guess is that sphere ShapeCasts don't go well with reversed normals, yet CSGBoxes have double-sided faces with the back-side interfering with the front-side from lack of accuracy?
I think the distance from the sides of a tri increases the effect, so casting to the center of a tri has more visible effects than casting closer to that tri's edge, but I'm not sure.
Why is it a problem
For physics simulations like vehicles, any minor deviations can cause major instability in suspension and wheel systems. For clipped cameras, camera positions jerking when in contact with walls and ceilings may lead to motion sickness. This makes CSG objects unusable for prototyping with those systems in mind, requiring a blender-first workflow to ensure no back-face or double-face colliders, which is not ideal.
Steps to reproduce
Minimal reproduction project
ShapecastAccuracyBug.zip There's a
test_shapecast
scene with a csgbox and a shapecast tied to a path, as seen in the example gif. There's also atest_shapecast_on_mesh
scene with two square planes from Blender set up as static bodies, and one's upside down, as well as the raycast and the path.