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/