By the looks of what you described I think the rotation of the parent is inherited for the children. I think the problem here is with getting
SpriteBatch to render them correctly. The
origin parameter is the offset applied to the
position where you want
(0, 0) to be for the local space of the sprite. Essentially this means it's the pivot point for rotation and affects the final render position. Using matrices to understand how
SpriteBatch operates, it would be something like:
-OriginTranslation * Scale * Rotation * PositionTranslation
To have the origin translation NOT affect the position translation, it has to be undone like so:
-OriginTranslation * Scale * Rotation * OriginTranslation * PositionTranslation
SpriteBatch unfortunately doesn't allow to pass a handmade matrix to transform the 4 vertices of the quad, but the following would allow orbiting a target (by switching rotation and position).
-OriginTranslation * Scale * PositionTranslation * Rotation
So to fix this to work for you with
SpriteBatch we can add a "hack" using the idea of Matrix2. Note that this isn't really tested; I just wrote it on the spot. It probably doesn't work for nesting correctly, but I do think it is something in the right direction.
var parentPosition = transform.Parent?.WorldPosition ?? Vector2.Zero;
transform.WorldPosition + parentPosition, // account for how SpriteBatch applies origin translation
sprite.originOffset - parentPosition, // move origin to parent location