Полезное

Мы Вконтакте

Discord канал

#
Пред.
12
Аватара пользователя
Пользователь
Сообщения: 11
Привет всем!
Начал разбираться в 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 и там в Тике это обрабатывать?
Аватара пользователя
Пользователь
Сообщения: 195
нужно контроллер вращать AController::SetControlRotation. У тебя мышь в экранных координатах, а объект в мировых координатах. Тебе нужно мышь перевести в мировые координаты.
Аватара пользователя
Пользователь
Сообщения: 11
Спасибо!

Да, начинаю потихоньку разбираться...
Написал вот такое:

Код:
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Х). Видимо координаты мыши залочены или ещё что-то...

Есть идеи?
Аватара пользователя
Пользователь
Сообщения: 2319
зачем нормализировать
MouseWorldLocation.Normalize();
MyPawnLocation.Normalize();
если дальше они нужны в расчете не нормализованные
FVector PawnToCursorDirection = MouseWorldLocation - MyPawnLocation;
...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 11
Да это я уже так, игрался с параметрами от безысходности)

Хотя нормализация в данном случае ничего не испортит, т.к. пропорция останется неизменной. Мне же поворот нужен, а не вектор движения...
Тем более MyPawn->GetActorForwardVector() уже нормализованый, так что для единообразия тоже польза.
Аватара пользователя
Пользователь
Сообщения: 2319
Цитата:
пропорция останется неизменной.

с хера ли она останентся неизменной... в данном случае направление от длины векторов зависит а нормализвция их в 1 схлопывает...
хоть бы думали немного прежде чем писать...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 11
Да, с этим я погорячился...
Нужно уже результат нормализовать.

Но, к сожалению, проблему это не решает. По прежнему MouseWorldLocation не изменяется.
Аватара пользователя
Пользователь
Сообщения: 2319
надо бы отдебажить визуально чтоб убедиться все векторы те что нужно...
и убрать интерполяцию пока ... потом уже добавить когда все будет работать без нее.
с учетом вышеупомятой поправки с нормализацией должно работать.
DeprojectMousePositionToWorld не пользовался она перезаписвает переменную? потому что в коде ничему не присваеимается?
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 11
Новая версия:

Код:
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 принимает ссылки на объекты и записывает прям в них. Давно на плюсах не писал - отвык, тоже как-то непривычно)
Аватара пользователя
Пользователь
Сообщения: 11
Видимо куча мусора в тестовом проекте. Создам пустой и там проверю.


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

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