[UE5] TIL - 17 <SetWorldRotation, FMath::RInterpTo>

ChangJin·2024년 4월 5일
0

Unreal Engine5

목록 보기
44/114
post-thumbnail

2024-04-06

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/ToonTank

느낀점
플레이어의 특정 메시를 GetHitResultUnderCursor로 부딪친 위치를 바라보게끔 만들게 하려고자 SetWorldRotation을 사용했다. 그리고 부딪친 위치를 메시가 바라보면 메시가 아래를 비스듬하게 바라보게 되므로 이를 위해서 FRotator(0.f,ToTarget.Rotation().Yaw, 0.f);를 사용해서 Yaw의 값만 적용이되도록 만들었다. 그리고 회전 보간을 위해서 FMath::RInterpTo을 사용해서 조금 느리게 회전이 되도록 만들었다.

TIL

  • SetWorldRotation
  • FMath::RInterpTo

SetWorldRotation

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/Components/USceneComponent/SetWorldRotation?application_version=5.3


  • 월드를 기준으로 메시의 회전을 설정하는 메소드이다. FRotator를 반환한다.
  • ToTarget은 GetHitResultUnderCursor로 부딪친 위치에 지금 이 메시의 위치를 빼준 방향벡터이다.
  • 이 방향벡터의 Yaw만 적용해서 좌우로 움직이게끔만하려고 했다.

void ABasePawn::RotateTurret(FVector LookAtTarget)
{
	FVector ToTarget = LookAtTarget - TurretMesh->GetComponentLocation();
	FRotator LookAtRotation = FRotator(0.f,ToTarget.Rotation().Yaw, 0.f);

	TurretMesh->SetWorldRotation(LookAtTarget);
}

  • 그러나 이 코드는 문제가 있다. 메시가 너무 확확 돌아서 뚝딱거리는 모습처럼 보인다.
  • 이를 개선하기 위해서 회전 보간을 사용한다.

FMath::RInterpTo

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/Math/FMath/RInterpTo?application_version=5.3


  • 구조
static FRotator RInterpTo  
(  
    const FRotator & Current,  
    const FRotator & Target,  
    float DeltaTime,  
    float InterpSpeed  
)  

  • 회전의 보간에 쓰인다. FRotator 시작회전과 타겟회전 사이의 딜레이를 구현한다.
  • 다음처럼 사용하고 현재 메시의 Rotator, 방향벡터, World에서의 DeltaTime, 딜레이 이렇게 매개변수를 넣어주면 된다.

void ABasePawn::RotateTurret(FVector LookAtTarget)
{
	FVector ToTarget = LookAtTarget - TurretMesh->GetComponentLocation();
	FRotator LookAtRotation = FRotator(0.f,ToTarget.Rotation().Yaw, 0.f);

	TurretMesh->SetWorldRotation(
		FMath::RInterpTo(
			TurretMesh->GetComponentRotation(),
			LookAtRotation,
			UGameplayStatics::GetWorldDeltaSeconds(this),
			55.f));
}
profile
게임 프로그래머

0개의 댓글