Unreal Engine 4 http://uengine.ru/forum/ |
|
Вращение объектов. Базовые вопросы http://uengine.ru/forum/viewtopic.php?f=3&t=13608 |
Страница 1 из 4 |
Автор: | rachok [ 16 апр 2018, 17:00 ] |
Заголовок сообщения: | Вращение объектов. Базовые вопросы |
Добрый день! Происходит болезненная миграция с 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 раз лучше. Короче, ответы на эти вопросы помогут всем. |
Автор: | Snake [ 16 апр 2018, 17:16 ] |
Заголовок сообщения: | |
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 это метод актора вот собсно и все. |
Автор: | rachok [ 17 апр 2018, 06:25 ] |
Заголовок сообщения: | |
Цитата: и наконец если с кватернионами понятней, то проще всего будет потратить пол дня для написания С++ статической библиотеки функций для блупринтов вращения в кватернионах. Не, не понятней=) Вот в матрицах - да, но их почему-то не используют. 2. А названия функций в блупринтах и скриптах на С++ в UE4 (не только вращения) отличаются? Или они вообще не аналогичные? Ну решу вызвать GetActorTransform, а его нет и он называется по-другому... 4. Такая базовая штука и отсутствует... Блупринт я не понял, пока туго въезжаю в них, особенно если есть функции, с которыми не сталкивался. Нашел функцию RotatorFromAxisAndAngle, достаточно задать вектор и угол, и можно вращать в локальных или глобальных координатах объект (AddActorWorldRotation или AddActorLocalRotation) Предположим, я делаю модель Солнечной системы, вращение планет вокруг своей оси эта функция позволяет сделать. Якорная точка совпадает с центром планеты - все будут вращаться. Можно задать сложные оси вращения. А вот как вращать их вокруг Солнца? Конечно, можно попробовать вложить планеты в пустышки, пустышки разместить в центре Солнца, планеты сдвинуть внутри пустышек на орбиты, а потом их вращать (пустышки) - но это так себе вариант... С матрицами было бы все просто - сдвиг-поворот-сдвиг, сдвиг-поворот-сдвиг... Но надо уложиться в 1 кадр. А тут я логику не догоняю. Можете пояснить работу Вашего блупринта?=) Меня интересуют не блоки, а сама логика, что именно делать надо... |
Автор: | Snake [ 17 апр 2018, 09:34 ] |
Заголовок сообщения: | |
Цитата: Вот в матрицах - да, но их почему-то не используют. используют, только еще глубже в недрах движка. все функции из Блупринтов доступны в С++, названия могут быть разные... что-то типа K2_GetActorTransform, которая вызывает С++ынй GetActorTransform, но чаще всего названия совпадают полностью. а вот С++ функции - большинство не доступны в блупринтах. Цитата: 4. Такая базовая штука и отсутствует... для блупринтов да отсутствует, потому что есть все необходимое чтоб сделать ее самому. Цитата: Нашел функцию RotatorFromAxisAndAngle, достаточно задать вектор и угол, и можно вращать в локальных или глобальных координатах объект в каких будешь вращать в таких и будет если рассматривать эту функцию без другого контекста то в мировых все решения делать обьекты -пустышки, и пивоты которые только помогают с одним вращением - костыли, матану не требуются дополнительные обьекты для вращения чего угодно относитльно чего угодно. операции трансформации это перемножение матриц трансформации... матрица А * инвертированную матрицу B и получим значение матрицы А относительно B чтоб вернуть назад умножаем полученную матрицу на неинвертированную B, и полуичим трансформацию A |
Автор: | Snake [ 17 апр 2018, 09:42 ] |
Заголовок сообщения: | |
Автор: | Snake [ 17 апр 2018, 09:51 ] |
Заголовок сообщения: | |
viewtopic.php?f=3&t=2188&start=20 viewtopic.php?f=3&t=2188&start=60 |
Автор: | rachok [ 17 апр 2018, 10:18 ] |
Заголовок сообщения: | |
А я тут костыльный метод сделал с перенесением рут-точки (якоря) блупринта в точку, вокруг которой вращать, а затем сам объект возвращаю в свою позицию. Такая вот убогость: https://s8.hostingkartinok.com/uploads/ ... cc10fe.jpg При этом сам объект можно вращать вокруг своих осей... И понял разницу между AddLocalRotation и AddActorLocalRotation. P.S. Вопрос не по теме: если я закрыл вкладку Event Graph, как ее вернуть? В Windows-> ее нет... |
Автор: | rachok [ 17 апр 2018, 10:57 ] |
Заголовок сообщения: | |
Цитата: операции трансформации это перемножение матриц трансформации... матрица А * инвертированную матрицу B и получим значение матрицы А относительно B чтоб вернуть назад умножаем полученную матрицу на неинвертированную B, и полуичим трансформацию A Немного не понял. Немного базы: есть точки объекта в пространстве, чтобы их переместить надо умножить их координаты на матрицу сдвига, чтобы повернуть - умножить координаты на матрицу поворота. При этом матрицы для сдвига и поворота можно перемножить, и мы получим матрицу, которая выполняет сдвиг и поворот, при этом порядок перемножения важен. Для вращения вокруг произвольной оси, например, в DirectX9 существовала функция, которая выдавала необходимую матрицу поворота и это сильно упрощало жизнь... Но сейчас не об этом. Я не понял, как получается такая магия, ведь если я перемножу матрицу трансформации А на матрицу трансформации В - я получу дополнительные сдвиги и повороты объекта В, но которые приложены к объекту А. В общем, можно немножко еще поподробней... И еще, Transform-ы можно умножать как матрицы? |
Автор: | rachok [ 17 апр 2018, 16:19 ] |
Заголовок сообщения: | |
Snake, я тупой, наверное, но я твой метод так и не понял до конца. Я сделал так: из координат вращаемого объекта вычел координаты оси (это тоже объект), затем, получаю точку в пространстве, которую вращаю вокруг вектора верха оси (RotateVectorAroundAxis), затем добавляю к полученной координате координаты оси. Объект вращается по траектории, но его направление всегда одинаковое... Чтобы это исправить я вращаю на этот же угол с помощью этой же функции вектора up/right/forward вращаемого объекта, а из них потом собираю ротатор, который устанавливаю в объект. В статичном положении все идеально, но если в рантайме попытаться повернуть ось - объект немого сходит с орбиты. Но я примерно представляю как это исправить... |
Автор: | unreal4 [ 17 апр 2018, 19:38 ] |
Заголовок сообщения: | |
Если нужно сделать просто вращение объекта, то в самом ВР Add components / Rotating Movement. Я так делал фрезу в виде препятствия на уровне. Если нужно сделать вращение объекта относительно другого с привязкой к центру, то чуть позже могу кинуть блупринт. В свое время сделал себе подсказку, чтобы не путаться в ориентации внутри UE4. т.к. она незначительно, но отличается от того же 3ds max. Вот на заметку: |
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |