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의 차이
- float
- 32비트(4바이트) 크기의 부동 소수점 숫자.
- 소수점 이하 약 7자리의 정밀도를 가짐.
- 메모리 사용량이 적고, 연산 속도가 더 빠름.
- double
- 64비트(8바이트) 크기의 부동 소수점 숫자.
- 소수점 이하 약 15~16자리의 정밀도를 가짐.
- 메모리를 더 많이 사용하고, 더 높은 정밀도가 필요할 때 사용.
접미사를 붙이지 않은 숫자는 기본적으로 double로 처리
게임 개발에서는 많은 계산이 이루어지기 때문에 float를 선호
2-2. 부동 소수점 연산의 한계
기본 개념
- 부동 소수점(Floating-point): 컴퓨터가 실수를 표현하기 위해 사용하는 방법으로, 정확한 숫자가 아닌 근사치를 저장.
- 정밀도 제한: 부동 소수점은 제한된 비트 수로 숫자를 표현하므로, 연산 중에 작은 오차가 발생.
- 연산 결과 오차: 반복 연산에서 오차가 누적될 가능성이 있음.
참고 자료
- 부동 소수점 연산의 기본 원리 (Wikipedia)
- What Every Programmer Should Know About Floating-Point Arithmetic (PDF, 영어)
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 |