Как повернуть родителя, чтобы переместить ребенка в Unity3D? - PullRequest
0 голосов
/ 26 июня 2018

У меня довольно сложная математическая задача, которую мне нужно решить для игры, над которой я работаю в Unity.Я попробовал пару вещей, но ничего не помогло.

В основном мне нужно применить смещение (кватернион) к родителю, где результатом этого поворота является перемещение его потомка в заданном направлении.

Чтобы объяснить это лучше, проблема была бы простой, если бы можно было гарантировать, что направляющий вектор родителя направлен на ребенка.Затем я просто создал бы позицию-призрак, добавив нужное направление к дочернему элементу, а затем использовал вращение LookAt, чтобы повернуть родительский элемент, чтобы посмотреть на эту позицию-призрак.(Ребенка не нужно ставить в определенную позицию, ему просто нужно двигаться в общем направлении в этом направлении)

Что делает это сложным, так это то, что A. родитель может находиться в любом повороте, а B.ребенок может находиться в любой позиции относительно родителя.

Для контекста я работаю над процедурной системой анимации и хотел бы, чтобы кости были согнуты в направлении скорости Агента.С костями IK это легко, просто переместите IK.Но для настоящих костей мне нужен способ переместить кость в направлении, вращая кость ее родителя.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 26 июня 2018

Во-первых, нам нужно иметь текущую позицию ребенка и целевую позицию в системе координат родителя.Звучит так, как будто положение ребенка уже выражено в этой системе координат.Затем, если целевая позиция находится в мировых координатах, вы просто делаете это с помощью обратного преобразования родительского мира:

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).Вы можете либо вычислить кватернион или матрицу из этих параметров и умножить их на текущее родительское преобразование.

Я предположил, что центр вращения является источником локальной системы координат родителя.Вы также можете вращаться вокруг другого центра, чтобы включить компонент перевода.

...