Страница 1 из 1

трансформ относительно "ребёнка"

СообщениеДобавлено: 23 сен 2017, 17:44
Xtir
Всем привет! У меня есть объект с "ребёнком". Мне нужно этого "ребёнка" поместить на определённую позицию и повернуть на определённый угол. Так вот, каким образом мне передвинуть родителя, что бы "ребёнок" оказался в нужных мне координатах?

Re: трансформ относительно "ребёнка"

СообщениеДобавлено: 23 сен 2017, 18:22
Susanin
Простейший вариант:
временно поменять местами родителя и ребенка.

Re: трансформ относительно "ребёнка"

СообщениеДобавлено: 23 сен 2017, 18:40
samana
Просто считаете направление и расстояние от ребёнка до нужной новой позиции, но перемещаете родителя, а не ребёнка. Хотя с поворотом это не сработает. В общем ответ мой не корректный.

Re: трансформ относительно "ребёнка"

СообщениеДобавлено: 24 сен 2017, 08:32
Shekn
Надо использовать задание трансформов объектов с помощью матриц. Хорошо известно, что трансформы задаются матрицами 4x4 специального вида. Предположим у нас есть родитель P с матрицей трансформов T_P, и его потомок C с матрицей трансформов T_C. Матрица T_C должна отражать локальную трансформацию объекта C относительно P (ведь у каждого объекта есть два трансформа - локальный и глобальный. Здесь нужен именно локальный). Перевод из локальных трансформов в глобальные состоит просто в перемножении матриц T_P и T_C. Теперь, если известны глобальные трансформы конечной точки (пусть это будет матрица A), то есть где должен быть C, то значит надо найти такую матрицу T_P', что T_P' * T_C = A. Дальше ответ очевиден.

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

Re: трансформ относительно "ребёнка"

СообщениеДобавлено: 28 сен 2017, 08:02
Bill Gates
parent.rotation = parent.rotation * (child.localRotation * Quaternion.Euler (0f, 30f, 0f));
parent.position = target.position + (parent.position - child.position);