Define a position for the light source and use it as a guide to orient the shadows and lights.
Works much like inverted perspective: if you draw a line from the light source to the border of an object, it will tell you where the shadowed part of the object starts, and if your extend it until it touches another object, it will tell you the extent of the shadow.
Allow for reflected light highlights on the sides of the dark side of objects.
If you start from a “model” that already has shadows, try to find the origin of light by backtracking existing shadows and then use it to calculate new shadows.
You may not need an exact location, a good estimate may suffice. Ditto for shadow precision, a rough shape may be enough. It all depends on how realistic one wants the result.