• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

오일러, 쿼터니언 전환시 해결책에 대해서 이해가 잘 안됩니다

21.06.03 03:03 작성 조회수 271

0

먼저 첫번째 오류 케이스는 이걸 말씀 하시는 거죠?

오일러에서는 단순하게 x , y, z에 값을 바꿔주는 것으로 연산이 가능한데 반해, 쿼터니언은 짐벌락을 방지하기 위해서 w라는 축으로 보정을 해줍니다.

강의 상의 오류가 나타나는 코드를 보면 쿼터니언으로 받아와서, 단순히 x값만 바꿔주니까 문제가 생기는 거구요

만약에 (거의 불가능하겠지만) 임의로 변환된 x값에 해당하는 w값도 바꿀 수 있다면, 이 경우에 짐벌락이 발생 하지 않는 거라고 생각이 드는데 맞나요?

두번재 경우는, 마지막에 쿼터니언으로 값을 집어 넣어준다고 해도, 그 이전에 오일러로 연산을 하는 과정에서 짐벌락이 생기기 대문에 안되는 거구요

해결책들에 대해서 이해가 안가는건, 일단은 보여주신 해결책을 쓰면 짐벌락이 벌어질 가능성이 없다는건  

값을 받아온다는 건, 매 프레임 마다, 현재 rotation 값을 가져와서 그런뒤에 거기에 변화된 값을 넣는 다는 거잖아요?

해결책을 보면 받아오는 부분만 빠지고, 아예 새로운 변수를 넣어서 대입해주는 거잖아요 왜 읽어주는 부분이 빠지면 해결이 되는지 모르겠습니다

 

답변 1

답변을 작성해보세요.

0

안녕하세요. 이 내용도 답변이 빠져있었네요. 

예제 1에서 보면 저희가 x를 그대로 바꾸고 있는데요.

유니티에서 직접 로테이션의 쿼터니언을 수정을 해야 할 일이 거의 없습니다. 

오일러 각도를 생각해보면 x y z 축의 각도만을 사용하고 있습니다. 

쿼터니언을 자세히 보면 x, y , z , w  이렇게 네축이 있는데 이게 수학적으로는 매우 어렵고요. 

거기에 대해 설명드리기 보다는 원리만을 설명드리겠습니다.

행렬로 보면 오일러각도는 3차원이고  쿼터니언은 4차원인데 각각의 값들이 x는 x y는 y z는 z 이렇게 일대일로 매칭되어 설계된 값이 아닙니다. 차원이 늘어나면서 각각의 오일러 각도의 원소들의 4차원으로 확장되어 들어가는 형태가 되기 때문입니다.  하나를 바꾸면 어느 순간에는 두개를 바꾸어야 하는 경우가 생깁니다. 

행렬식으로 곱셈같은 것들이 이루어져 있기 때문에 그렇습니다. 

결국 저희가 처리해야 하는 내용은 쿼터니언의 값들을 직접 접근하여 변경하지 않고 각도를 변경하여 쿼터니언에 집어넣는 형태로 작업을 해야 합니다. 

 

그리고 예제 2는 잘 될 것같지만 안되는 이유는 소수점의 문제 때문인 것으로 보입니다. 90도 근처의 값에서 읽어올때 오류가 발생되어 그렇지 않나 생각이 듭니다.  소수점은 6자리 아래까지밖에 정밀도가 없습니다.  마찬가지로 더블형이 되어도 이건 소수점 아래에서 오차가 생기게 됩니다. (읽어오고 변환하여 약간 더해서 다시 대입)

그렇기에 잘 되다가도 90도 부분의 읽어오는 부분에서 쿼터니언을 읽어와서 각도록 변경하고 각도를 다시 쿼터니언으로 바꾸는 동작이 별로 좋지 않다는 것입니다.  (짐벌락이 90도 근처에서 일어납니다)

세번째 경우만 잘 되는 것은 오일러 각도를 계속 저희가 더하고 있고 이걸 쿼터니언으로 바꾸어서 다시 로테이션으로 대입하기 때문에 오류가 없습니다. 

정확한 이해를 위해서는 OPENGL 을 공부하셔서 행렬곱의 쿼터니언이 어떻게 동작하는지를 공부해야 할 것 같습니다.

우선 사용하는 차원에서 각도는 각도대로 쿼터니언은 쿼터니언대로 동작하도록 해야 사용이 가능합니다.

감사합니다.