WorldPivot is not updated when the object moves due to physical simulation because doing so would be excessively expensive for complex moving objects. If you want to know what an object’s pivot is you should always call GetPivot().
If you were hoping to listen on WorldPivot changed as a backdoor way to get around CFrame not firing changed events during physics simulation, nice try, but that won’t work. The bottom line is that you need to use some form of loop to process position changes thanks to simulation, not changed events.
Actually I was wondering what was the difference between reading WorldPivot and GetPivot(). I was about to replace GetPivot() with WorldPivot as it seemed less expensive. Good you clarified, I would
recommend adding this note to the documentation
C++ Method calls and C++ property access have a very similar cost, they’re effectively exactly one function call either way. As for those two in particular… yes, GetPivot is very slightly slower… but because that’s exactly because its doing extra work to always do the right thing.
WorldPivot should only be used when you’re trying to actually adjust where on the model the pivot is.