Думал, как осуществить всё в точности как на видео и решил, что пока лучше остановиться на полуавтоматическом варианте, где меньше расходуются ресурсы сервера, меньше комфорта для игрока, но больше контроля над объектом.
Игрок захватывает объект, нажав цифру 4 (пункт «Захватить/Отпустить» в «Управление»).
Открывается следующее окно меню, где 4 пункт – «Отпустить», при нажатии на который происходит отпускание объекта и возвращение в предыдущее меню (по сути, останется старый способ). Игрок смотрит на другой объект и помечает его нажатием на 1 – «Пристроить» (кнопки 2 и 3 можно оставить пустыми). Тот объект помечается, дальше идёт работа только с двумя объектами. Для каждого из них рассчитывается ближайшая (из восьми крайних точек объекта в пространстве) к нулевым координатам карты точка (т.е. расчёт и сравнение длин отрезков, все данные имеются). «Нулевая» точка захваченного объекта совмещается с «нулевой» точкой второго объекта.(он весь перемещается с сохранением углов)
Открывается следующее окно меню с пунктами 1 - «Вдоль +Х», 2 – «Вдоль –Х» и т.п. для других осей. Допустим, выберем 1. Берётся ребро второй модели, выходящее из её «нулевой» точки и параллельное оси Х этой модели. Это будет вектор а. Три ребра, выходящие из «нулевой» точки ранее захваченной модели, составят векторы x, y, z. Теперь определим, какое из них ближе всего наклонено к а. Длины x, y, z меняем на длину а, сохранив их углы. Вычитая из а поочерёдно x, y, z, а потом находя длину векторов разности, узнаем наименьший результат. Он укажет на вектор, соответствующее которому ребро надо выровнять с осью Х второй модели, сохранив при этом совмещение «нулевых» точек двух моделей. После этого нулевую точку ранее захваченной модели надо переместить вдоль оси Х второй модели на расстояние, соответствующее длине ребра второй модели вдоль её оси Х. Если бы был выбран пункт 2 – «Вдоль –Х», то надо было бы переместить нулевую точку захваченной ранее модели на расстояние, соответствующее вектору из позапрошлого предложения вниз вдоль оси Х второй модели.
Вот такой «зародыш» у меня пока получился. Наверняка что-то можно сделать проще, используя приёмы кодирования, но я тут ни бум-бум.