That is a bit of a mystery.
The structure that contains the raycast results has a user-provided buffer for non-blocking hits and a single fixed-size data block for a blocking hit. If a blocking hit is issued the result will be stored in the blocking hit rather than in the buffer. If a non-blocking hit is issued it will store the hits in the user-provided buffer and store the number of hits in nbTouches. If a non-blocking raycast finds three hits along the raycast it will store 3 hits in the buffer and store a value of 3 in nbTouches. A blocking raycast will always result in nbTouches having value zero because it stores the single hit in the fixed-size data block.
In addition to raycasts, physx vehicles also support sweeps. For raycasts we are only interested in the hit that is closes to the start point of the raycast. There is no point in having any more information so there is an assumption that vehicle raycasts will be blocking. Sweeps are a bit different. We might want to look at all the hits encountered along the sweep and decide which ones to ignore and which one to accept by looking at the normal of the hit. Sweeps can be blocking or non-blocking.
The warning is issued from this line of code in PxVehicleUpdate.cpp
PX_CHECK_AND_RETURN(!raycastResults || (0 == raycastResults[i].nbTouches), “Raycasts must generate blocking hits”);
It says that if we are doing a raycast then it must be a blocking raycast. It doesn’t enforce any rule on sweeps because they can be blocking or non-blocking.
Can you find out the value of raycastResults and raycastResults[i].nbTouches?