Quick answer: Godot Decal3D missing surfaces it should hit when target is rotated? Decals project along their local −Z — orient the Decal3D’s forward toward the surface, not into the world.
A bullet hole decal lands flat on flat walls but disappears on angled walls. The Decal3D is world-axis-aligned, not aligned to the surface normal.
Align to Surface Normal
decal.look_at_from_position(hit.position + hit.normal * 0.1, hit.position - hit.normal)Positions the decal slightly off the surface, looking back into it. Its −Z now matches −normal — projection hits the surface.
Project Size
The size property is a box in local space (X width, Y height, Z depth-into-surface). If the rotated mesh is thicker than Z, it’s partially outside the projection volume.
Distance Fade
Decals fade with distance; check distance_fade_enabled and the begin/end values. A close decal that looks missing might just be 0% alpha.
Verifying
Decals consistently appear on angled walls, ceilings, sloped ground — oriented correctly to each surface.
“Decal3D projects along −Z. Align it to the surface normal at the hit point.”
Wrap decal spawning in a helper that takes (hit_position, hit_normal) and handles alignment — you’ll re-use it for every bullet, blood, footprint.