Друзья, всем доброго времени суток!
Собственно, начну с небольшого предисловия.
С этой проблемой я встретился уже чуть ли не более трех месяцев назад. Сначала очень рьяно бросился ее решать, но сходу не получилось. Я много думал, пробовал - не выходило (или выходило, но недостаточно правильно). Постепенно идеи иссякали и решение все отдалялось и отдалялось...
Я много раз думал, что стою на пороге решения проблемы и вот-вот решу ее, но все никак не выходит...
Мною уже создавались темы по этому поводу здесь, на форуме. Но каждый раз я пытался узнать решение какой-то мелкой, промежуточной проблемы. Форумчане мне здорово помогали все это время, за что я безумно благодарен всем, кто хоть раз откликался на мой зов о помощи!
На данный момент я перепробовал все, что как мне кажется, только возможно.
Посему решил описать все максимально подробно и попросить помощи вновь, но уже не в решении промежуточных проблем, а в решении всей головоломки в целом.
Я буду ООООЧЕНЬ благодарен всем, кто поможет мне решить эту проблему.
Ну все, хватит предисловий. Теперь к проблеме.
Суть такова: есть космический корабль, который может вращаться и перемещаться в пространстве в любом направлении. У этого космического корабля есть слоты под установку турелей. Слоты статично расположены на корпусе корабля. И, наконец, есть турель, состоящая из двух компонентов: станина (вращается только вокруг Z оси(Yaw), относительно корабля. На нее крепится турель) и орудие (вращается только вокруг оси Y(Pitch), относительно станины).
Задача: поворачивать орудие стволом в точку, в которую указывает курсор (на определенной дистанции от турели). Собственно найти точку, в которую нужно поворачивать орудие, у меня не составило труда.
Самая ж*** начинается когда дело доходит до самого вращения. Я пробовал вращать каждый компонент турели при помощи локальных координат. Я пробовал вращать оба компонента в глобальных координатах. Что только я не попробовал - ничего не выходит.
Логика должна быть такова, как мне кажется: берем точку, в которую необходимо повернуться, через FindLookAtRotation получаем необходимый вектор и затем есть выбор - поворачивать компоненты в локальных координатах (SetRelativeRotation), либо в глобальных (SetWorldRotation).
В первом случае, станина вращается только на Yaw(влево-вправо)-координате, а орудие - только на Pitch(вверх-вниз)-координате, ибо последнее является дочерним от станины и поворачивается по Yaw туда же, куда повернется сама станина.
Во втором случае мы вращаем станину только в Yaw-диапазоне, а орудие - в Pitch- и Yaw-диапазонах. Таким образом достигается одинаковое глобальное вращение по Yaw-координатам и орудия, и станины. При всем при этом, мы берем Roll(вращение вокруг своей оси)-координату от корабля и делаем ее соответствующим Roll-вращением и станины и орудия, к тому же, во вращение станины необходимо подключить Pitch-координату, чтобы последняя по данной координате была параллельна кораблю.
И знаете что? Ничего не работает! Ну, не совсем, конечно.
Во втором варианте (он был испробован мною в первую очередь) у станины и орудия, при определенном вращении корабля, появляется Roll-вращение (относительно корабля). Такая проблема наблюдается при соблюдении некоторых факторов, а именно: вращение должно быть "диагональным", то есть проходить через Pitch- и Yaw-координаты, в глобальном исчислении. В чем тут проблема, я никак не могу понять, ибо беру-то я этот самый Roll от корабля... Как он может там появиться?! Не представляю вообще.
После того, как я не смог решить этот вопрос, я обратился к локальному вращению (к первому варианту). Здесь я сделал так, как описал выше, получив локальные координаты вращения при помощи Convert Transform To Relative. И что я наблюдал? Мало того, что вектор вращения мне пришлось умножать на -1, чтобы добиться правильной ориентации станины и орудия (они "зеркалили" необходимое вращение), так еще и орудие начало очень странно себя вести... Я даже не знаю, как это описать. Это что-то вроде многократно увеличенного значения, которое входит в Pitch орудия (оно реагирует правильно (с умножением значения на -1), но через чур сильно - я сдвигаю мышь на миллиметр - орудие поворачивается на метр), плюсом к такому поведению стало то, что когда я разворачивал корабль на 180 градусов и орудие начинало снова инвертировать входящее значение (снова умножать на -1), делало оно это плавно, по мере того как я разворачивал корабль.
Вот, собственно и все.
Если вы прочитали этот длиннопост до сих пор, то у вас очень много терпения :D
Если кому-нибудь потребуются скрины Blueptint'а, то я их отправлю (обоих вариантов), если нужно видео о том, как это все выглядит, то запишу.
Очень надеюсь на вашу помощь, господа. Ибо больше у меня идей нет.
Спасибо всем, кто примет участие в решении проблемы, заранее!