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/ |