Полезное

Мы Вконтакте

Discord канал

#
Пред.
Модератор: icms
Аватара пользователя
Пользователь
Сообщения: 98
Добрый день!
Происходит болезненная миграция с Unity на UE4, возник ряд базовых вопросов, на которые не нашел ответы (вообще поражает трудность добычи информации по UE).
1. Что такое Rotator? (простыми словами) В Unity все углы и вращения объекта представлены (зашифрованы) в виде кватернионов и имеют вид x, y, z, w, нельзя просто изменить x в надежде на поворот вокруг оси х (эти переменные совсем другие), при этом вникать в их суть даже не надо, т.к. для конечного пользователя существует ряд стандартных методов для вращения объекта вокруг чего угодно (векторов up/right/forward, произвольного вектора и т.д.).
2. Отличаются ли функции для вращения в Blueprint-ах от функций вращения в скриптах (С++)? Начал штурм UE с изучения блюпринтов, обидно будет, если эти функции будут отсутствовать в скриптах, на которые я хочу потом перейти.
3. Какие существуют основные способы (а так же функции) вращения в UE?
Я правильно понимаю, что AddActorWorldRotation - добавляет дельта-поворот к повороту объекта в мировых осях (а AddActorLocalRotation - в локальных)?
И этот дельта-поворот можно сформировать с помощью
RotatorFromAxisAndAngle - вращает вокруг вектора, который начинается в якорной точке объекта на угол.
А еще как?
4. Главный вопрос. Как вращать вокруг произвольного, заранее заданного вектора из точки (оси)?
В Unity есть функция, которая может заменить собой все остальные функции для вращения, по сути она перекрывает 95% потребностей в вопросах вращения, позволяет вращать объект вокруг любой оси в мире.
transform.RotateAround(точка, вектор, угол)
Точка и вектор задают ось вращения, которая может быть в любом месте на карте. Надо повернуть дверь вокруг шарнира, или своей оси, или вокруг солнца - функция универсальна.
Есть ли аналог в UE4 и как им пользоваться?
5. AddActorLocalRotation и AddActorWorldRotation вращают объект как будто оси вращения OX, OY, OZ пересекаются в его якорной точке. А как вращать вокруг мировых осей?
6. В чем разница между AddActorLocalRotation и AddLocalRotation?
P.S. Если где-то на форуме есть ответ на вопрос, но я его не нашел - ткните носом, пожалуйста.
Если честно, я в шоке от скудности информации и ее неструктурированного вида.
Документация убивает... http://api.unrealengine.com/INT/API/Run ... otation/1/
Ни примера, ни пояснения. В Unity дока в 100 раз лучше.
Короче, ответы на эти вопросы помогут всем.
Аватара пользователя
Пользователь
Сообщения: 2319
rachok ,
1 - http://api.unrealengine.com/INT/API/Run ... index.html
Изображение
https://en.wikipedia.org/wiki/Euler_angles
опытным путем вычисляется позитивное и негативныее направления для анриала
Изображение
кратко углы ейлера поворота относительно осей XYZ, по сути это сделанно для блупринтов, далше во 2

2 - вращение в С++ коде все в кватернионах
http://api.unrealengine.com/INT/API/Run ... index.html

3 - да как угодно, можно считать аналог кватерниона для блупринтов - "ротейшн_фром_аксис_енд_англ"

4 - готовй функции нет, но ее можно сделать самому:
http://image.prntscr.com/image/19b939c7 ... 648a7.jpeg
https://i.imgur.com/WsBqPzq.mp4
на с++ чище выглядит конечно это дело...

Код:
FTransform QuatRotate_AroundOtherTransform(const FTransform& TargetT, const FTransform& TPoint, const FQuat& AddRotation)
{
   FTransform T2 = TPoint;
   T2.ConcatenateRotation(AddRotation);
   FTransform T = TargetT * TPoint.Inverse() * T2;
   T.NormalizeRotation();
   return T;
}

FTransform Rotate_AroundOtherTransform(const FTransform& TargetT, const FTransform& TPoint, const FRotator& AddRotation)
{
   return QuatRotate_AroundOtherTransform(TargetT, TPoint, FQuat(AddRotation));
}


5 - не скажу наверняка, но судя по http://api.unrealengine.com/INT/API/Run ... index.html
функция может возвращать sweep hit - и в доках это видно, а что это значит по идее должны знать... блокировка движения с "ХитИнформацией"

и наконец если с кватернионами понятней, то проще всего будет потратить пол дня для написания С++ статической библиотеки функций для блупринтов вращения в кватернионах.
самое главное преимущество кватернионов в том что FQuat легко нормализовать, а нормализованный кватернион не подвержен ошибкам gimbal lock
https://ru.wikipedia.org/wiki/%D0%A1%D0 ... 0%BE%D0%BA


PS:хм посмотрел AddActorLocalRotation там тоже есть свиип, тогда смотрим код)
и видим там вот что:
Код:
void AActor::AddActorLocalRotation(FRotator DeltaRotation, bool bSweep, FHitResult* OutSweepHitResult, ETeleportType Teleport)
{
   if(RootComponent)
   {
      RootComponent->AddLocalRotation(DeltaRotation, bSweep, OutSweepHitResult, Teleport);
   }
   else if (OutSweepHitResult)
   {
      *OutSweepHitResult = FHitResult();
   }
}

тоесть в коде AddActorLocalRotation внутри вызывается AddLocalRotation и вращает это все рут компонент.
AddLocalRotation это метод класса USceneComponent
а AddActorLocalRotation это метод актора
вот собсно и все.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 98
Цитата:
и наконец если с кватернионами понятней, то проще всего будет потратить пол дня для написания С++ статической библиотеки функций для блупринтов вращения в кватернионах.

Не, не понятней=) Вот в матрицах - да, но их почему-то не используют.
2. А названия функций в блупринтах и скриптах на С++ в UE4 (не только вращения) отличаются? Или они вообще не аналогичные?
Ну решу вызвать GetActorTransform, а его нет и он называется по-другому...
4. Такая базовая штука и отсутствует...
Блупринт я не понял, пока туго въезжаю в них, особенно если есть функции, с которыми не сталкивался.
Нашел функцию RotatorFromAxisAndAngle, достаточно задать вектор и угол, и можно вращать в локальных или глобальных координатах объект (AddActorWorldRotation или AddActorLocalRotation)
Предположим, я делаю модель Солнечной системы, вращение планет вокруг своей оси эта функция позволяет сделать. Якорная точка совпадает с центром планеты - все будут вращаться. Можно задать сложные оси вращения.
А вот как вращать их вокруг Солнца? Конечно, можно попробовать вложить планеты в пустышки, пустышки разместить в центре Солнца, планеты сдвинуть внутри пустышек на орбиты, а потом их вращать (пустышки) - но это так себе вариант...

С матрицами было бы все просто - сдвиг-поворот-сдвиг, сдвиг-поворот-сдвиг... Но надо уложиться в 1 кадр.
А тут я логику не догоняю. Можете пояснить работу Вашего блупринта?=) Меня интересуют не блоки, а сама логика, что именно делать надо...
Аватара пользователя
Пользователь
Сообщения: 2319
Цитата:
Вот в матрицах - да, но их почему-то не используют.

используют, только еще глубже в недрах движка.

все функции из Блупринтов доступны в С++, названия могут быть разные... что-то типа K2_GetActorTransform,
которая вызывает С++ынй GetActorTransform, но чаще всего названия совпадают полностью.
а вот С++ функции - большинство не доступны в блупринтах.

Цитата:
4. Такая базовая штука и отсутствует...

для блупринтов да отсутствует, потому что есть все необходимое чтоб сделать ее самому.

Цитата:
Нашел функцию RotatorFromAxisAndAngle, достаточно задать вектор и угол, и можно вращать в локальных или глобальных координатах объект

в каких будешь вращать в таких и будет
если рассматривать эту функцию без другого контекста то в мировых

все решения делать обьекты -пустышки, и пивоты которые только помогают с одним вращением - костыли,
матану не требуются дополнительные обьекты для вращения чего угодно относитльно чего угодно.

операции трансформации это перемножение матриц трансформации... матрица А * инвертированную матрицу B и получим значение матрицы А относительно B
чтоб вернуть назад умножаем полученную матрицу на неинвертированную B, и полуичим трансформацию A
_________________
we need to go deeper
Последний раз редактировалось Snake 17 апр 2018, 09:48, всего редактировалось 3 раз(а).
Аватара пользователя
Пользователь
Сообщения: 2319
Изображение
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 98
А я тут костыльный метод сделал с перенесением рут-точки (якоря) блупринта в точку, вокруг которой вращать, а затем сам объект возвращаю в свою позицию. Такая вот убогость:
https://s8.hostingkartinok.com/uploads/ ... cc10fe.jpg
При этом сам объект можно вращать вокруг своих осей... И понял разницу между AddLocalRotation и AddActorLocalRotation.
P.S. Вопрос не по теме: если я закрыл вкладку Event Graph, как ее вернуть? В Windows-> ее нет...
Аватара пользователя
Пользователь
Сообщения: 98
Цитата:
операции трансформации это перемножение матриц трансформации... матрица А * инвертированную матрицу B и получим значение матрицы А относительно B
чтоб вернуть назад умножаем полученную матрицу на неинвертированную B, и полуичим трансформацию A

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

Я не понял, как получается такая магия, ведь если я перемножу матрицу трансформации А на матрицу трансформации В - я получу дополнительные сдвиги и повороты объекта В, но которые приложены к объекту А.
В общем, можно немножко еще поподробней... И еще, Transform-ы можно умножать как матрицы?
Аватара пользователя
Пользователь
Сообщения: 98
Snake, я тупой, наверное, но я твой метод так и не понял до конца.
Я сделал так: из координат вращаемого объекта вычел координаты оси (это тоже объект), затем, получаю точку в пространстве, которую вращаю вокруг вектора верха оси (RotateVectorAroundAxis), затем добавляю к полученной координате координаты оси.
Объект вращается по траектории, но его направление всегда одинаковое...
Чтобы это исправить я вращаю на этот же угол с помощью этой же функции вектора up/right/forward вращаемого объекта, а из них потом собираю ротатор, который устанавливаю в объект.
В статичном положении все идеально, но если в рантайме попытаться повернуть ось - объект немого сходит с орбиты. Но я примерно представляю как это исправить...
Аватара пользователя
Пользователь
Сообщения: 77
Если нужно сделать просто вращение объекта, то в самом ВР Add components / Rotating Movement. Я так делал фрезу в виде препятствия на уровне. Если нужно сделать вращение объекта относительно другого с привязкой к центру, то чуть позже могу кинуть блупринт.
В свое время сделал себе подсказку, чтобы не путаться в ориентации внутри UE4. т.к. она незначительно, но отличается от того же 3ds max. Вот на заметку:

Изображение


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

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