Полезное

Мы Вконтакте

Discord канал

#
Пред.
Модератор: icms
Аватара пользователя
Пользователь
Сообщения: 102
Друзья, всем доброго времени суток!
Собственно, начну с небольшого предисловия.
С этой проблемой я встретился уже чуть ли не более трех месяцев назад. Сначала очень рьяно бросился ее решать, но сходу не получилось. Я много думал, пробовал - не выходило (или выходило, но недостаточно правильно). Постепенно идеи иссякали и решение все отдалялось и отдалялось...
Я много раз думал, что стою на пороге решения проблемы и вот-вот решу ее, но все никак не выходит...

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

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

Я буду ООООЧЕНЬ благодарен всем, кто поможет мне решить эту проблему.

Ну все, хватит предисловий. Теперь к проблеме.

Суть такова: есть космический корабль, который может вращаться и перемещаться в пространстве в любом направлении. У этого космического корабля есть слоты под установку турелей. Слоты статично расположены на корпусе корабля. И, наконец, есть турель, состоящая из двух компонентов: станина (вращается только вокруг 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'а, то я их отправлю (обоих вариантов), если нужно видео о том, как это все выглядит, то запишу.
Очень надеюсь на вашу помощь, господа. Ибо больше у меня идей нет.

Спасибо всем, кто примет участие в решении проблемы, заранее!
Аватара пользователя
Пользователь
Сообщения: 1341
может сразу и проект выложешь ?
_________________
прикрепленные картинки с radikal не смотрю.
Аватара пользователя
Пользователь
Сообщения: 102
Noob256 писал(а):
может сразу и проект выложешь ?

Там такой бардак, ноя попробую написать, что и где находится.
Подождите секунду, я залью на ЯДиск
Аватара пользователя
Пользователь
Сообщения: 102
https://yadi.sk/d/hxFQMaF5vAi5A - вот.
Актор корабля - Butterfly2 - лежит в Content>Ships>PlayerShip
Актор турели - K5_Lazer - лежит в Content>Equipments>Canons>K5_Lazer
Аватара пользователя
Пользователь
Сообщения: 102
Управление можно посмотреть в Input'ах.
Но вот основные: WASD - передвижение, QE - вращение корабля, Shift+C - добавление турелей на корабль в игре
Аватара пользователя
Пользователь
Сообщения: 995
Цитата:

Во втором варианте (он был испробован мною в первую очередь) у станины и орудия, при определенном вращении корабля, появляется Roll-вращение (относительно корабля). Такая проблема наблюдается при соблюдении некоторых факторов, а именно: вращение должно быть "диагональным", то есть проходить через Pitch- и Yaw-координаты, в глобальном исчислении. В чем тут проблема, я никак не могу понять, ибо беру-то я этот самый Roll от корабля... Как он может там появиться?! Не представляю вообще.

Отвечал же или ты не читал.
1. В настройках компонента можно выключить вращение по одной или всем осям. Делал? 2. Причина нежелательного вращения скорей из за сложения остатка, его уберешь не будет вращения.
Аватара пользователя
Пользователь
Сообщения: 469
)) Загрузил, тоже пушек не увидел, соответственно и глюков. Посмотрел код, решил не лезть ))). Сделал на основе стандартной демки с летающей тарелкой пример. Проверил оба варианта. Действительно бред полный. То есть не так, всё работает точно как и должно при использовании find look. Если привязать все координаты к стволу он всегда будет точно указывать на цель, так и происходит.

Попытавшись смоделировать физически ))) с помощью кулака и пальца - понял что с помощью прямого преобразования вектора из find look эту задачу решить не получиться. Попробуйте сами смоделировать(сложно объяснить).

Задача не тривиальна постараюсь на выходных выделить немного времени.
Сам тоже являюсь ярым фанатом космосимов, думаю такой код в копилке понадобиться, будем рыть )))
_________________
Project SKIT
Аватара пользователя
Пользователь
Сообщения: 102
icms писал(а):
)) Загрузил, тоже пушек не увидел, соответственно и глюков. Посмотрел код, решил не лезть )))

Там при запуске игры, нужно нажать Shift+C, чтобы заспавнить турели на корабле.
Мне нужно было реализовать возможность менять и добавлять турели в рантайме
Аватара пользователя
Пользователь
Сообщения: 102
Vladimir488 писал(а):
Цитата:

Во втором варианте (он был испробован мною в первую очередь) у станины и орудия, при определенном вращении корабля, появляется Roll-вращение (относительно корабля). Такая проблема наблюдается при соблюдении некоторых факторов, а именно: вращение должно быть "диагональным", то есть проходить через Pitch- и Yaw-координаты, в глобальном исчислении. В чем тут проблема, я никак не могу понять, ибо беру-то я этот самый Roll от корабля... Как он может там появиться?! Не представляю вообще.

Отвечал же или ты не читал.
1. В настройках компонента можно выключить вращение по одной или всем осям. Делал? 2. Причина нежелательного вращения скорей из за сложения остатка, его уберешь не будет вращения.


То ли я дурак, то ли лыжи не едут, но запретить вращение по определенной оси компонента у меня не получилось. А по поводу остатка... Там слишком большое изменение идет, не думаю, что сотые и даже тысячные доли погрешности в развороте, могут дать такой артефакт, но попробую
Аватара пользователя
Пользователь
Сообщения: 2319
скрин блуепринта с вычислениями угла азимута(башня) и угла орудия?
лукк эт дает углы в ворлд спейсе, по сути ее нужно преобразовать в вектор и вектор спроецировать на локальные оси вращений башни и орудия.
тоесть берем лукет на цель из пересечения осей орудия и башни - получаем ротатор XYZ
переводим ротатор в форвард вектор (с углами елйлера сильно сложно расчеты проводить, с веткторами проще)
меряем угол между векторами: ось башни - Z и полученным лукет вектором - получаем угол для орудия
дальше проецируем вектор на плоскоть перпендикулярную оси вращения башни Z(в теории)
меряем угол между полученным спроецированным вектором и нулевым направлением башни - получаем угол поворота башни (азимут)
все...

Изображение
_________________
we need to go deeper
Последний раз редактировалось Snake 15 сен 2016, 07:56, всего редактировалось 2 раз(а).


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница