ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터 그래픽스] Euler Transforms and Quaternions
    컴퓨터그래픽스 2024. 2. 16. 13:50

    이 책을 이등분 하자면 이제까지 포스팅했던 내용이 전반, 앞으로 다룰 내용은 후반부에 해당한다. 전반부에는 각종 변환과 랜더링 파이프라인에 대해 배웠다면, 후반부에선 조금 더 어려운 주제와 응용을 다루게 된다. 개인적으로 후반부 내용이 정말 어려웠지만 공부하기에 더 재미있었다. 하지만 다시 복습하려니 막막하다 ㅎㅎ. 7개 정도의 과를 남겨두고 있는데 그래도 끝이 보인다. 방학때 책 한권을 정리하다니.. 많이 발전했다 ㅜ 더 열심히 해보자!!!

    ​

    1. 오일러 변환

    ​

    오일러 변환의 정의는 간단하다. 세 개의 주축 중심 회전을 결합한 변환이다. 왜 굳이 세 개의 주축 회전을 결합하는지 설명해보자면, 주축이 아닌 임의의 축을 중심으로 물체를 회전하려면 결국 주축 중심 회전들을 적절히 조합해야 하기 때문이다.

    ​

    핵심은 저 '주축' 이라는 것이 월드 공간 주축인지, 오브젝트 공간 주축인지이다. 오일러 변환은 두 공간 모두에서 할 수 있는데, 그 결과가 다르다. 월드 공간 주축은 물체가 회전해도 변하지 않지만, 오브젝트 공간 주축은 물체가 회전함과 동시에 주축도 따라서 움직이기 때문이다.

    월드 공간 오일러 변환

    위 그림에선 z, y, x 순서로 회전을 하고 있는데, 순서를 바꿔주면 결과가 달라진다는 점에 유의해야 한다.

    ​

    1-1 월드공간 오일러 변환과 오브젝트공간 오일러 변환의 관계

    중간에 복잡한 식이 있긴 하지만, 결론은 월드 공간에서의 오일러 변환과 오브젝트 공간에서의 오일러 변환은 역순 관계이다. 위 그림을 예시로 설명하자면, 그림에선 z(30) y(-90) x(90) 순서로 회전을 진행하고 있다. 오브젝트 공간의 주축을 uvn 이라 하면 오브젝트 공간에서 u(90) v(-90) n(30) 순서로 회전을 진행했을 때 위 그림과 동일한 결과를 얻을 수 있다. 중요한 내용은 아니라서 교수님도 수업때 그냥 넘어갔던 부분인데. 수학적으로 아름다워서 정리해봤다.

    ​

    2. 키프레임 애니메이션

    요즘 게이밍 모니터는 240hz까지 돌아간다. 나도 3060ti의 성능을 최대한 뽑아먹고 싶어서 모니터를 바꿔볼까 고민중인데, 지금 다룰 키프레임 애니메이션은 이러한 내용들과 관련이 있다.

    ​

    우리가 게임에서 보는 각종 애니메이션, 움직임들은 결국 연속적으로 보여야 한다. 그러기 위해서 1초당 엄청나게 많은 수의 frame을 내보내야 하는데, 이를 전부 작업하는 것은 실질적으로 무리가 있다. 때문에 훨씬 적은 수의 프레임에 대해서 동작을 정의하고, 그 사이사이의 프레임은 런타임에 자동으로 채워진다. 핵심 프레임을 바로 키프레임(keyframe), 중간에 채워지는 프레임을 중간 프레임(in-Between frame)이라 한다.

    위 그림에선 키프레임 0과 키프레임 1 사이를 어떻게 보간하는지에 대해 나타낸다. p는 사각형 중심의 좌표를, theta는 회전각(=방향)을 나타낸다. 둘다 선형보간의 원리로 채워진다.

    위치(p)와 회전각(theta)를 선형보간하는 식

    이를 3차원으로 확장시켜보자.

    좌측은 회전각, 우측은 위치에 대해 어떻게 보간되는지를 나타낸 것이다. 검은 점이 키프레임이고, 선분은 보간을 나타낸 것이다. 주전자의 색상 역시 동시에 보간되는 모습을 확인할 수 있다. 키프레임을 잇는 선분은 꼭 선형보간일 필요가 없다. 조금 더 고차원적인 보간도 가능하다.

    ​

    그런데, 오일러 각은 항상 올바르게 보간되지 않는다. 그렇기 때문에 사용할 개념이 쿼터니언 이다.

    오일러 변환의 문제점 - 오일러 각이 제대로 보간되지 않음.

    (a)는 키프레임 0이고 (b)는 키프레임 1이다. (c)는 이를 중간 보간한 것인데, 뭔가 이상하다. a와 b 모두 yz 평면에 놓여있기 때문에 중간 프레임 또한 그래야 하지만, c에서 나타난 중간 프레임은 yz 평면을 벗어난 모습이다. 이러한 문제점으로 인해 키프레임 애니메이션에는 보통 쿼터니언을 사용하게 된다. 킹갓 쿼터니언..

    ​

    3. 쿼터니언

    책에서도 '쿼터니언은 간단하지 않다'라는 말을 먼저 쓰고 간다 ㅋㅋㅋ. 공부할때는 정말 어려웠는데 실전에 사용하기에는 그렇게 어렵지 않은 개념이다. 실제로 유니티를 이용해 개발하다보면 쿼터니언을 쓸 일이 정말 많다! 아마도 이 책에서 다섯 손가락 안에 꼽히는 중요한 개념이지 않을까 싶다.

    ​

    먼저 쿼터니언의 정의부터 보고 가자. q는 복소수를 4개의 항으로 표현한 것인데 각각 qxi, qyj, qzk, qw 이다. 여기서 qx, qy, qz는 허수부, qw는 실수부이다. 두 개의 쿼터니언 p와 q의 곱은 위와 같은 형태로 표현된다.

    ​

    쿼터니언 q를 (qx, qy, qz, qw)이라 했을 때 q의 켤레 쿼터니언 q*는 (-qx, -qy, -qz, qw)이다. 일단 개념은 이렇고, 이것이 어떻게 회전에 적용되는지 살펴보자.

     

    간단한 2차원 회전이다. 이러한 회전을 복소수로 표현할 수 있는데

    쉽게 식을 설명하면, 벡터 (x,y)를 회전각 theta만큼 회전하는 것을 복소수의 형태로 썼다고 생각하면 이해하기 편하다.

    ​

    3차원 회전에서도 이와 똑같은 원리를 사용한다. 회전할 벡터와, 회전 변환을 각각 쿼터니언으로 표현하는 것이다.

    ​

    먼저 회전할 벡터를 (qx, qy, qz, 0)으로 표현할 수 있다. 간단하게 (q, 0)이라 표기하자.

    그 다음 회전 변환을 (qx, qy, qz, qw)으로 표현한다. 만약 회전축이 u이고 회전각이 theta인 경우 q는 (sin(theta/2)u, cos(theta/2))로 정의된다.

    ​

    마지막으로 p를 u축 중심으로 theta만큼 회전하는 것은 p' = qpq* (q*는 q의 켤레 쿼터니언) 으로 표현된다.

    ​

    쿼터니언들끼리의 곱셈결과는 계속 쿼터니언이다. 때문에 p' 또한 쿼터니언이다.

    ​

    자 우리는 쿼터니언을 가지고 보간을 해야 한다. 다음 그림을 먼저 봐보자

    아까랑 똑같은 예시이다. 그림에서 왼쪽 부분은 오일러 변환, 오른쪽은 쿼터니언을 이용해 보간하는 것이다.

    쿼터니언을 이용한 보간식을 다른말로 구체 선형보간 이라고 하는데, 여기서 p와 q는 각각 회전을 나타내는 단위 쿼터니언(||q|| = 1)이다.

    ​

    이 식이 또 쿼터니언의 핵심 식인데, 바로 (qx, qy, qz, qw)를 회전 행렬로 변환한 식이다. 위와 같은 회전 행렬이 주어졌을 때 q를 구하는것 또한 가능하다. 적당히 방정식 몇번 풀다보면 구해지더라..ㅎㅎ(시험때 너무 귀찮았다)

Designed by Tistory.