static void SplitReposition(Entity a, Entity b, ref ShapeDistributionInformation distributionInfoA, ref ShapeDistributionInformation distributionInfoB, float weightA, float weightB)
{
//The compounds are not aligned with the original's position yet.
//In order to align them, first look at the centers the split method computed.
//They are offsets from the center of the original shape in local space.
//These can be used to reposition the objects in world space.
Vector3 weightedA, weightedB;
Vector3.Multiply(ref distributionInfoA.Center, weightA, out weightedA);
Vector3.Multiply(ref distributionInfoB.Center, weightB, out weightedB);
Vector3 newLocalCenter;
Vector3.Add(ref weightedA, ref weightedB, out newLocalCenter);
Vector3.Divide(ref newLocalCenter, weightA + weightB, out newLocalCenter);
Vector3 localOffsetA;
Vector3 localOffsetB;
Vector3.Subtract(ref distributionInfoA.Center, ref newLocalCenter, out localOffsetA);
Vector3.Subtract(ref distributionInfoB.Center, ref newLocalCenter, out localOffsetB);
Vector3 originalPosition = a.position;
b.Orientation = a.Orientation;
Vector3 offsetA = Vector3.Transform(localOffsetA, a.Orientation);
Vector3 offsetB = Vector3.Transform(localOffsetB, a.Orientation);
a.Position = originalPosition + offsetA;
b.Position = originalPosition + offsetB;
Vector3 originalLinearVelocity = a.linearVelocity;
Vector3 originalAngularVelocity = a.angularVelocity;
a.AngularVelocity = originalAngularVelocity;
b.AngularVelocity = originalAngularVelocity;
a.LinearVelocity = originalLinearVelocity + Vector3.Cross(originalAngularVelocity, offsetA);
b.LinearVelocity = originalLinearVelocity + Vector3.Cross(originalAngularVelocity, offsetB);
}