chapter12의 AI를 만들면서 거의 막바지 부분의 TaskNode를 c++클래스로 만들면서 다시 한번 회전 행렬부분이 등장해서 유튭영상이랑 구글링해서 정확한 원리까지는 아니지만
어느정도는 다시 이해하고 갈려고 정릴 함.
EBTNodeResult::Type UBTTask_TurnToTarget::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
EBTNodeResult::Type Result = Super::ExecuteTask(OwnerComp, NodeMemory);
auto ABCharacter = Cast<AABCharacter>(OwnerComp.GetAIOwner()->GetPawn());
if (nullptr == ABCharacter) return EBTNodeResult::Failed;
auto Target = Cast<AABCharacter>(OwnerComp.GetBlackboardComponent()->GetValueAsObject(AABAIController::TargetKey));
if (nullptr == Target) return EBTNodeResult::Failed;
FVector LookVector = Target->GetActorLocation() - ABCharacter->GetActorLocation();
LookVector.Z = 0.0f;
FRotator TargetRot = FRotationMatrix::MakeFromX(LookVector).Rotator();
ABCharacter->SetActorRotation(FMath::RInterpTo(ABCharacter->GetActorRotation(), TargetRot, GetWorld()->GetDeltaSeconds(), 2.0f));
return EBTNodeResult::Succeeded;
}
여기서 LookVector를 구하는데
타겟과 나 사이의 벡터를 구한것임.
이 LookVector를 이용해서 회전 행렬을 구할 것임(아래의 코드가)
일단 위의 링크 보고 "아 회전 행렬이 이런거였지"다시 상기 시키고
https://3dmpengines.tistory.com/2057
라고 되어있다.
즉
FRotationMatrix::MakeFromX(LookVector).Rotator();
왜 MakeFromX이냐? 플레이어든 뭐든 X축이 자신이 바라보고 있는 방향이라서.
이 부분이 LookVector방향으로 회전행렬을 생성한다는 말이다
X축 기준으로 얼마나 회전되었는지 계산한다는 말.
이 계산한 값을
ABCharacter->SetActorRotation(FMath::RInterpTo(ABCharacter->GetActorRotation(), TargetRot, GetWorld()->GetDeltaSeconds(), 2.0f));
RInterpTo를 통해 "회전 보간"을 한 부분임.
갑자기 확 바뀌면 안되니까 천천히 바뀌도록
현재 GetActorRotation에서 TargetRot로 2초동안 회전보간 한다는 것임.