Ad Block 한번만 꺼주시면 안될까요..?
게임 개발/C#

.Rotate 관련이 안된다 / 이해할수없다

UniCoti(유니코티) 2022. 7. 14.

회전 관련 이벤트가 안되거나 이해할수없는 값으로 회전할때는

아마도 쿼터니언, 오일러의 개념을 모르고 둘다 같게 생각하고 값을 줬기 때문일것이다.

 

쿼터니언은 인자가 4개로,

우리가 보통 사용하는 xyz로 각도를 나타내는법 즉, 오일러 각은

깊게 들어가면 사용에 문제가 있는 반면

쿼터니언 방법으로 각도를 나타낸다면

 

보다 빠르고, 확실하고, 어떠한 문제도 없이 나타낼수 있다.

하지만 사람이 이해하기엔 시간이 걸리기 때문에

 

유니티 상에선 사람이 이해하기 쉽도록 오일러 각도로 표기 해주고,

인스펙터에 오일러 각도로 표기를 해 준다.

 

하지만 오일러 각은 분명 컴퓨터가 사용하기엔 문제가 있기에

컴퓨터는 오일러 각을 내부에서 쿼터니언으로 변환해서 사용한다.

그렇기에 코드에서도 쿼터니언이 가장 기본으로 깔려있다.

 

결론적으로 우리는 오일러 값을 생각하고 코드를 짜도

컴퓨터는 쿼터니언 값으로 알고 있기 때문에

전혀 다른 결과가 나오는것이다.

 

해결법

transform.rotation = new Vector3(90 , 90 , 90); // X

쿼터니언 값을 대입해주는 코드에 오일러 값을 넣은 코드이다.

 

컴퓨터는 기본이 쿼터니언인 반면 우리는 오일러인줄 알고 있기에

저 코드는 전혀 의도하지 않은 결과가 나온다.

 

그래서 저 코드를 고치려면 

transform.rotation = Quaternion.Euler(90, 90, 90);

이렇게 고쳐줘야 한다.

Quaternion.Euler() 은 안에 오일러 값 인자(수)를 넣으면
쿼터니언 값으로 변환된다고 이해하면 편하다.
 
이제야 컴퓨터가 이해하는 각과 사람이 이해하는 각의
중점을 향한 코드가 된것이다.
대충 타협점을 봤다고 생각하면 편하다.

 

컴퓨터가 오일러각을 쿼터니언 각으로 변환해서 사용했다. 라고 생각하면 된다.

 

결론 은 우리가 아는 X , Y , Z의 세 축에 의한 회전은 "오일러" 각도인데,

컴퓨터는 복잡한 "쿼터니언" 방식을 사용하기 때문에

내가 원하는 각도로 가지 않는 문제가 발생하는 것이고,

 

이걸 고치기 위해선

Quaternion.Euler(), transform.rotation.eulerAngles 등 

오일러 각을 쿼터니언으로 변환해주는 함수를 사용해주어야 된다는 것이다.

 

또한 여기서 그치지 않고 쿼터니언과 오일러각 등 이 에 관한

수학적 원리, 문제점등을 따로 찾아본다면

좋을것이다.

 

이상 도움이 되었길 바라며,

 

끝.

 

댓글

💲 추천 글