Unreal Engine 4
http://uengine.ru/forum/

Как правильно вращать персонажа?
http://uengine.ru/forum/viewtopic.php?f=19&t=12081
Страница 2 из 2

Автор:  Snake [ 31 окт 2017, 14:53 ]
Заголовок сообщения: 

интерполяция между двумя единичными векторами не дает нормализованый результат... поэтому нужно после интерполяции нормализацию вектора выполнить... если еще не отключил интерполяцию(я не уверен что она в порядке в этом коде...)

FVector MouseWorldLocation, MouseWorldDirection; - два нулевых вектора
и после они передаются как параметр DeprojectMousePositionToWorld(MouseWorldLocation, MouseWorldDirection);
так не должно быть.

Автор:  mott [ 31 окт 2017, 15:06 ]
Заголовок сообщения: 

C DeprojectMousePositionToWorld всё правильно. Это метод класса PlayerController, поэтому он уже знает про позицию курсора и мы только передаём аргументы по ссылке, в которые он пишет результат. Он ничего не берёт из MouseWorldLocation и MouseWorldDirection.
Это как в дефолтном коде - записываем результат в Hit:
Код:
FHitResult Hit;
GetHitResultUnderCursor(ECC_Visibility, false, Hit);
if (Hit.bBlockingHit) {...}


C интерполяцией проверил - результата нет.
Нужно разбираться в первопречине. И в этом плане меня беспокоит, что если поставить курсор под перса их координаты даже близко совпадать не будут (см. логи выше)

Автор:  gary_cho [ 31 окт 2017, 15:35 ]
Заголовок сообщения: 

выведи себе на экран всю нужную инфу( координты мыши, перевод координат, повороты персонажа ). Ты так будешь вечно тут угадывать..

Автор:  mott [ 31 окт 2017, 16:08 ]
Заголовок сообщения: 

Да уже несколько раз написал, что записываю логи, не на экран, а в файл...

И проблему выяснил:
почему-то GetPawn()->GetActorLocation() выдаёт координаты относительно чего-то, а не глобальные, т.к. они различаются с глобальными координатами курсора.

Автор:  gary_cho [ 31 окт 2017, 16:42 ]
Заголовок сообщения: 

GetPawn()->GetActorLocation() как раз тут должны быть правильные.. скорее всего ты как-то не правильно переводишь позицию мыши в мировые координаты

Автор:  mott [ 31 окт 2017, 17:05 ]
Заголовок сообщения: 

Да уж, странно - DeprojectMousePositionToWorld почему-то неправильный результат выдаёт, хотя все советуют его использовать.
Сделал через GetHitResultUnderCursor - вроде заработало.

Рабочий вариант, может кому пригодится:

Код:
void ATest2PlayerController::RotateToMouseCursor(float Value)
{
   if (Value != 0.0f) {

      APawn* const MyPawn = GetPawn();

      if (MyPawn) {

         FHitResult Hit;
         GetHitResultUnderCursor(ECC_Visibility, false, Hit);

         if (Hit.bBlockingHit) {

            FVector MouseWorldLocation = Hit.ImpactPoint;
            MouseWorldLocation.Z = 0.0f;

            FVector MyPawnLocation = MyPawn->GetActorLocation();
            MyPawnLocation.Z = 0.0f;

            FVector PawnToCursorDirection = MouseWorldLocation - MyPawnLocation;
            PawnToCursorDirection.Normalize();
            FVector PawnForwardDirection = MyPawn->GetActorForwardVector();
            PawnForwardDirection.Normalize();

            FVector Interpolation = FMath::VInterpTo(PawnForwardDirection, PawnToCursorDirection, GetWorld()->GetDeltaSeconds(), 50);
            Interpolation.Normalize();

            SetControlRotation(Interpolation.Rotation());
         }
      }
   }
}

Автор:  Snake [ 31 окт 2017, 19:02 ]
Заголовок сообщения: 

DeprojectMousePositionToWorld
насколько я понимаю и судя по описанию (пробовать лень :) )
все что оно делает это "возвращает"(присваивает) позицию камеры и ориментацию-направление курсора из камеры...
хм...
чего естественно не достаточно чтоб расчитать пересечение с Z0 мировой, нужен еще трейс или матан.

Автор:  mott [ 31 окт 2017, 20:02 ]
Заголовок сообщения: 

Да, не поленился - отрисовал линию из этих координат

Код:
FVector Location, Direction;
DeprojectMousePositionToWorld(Location, Direction);
DrawDebugLine(GetWorld(), Location, Location + Direction * 100.0f, FColor::Red, true);


Получается линия от курсора в камеру, но только когда движется камера, иначе ничего не рисует.

Автор:  Snake [ 31 окт 2017, 20:07 ]
Заголовок сообщения: 

Цитата:
но только когда движется камера, иначе ничего не рисует.


единственные условия чтоб оно работало нужно чтоб была камера и чтоб был курсор, математика там не хитрая (теорема синусов), и движения в уравнении нет, только XY курсора и трансформ камеры.

поэтому если не рисует при остановке нужно смотреть чего не получает эти данные, например тик в контроллере отключен(а там на тике висит логика, отвечающая за вращение контроллера) и т.п.

Автор:  kiteg [ 19 дек 2017, 07:12 ]
Заголовок сообщения: 

Я сделал это так
pc= GetWorld()->GetFirstPlayerController();
FHitResult hit;
pc->GetHitResultUnderCursor(ECollisionChannel::ECC_MAX, false, hit);
FVector dir = hit.ImpactPoint - GetActorLocation();
AddControllerYawInput(FMath::Atan2(GetActorForwardVector().X*dir.Y - dir.X*GetActorForwardVector().Y, GetActorForwardVector().X*dir.X + GetActorForwardVector().Y*dir.Y));

UE4 начал изучать 2 дня назад, так что если есть мысли как это можно сделать более правильно - прошу меня поправить.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/