Во-первых, нам нужно иметь текущую позицию ребенка и целевую позицию в системе координат родителя.Звучит так, как будто положение ребенка уже выражено в этой системе координат.Затем, если целевая позиция находится в мировых координатах, вы просто делаете это с помощью обратного преобразования родительского мира:
pTargetLocal = parent.worldMatrix^-1 * pTarget
Получив это, мы хотим найти вращение R
, такое, что pCurrentLocal
повернут к pTargetLocal
.Предполагая единичные векторы (поскольку вращения сохраняют длины), это равно:
parent.worldMatrix * pTargetLocal = parent.worldMatrix * R * pCurrentLocal
pTargetLocal = R * pCurrentLocal
Как только мы получим R
, нам просто нужно обновить parent.worldMatrix = parent.worldMatrix * R
.
Это можно решить, представивR
в формате оси-угол.Ось будет axis = Vector3.Cross(pCurrentLocal, pTargetLocal)
, а угол angle = Vector3.Angle(pCurrentLocal, pTargetLocal)
.Вы можете либо вычислить кватернион или матрицу из этих параметров и умножить их на текущее родительское преобразование.
Я предположил, что центр вращения является источником локальной системы координат родителя.Вы также можете вращаться вокруг другого центра, чтобы включить компонент перевода.