Как задать направление движения стрелы?

Начинающий
Статус
Оффлайн
Регистрация
8 Ноя 2022
Сообщения
28
Реакции[?]
0
Поинты[?]
0
Создал Actor, в нем staticMesh стрелы и ProjectiveMovement.

Если задать у ProjectiveMovement initial speed скорость например 2000.000000,
то стрела летит всегда в 1 направлении.

1679941011390.png

Velocity у ProjectiveMovement получается
(X=2000,Y=0.000000,Z=0.000000)

А как рассчитать Velocity чтобы стрела летела во врага?
Попробовал так, но снаряд улетает вверх вбок. Повернуть актера со стрелой в сторону врага и задать стреле velocity по направлению на врага.

C++:
FVector3D arrowLocation = arrow.GetActorLocation(); // позиция стрелы
FVector3D targetLocation = enemy.GetActorLocation(); // позиция врага
FRotator lookAt = UKismetMathLibrary::FindLookAtRotation(arrowLocation, targetLocation); // направление стрелы

FTransform newTransformArrow; // новый transform для стрелы

newTransformArrow.SetLocation(arrowLocation);
newTransformArrow.SetRotation(lookAt.Quaternion());

arrow->SetActorTransform(newTransform); // поворачиваем стрелу к врагу

lookAt.Normalize();
arrow->ProjectiveMovement->SetVelocityInLocalSpace( lookAt.Euler() * 2000); // задаем Velocity по направлению к врагу со скоростью 2000
 
Начинающий
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
9
Реакции[?]
1
Поинты[?]
0
Очень простая математика, но с ходу я смогу только подсказать как примерно должно быть, непомню некоторые моменты...

C++:
// позиция стрелы, World Space
FVector3D arrowLocation = arrow.GetActorLocation();

// Цель, World Space
FVector3D targetLocation = enemy.GetActorLocation();

// Игнорируем Roll, получаем только вектор направления стрелы
// в момент выстрела в World Space
FVector3D arrowMoveVector = targetLocation - arrowLocation;

// Поворачиваем стрелу к цели. На Вашей картинке вижу, что стрела визуально
// направлена в перёд по оси X. Игнорируем физику.
arrow->SetActorRotation (MakeRotFromX (arrowMoveVector), ETeleportType::TeleportPhysics);

// Согласно документации SetVelocityInLocalSpace требует вектор в Local Space относительно актера (стрелы).
// Если я помню правильно, то arrowMoveVector надо преобразовать в Local Space путём умножения
// на Invert Transform актера. Можно сделать через операнд " * ", но я буду использовать InverseTransformVectorNoScale
FVector3D arrowMoveVectorLocalSpace = arrow->GetActorTransform.InverseTransformVectorNoScale (arrowMoveVector);

// Нормализируем вектор
arrowMoveVectorLocalSpace .Normalize();

// задаем Velocity по направлению к врагу со скоростью 2000
arrow->ProjectiveMovement->SetVelocityInLocalSpace(arrowMoveVectorLocalSpace * 2000);
 
Сверху Снизу