Полезное

Мы Вконтакте

Discord канал

#
12
След.
Аватара пользователя
Пользователь
Сообщения: 2319
интерполяция между двумя единичными векторами не дает нормализованый результат... поэтому нужно после интерполяции нормализацию вектора выполнить... если еще не отключил интерполяцию(я не уверен что она в порядке в этом коде...)

FVector MouseWorldLocation, MouseWorldDirection; - два нулевых вектора
и после они передаются как параметр DeprojectMousePositionToWorld(MouseWorldLocation, MouseWorldDirection);
так не должно быть.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 11
C DeprojectMousePositionToWorld всё правильно. Это метод класса PlayerController, поэтому он уже знает про позицию курсора и мы только передаём аргументы по ссылке, в которые он пишет результат. Он ничего не берёт из MouseWorldLocation и MouseWorldDirection.
Это как в дефолтном коде - записываем результат в Hit:
Код:
FHitResult Hit;
GetHitResultUnderCursor(ECC_Visibility, false, Hit);
if (Hit.bBlockingHit) {...}


C интерполяцией проверил - результата нет.
Нужно разбираться в первопречине. И в этом плане меня беспокоит, что если поставить курсор под перса их координаты даже близко совпадать не будут (см. логи выше)
Аватара пользователя
Пользователь
Сообщения: 195
выведи себе на экран всю нужную инфу( координты мыши, перевод координат, повороты персонажа ). Ты так будешь вечно тут угадывать..
Аватара пользователя
Пользователь
Сообщения: 11
Да уже несколько раз написал, что записываю логи, не на экран, а в файл...

И проблему выяснил:
почему-то GetPawn()->GetActorLocation() выдаёт координаты относительно чего-то, а не глобальные, т.к. они различаются с глобальными координатами курсора.
Аватара пользователя
Пользователь
Сообщения: 195
GetPawn()->GetActorLocation() как раз тут должны быть правильные.. скорее всего ты как-то не правильно переводишь позицию мыши в мировые координаты
Аватара пользователя
Пользователь
Сообщения: 11
Да уж, странно - 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());
         }
      }
   }
}
Аватара пользователя
Пользователь
Сообщения: 2319
DeprojectMousePositionToWorld
насколько я понимаю и судя по описанию (пробовать лень :) )
все что оно делает это "возвращает"(присваивает) позицию камеры и ориментацию-направление курсора из камеры...
хм...
чего естественно не достаточно чтоб расчитать пересечение с Z0 мировой, нужен еще трейс или матан.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 11
Да, не поленился - отрисовал линию из этих координат

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


Получается линия от курсора в камеру, но только когда движется камера, иначе ничего не рисует.
Аватара пользователя
Пользователь
Сообщения: 2319
Цитата:
но только когда движется камера, иначе ничего не рисует.


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

поэтому если не рисует при остановке нужно смотреть чего не получает эти данные, например тик в контроллере отключен(а там на тике висит логика, отвечающая за вращение контроллера) и т.п.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 21
Я сделал это так
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 дня назад, так что если есть мысли как это можно сделать более правильно - прошу меня поправить.


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

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