Unreal Engine 4 http://uengine.ru/forum/ |
|
Как правильно вращать персонажа? http://uengine.ru/forum/viewtopic.php?f=19&t=12081 |
Страница 1 из 2 |
Автор: | mott [ 30 окт 2017, 22:12 ] |
Заголовок сообщения: | Как правильно вращать персонажа? |
Привет всем! Начал разбираться в UE. Создал дефолтный TopDown проект и решил прекрутить другое управление персонажу. Уже второй день не могу научить перса правильно вращаться. Хочу, чтобы персонаж поворачивался в сторону курсора мышки Описание: В ATest2PlayerController::SetupInputComponent() добавил Код: InputComponent->BindAxis("TestTurn", this, &ATest2PlayerController::RotateToMouseCursor); И написал обработчик Код: void ATest2PlayerController::RotateToMouseCursor(float Value) { if (Value != 0.0f) { APawn* const MyPawn = GetPawn(); if (MyPawn) { FVector MouseCursorPos = FVector::ZeroVector; GetMousePosition(MouseCursorPos.X, MouseCursorPos.Y); FVector MyPawnLocation = MyPawn->GetActorLocation(); MyPawnLocation.Z = 0.0f; FVector PawnToCursorDirection = MouseCursorPos - MyPawnLocation; FVector PawnForwardDirection = MyPawn->GetActorForwardVector(); FVector interpolation = FMath::VInterpTo(PawnForwardDirection, PawnToCursorDirection, GetWorld()->GetDeltaSeconds(), 50); MyPawn->SetActorRotation(interpolation.Rotation()); } } } Перс крутится на градусов 20-30 при любом положении курсора. Подскажите, как правильно должно выглядеть такой вид управления? Может нужно переносить код в Character и там в Тике это обрабатывать? |
Автор: | gary_cho [ 30 окт 2017, 23:57 ] |
Заголовок сообщения: | |
нужно контроллер вращать AController::SetControlRotation. У тебя мышь в экранных координатах, а объект в мировых координатах. Тебе нужно мышь перевести в мировые координаты. |
Автор: | mott [ 31 окт 2017, 01:29 ] |
Заголовок сообщения: | |
Спасибо! Да, начинаю потихоньку разбираться... Написал вот такое: Код: void ATest2PlayerController::RotateToMouseCursor2(float Value) { if (Value != 0.0f) { APawn* const MyPawn = GetPawn(); if (MyPawn) { FVector MouseWorldLocation, MouseWorldDirection; DeprojectMousePositionToWorld(MouseWorldLocation, MouseWorldDirection); MouseWorldLocation.Z = 0.0f; MouseWorldLocation.Normalize(); FVector MyPawnLocation = MyPawn->GetActorLocation(); MyPawnLocation.Z = 0.0f; MyPawnLocation.Normalize(); FVector PawnToCursorDirection = MouseWorldLocation - MyPawnLocation; FVector PawnForwardDirection = MyPawn->GetActorForwardVector(); FVector interpolation = FMath::VInterpTo(PawnForwardDirection, PawnToCursorDirection, GetWorld()->GetDeltaSeconds(), 50); SetControlRotation(interpolation.Rotation()); } } } Но перс всегда поворачивается на 180 градусов и останавливается. Задебажил координаты - почему-то MouseWorldLocation всегда почти одинаковый (отличается на 0.0Х). Видимо координаты мыши залочены или ещё что-то... Есть идеи? |
Автор: | Snake [ 31 окт 2017, 07:28 ] |
Заголовок сообщения: | |
зачем нормализировать MouseWorldLocation.Normalize(); MyPawnLocation.Normalize(); если дальше они нужны в расчете не нормализованные FVector PawnToCursorDirection = MouseWorldLocation - MyPawnLocation; ... |
Автор: | mott [ 31 окт 2017, 11:49 ] |
Заголовок сообщения: | |
Да это я уже так, игрался с параметрами от безысходности) Хотя нормализация в данном случае ничего не испортит, т.к. пропорция останется неизменной. Мне же поворот нужен, а не вектор движения... Тем более MyPawn->GetActorForwardVector() уже нормализованый, так что для единообразия тоже польза. |
Автор: | Snake [ 31 окт 2017, 12:28 ] |
Заголовок сообщения: | |
Цитата: пропорция останется неизменной. с хера ли она останентся неизменной... в данном случае направление от длины векторов зависит а нормализвция их в 1 схлопывает... хоть бы думали немного прежде чем писать... |
Автор: | mott [ 31 окт 2017, 12:50 ] |
Заголовок сообщения: | |
Да, с этим я погорячился... Нужно уже результат нормализовать. Но, к сожалению, проблему это не решает. По прежнему MouseWorldLocation не изменяется. |
Автор: | Snake [ 31 окт 2017, 13:04 ] |
Заголовок сообщения: | |
надо бы отдебажить визуально чтоб убедиться все векторы те что нужно... и убрать интерполяцию пока ... потом уже добавить когда все будет работать без нее. с учетом вышеупомятой поправки с нормализацией должно работать. DeprojectMousePositionToWorld не пользовался она перезаписвает переменную? потому что в коде ничему не присваеимается? |
Автор: | mott [ 31 окт 2017, 13:58 ] |
Заголовок сообщения: | |
Новая версия: Код: void ATest2PlayerController::RotateToMouseCursor(float Value) { if (Value != 0.0f) { APawn* const MyPawn = GetPawn(); if (MyPawn) { FVector MouseWorldLocation, MouseWorldDirection; DeprojectMousePositionToWorld(MouseWorldLocation, MouseWorldDirection); MouseWorldLocation.Z = 0.0f; FVector MyPawnLocation = MyPawn->GetActorLocation(); MyPawnLocation.Z = 0.0f; FVector PawnToCursorDirection = MouseWorldLocation - MyPawnLocation; PawnToCursorDirection.Normalize(); FVector PawnForwardDirection = MyPawn->GetActorForwardVector(); FVector Interpolation = FMath::VInterpTo(PawnForwardDirection, PawnToCursorDirection, GetWorld()->GetDeltaSeconds(), 50); float AimAtAngle = FMath::RadiansToDegrees(acosf(FVector::DotProduct(PawnForwardDirection, PawnToCursorDirection))); //SetControlRotation(Interpolation.Rotation()); SetControlRotation(FRotator(0.f, AimAtAngle, 0.f)); } } } За мышью попрежнему не следит. Поворачивается на определённый угол и всё. Что-то не так с координатами - вот логи после того как чар повернулся и курсор указывает под него: Val: 0.069993 Yaw: 90.205269 CharYaw: 90.205269 ToCursorDirection: X=-1.000 Y=-0.000 Z=0.000 ForwardDirection: X=0.003 Y=1.000 Z=0.000 CursorPos: X=-884.954 Y=-86.488 Z=0.000 CharPos: X=-490.000 Y=-86.443 Z=0.000 (поворачивается всегда на этот угол, независимо от расположения курсора) DeprojectMousePositionToWorld принимает ссылки на объекты и записывает прям в них. Давно на плюсах не писал - отвык, тоже как-то непривычно) |
Автор: | mott [ 31 окт 2017, 14:08 ] |
Заголовок сообщения: | |
Видимо куча мусора в тестовом проекте. Создам пустой и там проверю. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |