상세 컨텐츠

본문 제목

ECEF->Unreal 회전 좌표계 변환

Unreal

by Real_Go 2025. 12. 8. 23:53

본문

ECEF 란 무엇인가....Earth-Centered Earth-Fixed 의 준말로 

지구중심고정좌표계라고 하는 지구의 중력 중심을 원점으로 하는 좌표계인데, GPS에서 사용되는 좌표체계이다.

 

우리가 사는 곳은 대부분 지구 표면에 붙어있을테니 x,y,z 점의 지구 중심으로부터의 길이는 구의 반지름 대량 6300 km 가 나와야 할 것이다. 

회전은 어떨까? 지구 중심에서 적도를 둘레로 하는 원의 면적에서 경도 회전값이 

경도를 둘레로 하는 원의 회전 값에서 위도가 결정될 것이다. 

 

 

우리가 흔히 아는 38선은 위도 38 도에 북한과 남한을 가로지르는 군사 경계선이고

동경 135도는 하루의 정의가 지구가 자전을 한바퀴하는 것이기에 360도를 24시간으로 나누면 나오는 15도가 한시간의 기준이 되어 경도가 0이 기준점이 되는 그리니치 천문점이 있는 영국으로부터 일본과 한국이 약 135도 즉 9시간 만큼의 시차가 먼저 앞서게 된다. 

이를 통해 우리는 지구로부터 위도 38도 경도 135 정도의 위치에 있다는 것을 어림짐작할 수 있는데 

이 위치에서 NED/ENU 를 구하면 다음과 같다. 

 

Up Vector 축으로 0도면 북쪽  90도면 동쪽이 되는 거고 

North Vector 를 축으로 Roll 이, East Vector 를 축으로 Pitch 가 결정될 것이다. 

 

결론적으로는 북쪽이 yaw 값 0도가 되면 NED, 동쪽이  yaw 값  0도 가되면 ENU 가 된다고 생각하면 된다. 

 

따라서 

NED to Unreal 변환을 해주면 됨 

 

결론적으로는 

// 1) 로컬(예: NED/ENU) 기준 바디 회전 (FOM에서 받은 Psi,Theta,Phi)
double psiDeg   = FMath::RadiansToDegrees(AttitudeRad.X); // Yaw (Z)
double thetaDeg = FMath::RadiansToDegrees(AttitudeRad.Y); // Pitch (Y)
double phiDeg   = FMath::RadiansToDegrees(AttitudeRad.Z); // Roll (X)

// FOM: Z-Y-X (yaw-pitch-roll) → Unreal Rotator 매핑 (필요에 따라 부호 조정)
FRotator BodyLocalRot(
    thetaDeg,  // Pitch
    psiDeg,    // Yaw
    phiDeg     // Roll
);
FQuat Q_bodyLocal = BodyLocalRot.Quaternion();

// 2) "로컬 좌표계 → 언리얼 월드" 프레임 회전
// 예) 언리얼에서 +X=East, -Y=North, +Z=Up 이면,
//     ENU의 (East,North,Up) → (X,-Y,Z) 로가는 고정 회전이라 보정 Quat 하나 정의해둘 수 있음.
FRotator LocalToWorldFrameRot(
    0.0,  // Pitch 보정
    0.0,  // Yaw 보정
    0.0   // Roll 보정
);
// 필요하면 여기서 축 뒤집기/좌우 반전 같은 것 넣어줌
FQuat Q_localFrameToWorld = LocalToWorldFrameRot.Quaternion();

// 3) 최종 월드 회전 (순서는 프로젝트 컨벤션에 따라 한번 뒤집어 볼 수 있음)
FQuat Q_world = Q_localFrameToWorld * Q_bodyLocal;

// 4) 세팅
Actor->SetActorRotation(Q_world);

 

요런 흐름을 가져가면 된다. 

 

아니면 Actor Location 은 냅두고 Relative rotation 만 깡으로 박아넣어서 바꾸던가 

 

 

 

관련글 더보기