Войти
ПрограммированиеФорумОбщее

Математика. Расположить два объекта дочерними объектами друг к другу

#0
(Правка: 13:04) 12:59, 14 окт. 2019

Давно не программировал, и векторные уравнения начали забываться.
Помогите, пожалуйста с решением.

Ситуация:

Игра на Unity3D.
Есть один объект (далее База), с дочерним объектом-коннектором (далее Розетка).
Есть второй объект (далее Модуль), с дочерним объектом-коннектором (далее Вилка).

В пространстве База и Модуль расположены случайным образом, но ссылки на них имеются, как и ссылки на Розетку и Вилку.

Вилка и Розетка могут быть расположены в различным местах на поверхности Модуля и Базы соответственно, однако оси Вилки и Розетки расположены таким образом, что оси "y" направлены вдоль Вилки и Розетки.

Если расположить Базу и Модуль таким образом, чтобы положение Вилки и Розетки совпадало, оси "y" были бы направлены в противоположенные стороны, а оси "z" были бы направлены в одну сторону, то Вилка точно "вставиться" в Розетку.

Иллюстрация:

База - куб, Модуль - шар.

SocketPlug2 | Математика. Расположить два объекта дочерними объектами друг к другу

Задача:

Переместить и повернуть Модуль так, чтобы Вилка вошла в Розетку.


#1
15:55, 14 окт. 2019

если анимации не требуется то наверное можно и без математики все сделать

#2
16:11, 14 окт. 2019

Задачу в целом решил обходным способом.

#3
16:13, 14 окт. 2019

Зачем векторные уравнения, когда делаешь в Юнити?
Есть функция преобразования координат относительно конкретного экземпляра Transform
Есть свойство Transform.forward
Берёшь повороты, преобразуешь в нужные системы координат, находишь разницу — профит. Чисто логика, никакой математики.

#4
17:00, 14 окт. 2019

xXxBlackbirdxXx
> Задачу в целом решил обходным способом.
и способ зажал )))

#5
11:29, 15 окт. 2019

endeavour_pr
Ну почему же. Сейчас расскажу.

Я знаю направление вверх на Вилке и положение Вилки. Проблема только в том, что Розетку я двигать не могу, и надо двигать Модуль.

Решил просто. Предварительно создаю в сцене пустой объект (далее Таскатель), выключенный (потом быстрее enable/disable делать, чем Instantiate/Destroy).

Затем включаю Таскатель.

Таскатель.transform.position = Вилка.transform.position;
Таскатель.transform.rotation = Вилка.transform.rotation;
Затем делаю Таскатель родителем Модуля, перетаскиваю Модуль за Таскатель на позицию Розетки и ставлю в её направлении, делаю переворот относительно локальной оси Z на 180 градусов и вуаля: Модуль на месте.

Отцепляем Модуль от Таскателя и выключаем последний.

#6
13:14, 15 окт. 2019

Можно сделать проще. Считаешь безье и двигаешь объект по вектору. Все.
Из любого положения объект придет в нужную точку.

ПрограммированиеФорумОбщее