В первую очередь, нужно учитывать ориентацию родителя.
Вращение родительского объекта влияет на глобальную позицию дочернего объекта, потому что дочерний объект "прикреплен" к родительскому объекту. Внутри локальной системы координат родителя, дочерний объект имеет фиксированную позицию. Однако, когда родительский объект вращается, он "вращает" свою собственную локальную систему координат вместе с дочерним объектом.
Давайте приведем простой пример.
Представим, что у вас есть родительский объект, который находится в начале координат (0,0,0), и дочерний объект, который находится в локальных координатах (1,0,0) относительно родителя. Если мы посмотрим на него в глобальных координатах, он будет находиться в (1,0,0).
Теперь, представьте, что вы поворачиваете родительский объект на 90 градусов вокруг оси Y. Если бы вы не учли вращение родителя при вычислении глобальной позиции дочернего объекта, вы бы подумали, что он все еще находится в (1,0,0). Но на самом деле, поскольку он вращается вместе с родителем, его глобальная позиция теперь (0,0,-1).
Это произошло, потому что вращение родителя изменило направление "вектора" от родителя к ребенку в глобальном пространстве. При вращении вокруг оси Y, объекты, которые находились вдоль оси X, перемещаются вдоль оси Z.
### Нахождение global position
```csharp
_position = Parent._position + Parent._rotation * _localPosition;
```
Нам нужно применить вращение родителя к локальной позиции дочернего объекта, прежде чем добавлять позицию родителя. Это обеспечивает корректное вычисление глобальной позиции дочернего объекта при вращении родителя.
### Нахождение local position
```csharp
_localPosition = Quaternion.Inverse(Parent._rotation) * (_position - Parent._position);
```