언리얼엔진/블루프린트

트랜스폼에 대해

season97 2023. 10. 8. 17:33

▶ 트랜스폼

 

ㆍ 트랜스폼이라 하면 3D 공간에서 이동, 회전, 스케일을 말한다.

 

ㆍ 스크립트 컴포넌트에서 다른 객체 또는 자기 자신의 객체에 속해있는 컴포넌트에 접근하기 위해서는

관련 함수나 프로퍼티를 사용해야 한다.

 

ㆍ언리얼엔진은 자주 이용되는 컴포넌트는 미리 프로퍼티로 정의가 되어있기 때문에 해당 프로퍼티를 활용하면 컴포넌트에 쉽게 접근할 수 있다.

 

 

▶ 프로퍼티? 

 

ㆍ 프로퍼티는 객체지향 프로그래밍에서 클래스나 구조체의 맴버변수에 대한 간접적인 접근을 가능하게 하는 메서드다.

 

ㆍ 일반적으로 Getter와 Setter로 구성되어 있다.

여러 프로퍼티들

※ 참고자료 https://docs.unrealengine.com/5.1/ko/unreal-engine-uproperties/

 

 

트랜스폼 관련 블루프린트 노드

 

 

로컬좌표
월드좌표

 

 

커졌다 작아졌다

 

 

▶ 회전에 대해

 

1. transform.Rotate


ㆍ원점기준 회전 -> 그냥 빙글빙글회전

2. transform.RotateAround


ㆍ 대상기준 회전 예시: 태양을 도는 지구.

ㆍ 블루프린트에선 Add Local Rotation 또는 Set Rotation등의 노드로 특정 축 주변을 회전시키게 할 수 있다.

 

 

오일러각?

 

ㆍ 3D공간에서 객체의 방향을 표현하는 방법중 하나.

 

ㆍ 오일러각은 보통 Pitch(상하) , Yaw (좌우), Roll (수직축) 세가지 각도로 구성되며

이 각도를 조합해 3D공간에서 어떤 방향이든 표현할 수 있다.

 

 

오일러 각

 장점과 게임에서 필요한 이유

 

ㆍ 오일러각은 비교적 사람이 이해하기 쉽고 직관적인 형태로 3D방향을 표현합니다.

 

ㆍ 게임 내의 캐릭터나 카메라의 움직임을 제어할 때 오일러 각을 사용하면 코드가 단순해지고 이해하기 쉬워진다.

 

 

※ 단점

 

짐벌록 현상 : 짐벌록은 세 축 중에 두축이 겹치게 되어 독립적인 회전을 할 수 없게 되는현상을 말한다. 

-> 이 현상때문에 가끔 예상하지 못한 움직임이 발생할 여지가 있다.

짐벌록 현상

ㆍ 보간문제 : 서로 다른 두 오일러 각 사이를 부드럽게 보간하는건 매우 복잡하다. 

-> 짧은경로 대신 긴 경로를 따라 회전하는 등 의도하지 않은 움직임이 발생할 수 있다.

 

 

★ 짐벌록 현상을 해결하는 방법

 

◈ 사원수(Quaternion)라는 방식을 사용한다.

회전축 e에 대한 3차원 공간의 회전
공간 회전의 사원수 표현식을 위한 3차원 자표계

4차원 복소수를 확장한 개념으로, 3D공간에서의 회전을 표현하는데 주로 사용된다.

 

ㆍ 사원수는 w,x,y,z의 네가지 요소로 구성되며 각각이 스칼라부분과 벡터부분을 나타낸다.

 

 장점

 

ㆍ 짐벌록 문제 해결 : 사원수를 사용하면 3D 회전에서 발생할 수 있는 짐벌록 현상을 피할 수 있다. 

 

ㆍ 효율적인 보간: 사원수를 사용하면 두 회전 사이의 보간, 즉 slerp(구면 선형 보간)이 가능하진다.

ㄴ 이 방식은 두 점 사이를 짧은 경로로 부드럽게 이동시키므로 애니메이션등에 유리하다.

 

ㆍ 합성 연산 용이: 두 개의 회전을 합성하는 것 역시 사원수를 사용하면 쉽게할 수 있다.

 

 

 단점

 

ㆍ 원리를 모르면 사용할 수 없고 복잡한 수학적 개념 때문에 직관적으로 이해하기 어렵다.

 

ㆍ 언리얼 엔진에서는 몰라도 내부적으로 사용해 주기 때문에 쉽게 사용할 수 있다. 

 

 

▶  축(Axis)

-
축을 의미하기 떄문에 프로퍼티가 존재한다. 


 GetAxis 와 GetAxisRaw 차이점 

ㆍ  GetAxis :
실수로 되어있으며 부드러운 반응이 나오길 원할때 사용 하면 된다.

ㆍ  GetAxisRaw :
정수로 되어있으며 즉각적인 반응이나오길 원할때 사용하면 된다.

why? :  -1 0 1 3개밖에없음으로 탐색이 3번밖에없다

※ 둘의 공통점은 -1 ~ 1 까지의 값을 사용한다는 점

 

 

 

▶ 언리얼에서 트랜스폼 고려할 점

 

ㆍ 부모 기준으로 돌릴것인지? 내 기준으로 돌릴것인지?

 

ㆍ 로컬좌표기준으로 돌릴것인지 월드좌표 기준으로 돌릴것인지?

 

ㆍ 변이량을 누적시키는 단발성인지? 누적시키지 않는 지속성인지?

 

ㆍ 함수를 이용할 것인지? 프로퍼티를 이용할것인지? 객체를 찾아 컴포넌트를 붙힐 것인지?

 

ㆍ 어떤 이벤트로 처리를 할것인지?( 예를들어 키입력 , 조건만족시 )