언리얼에서 액터 사이각을 구하기가 까다롭다. ActorRotation을 사용하면 쉽게 구할 수 있을 거라 생각했지만 범위가 정해져있지 않기 때문에 최소 사이각을 구하기 어렵다.
이 게시글에서는 벡터의 내적을 통해 사이각을 구하고 외적을 통해 회전각을 구한다.
float FindMiddleAngle(FVector TargetLoc, FVector CenterLoc, FVector CenterForward)
{
//Center에서 Target을 바라보는 Vector
FVector ToTargetVec = (TargetLoc - CenterLoc);
ToTargetVec.Z = 0;
ToTargetVec.Normalize();
//내적 후 아크 코사인을 통해 각을 구함(0~180)
float InnerProduct = FVector::DotProduct(CenterForward,ToTargetVec);
float Degree = UKismetMathLibrary::DegAcos(InnerProduct);
//외적으로 표면 벡터를 구해 Z의 값으로 부호를 구함
FVector OutProduct = FVector::CrossProduct(CenterForward, ToTargetVect);
float Sign = UKistmetMathLibrary::SignOfFloat(OutterProduct.Z);
return Degree*Sign;
}