1. 좌표계

월드 좌표계

  • 게임이나 3D 환경에서 전체 세계를 기준으로 한 절대적인 좌표계
  • Transform 함수:
    • SetActorLocation()
    • SetActorRotation()
    • AddActorWorldOffset()

로컬 좌표계

  • 특정 객체의 상대적인 좌표계
  • 자식 객체는 부모 객체의 로컬 좌표계를 따른다
  • Transform 함수:
    • AddActorLocalRotation()
    • AddActorLocalOffset()

 

Transform 함수 인자:

  • NewLocation: 새로운 위치 (FVector)
  • DeltaLocation: 이동할 거리 (FVector)
  • bSweep: 충돌 감지 여부(true/false)
  • OutSweepHitResult: bSweep=true인 경우, 그 충돌 결과를 담을 FHitResult 객체
  • Teleport: 순간 이동 여부(none이면 부드럽게 이동)

 

예시:

void SetActorLocation(FVector NewLocation, bool bSweep = false, FHitResult* OutSweepHitResult = nullptr, ETeleportType Teleport = ETeleportType::None);
void AddActorLocalRotation(FRotator DeltaRotation, ETeleportType Teleport = ETeleportType::None);

 

좌표계 확실히하고 가자! 액터를 자전시키고 싶은데 공전하는 현상이 없도록


2. 부동 소수점의 문제

부동 - 소수점 위치가 고정되지 않고 이동(floating)할 수 있다~

2-1. C++에서 float와 double의 차이

  1. float
    • 32비트(4바이트) 크기의 부동 소수점 숫자.
    • 소수점 이하 약 7자리의 정밀도를 가짐.
    • 메모리 사용량이 적고, 연산 속도가 더 빠름.
  2. double
    • 64비트(8바이트) 크기의 부동 소수점 숫자.
    • 소수점 이하 약 15~16자리의 정밀도를 가짐.
    • 메모리를 더 많이 사용하고, 더 높은 정밀도가 필요할 때 사용.

접미사를 붙이지 않은 숫자는 기본적으로 double로 처리

게임 개발에서는 많은 계산이 이루어지기 때문에 float를 선호

 

2-2. 부동 소수점 연산의 한계

기본 개념

  • 부동 소수점(Floating-point): 컴퓨터가 실수를 표현하기 위해 사용하는 방법으로, 정확한 숫자가 아닌 근사치를 저장.
  • 정밀도 제한: 부동 소수점은 제한된 비트 수로 숫자를 표현하므로, 연산 중에 작은 오차가 발생.
  • 연산 결과 오차: 반복 연산에서 오차가 누적될 가능성이 있음.

참고 자료

 

2-3. 플랫폼 이동 구현에서의 핵심 문제

문제의 본질

  • 플랫폼이 목표 위치에 정확히 도달하지 못하는 이유는 부동 소수점 연산의 정밀도 문제로 조건이 만족되지 않기 때문.
  • 특히, FVector::Dist로 계산한 거리와 작은 임계값(Threshold)을 비교할 때 조건이 false로 평가되면 방향 반전이 발생하지 않음.

Unreal Engine 관련 주요 함수

  • FVector::Dist
    두 점 간의 유클리드 거리를 계산:
float FVector::Dist(const FVector& V1, const FVector& V2);
  • FMath::IsNearlyEqual
    두 부동 소수점 값을 일정 임계값 내에서 비교:
bool FMath::IsNearlyEqual(float A, float B, float ErrorTolerance);

 

2-4. 임계값 설정의 중요성

일반적인 해결 방법

  • 비교할 때 일정한 버퍼(zone)를 만들어 작은 오차를 허용.
  • 정수 연산하기.

임계값 선택 시 고려 사항

  • 임계값이 너무 작으면 부동 소수점 오차로 조건이 만족되지 않을 가능성이 있음.
  • 임계값이 너무 크면 목표에 도달하기 전에 조건이 만족될 수 있음.

 

✏️ 단순 비주얼 스튜디오 스크립팅과 미묘하게 다른 점이 많아 신경쓸 부분들이 있었습니다.

임계값 설정 때문에 테스트를 정말 많이 해봤네요..ㅎㅎ

섬세함이 요구되는 개발..  나랑 너무 어울림


 

'TIL > C++와 UE' 카테고리의 다른 글

회전 관련 함수 및 Pawn 클래스 Look 함수  (1) 2025.01.27
충돌 검사  (0) 2025.01.24
Pawn 클래스 다루기  (0) 2025.01.23
언리얼 엔진 클래스 계층 구조  (0) 2025.01.22
언리얼 엔진 C++ 빌드 프로세스  (0) 2025.01.20