본문 바로가기
도전

3D Computer Graphics (7)

by oncerun 2023. 4. 26.
반응형

오일러 변환(Euler transformation)은 3차원 공간에서 회전과 이동을 모두 수행하는 선형 변환이다. 오일러 변환은 3개의 변환 축(roll, pitch, yaw)을 사용하여 객체를 움직이는 방법을 설명한다.

각 축은 각도를 기준으로 회전하며, roll은 x 축을 기준으로, pitch는 y 축을 기준으로, yaw는 z 축을 기준으로 회전한다. 이 세 축의 회전 각도를 조합하여 3D 객체를 움직일 수 있다.

 

오일러 각은 다음과 같이 나타낼 수 있습니다.

1. XYZ 회전
x, y, z 축으로 회전하는 각도를 나타냅니다. 이 회전 순서는 x축 -> y축 -> z 축 순서로 이루어집니다.

2. XZY 회전
x, z, y 축으로 회전하는 각도를 나타냅니다. 이 회전 순서는 x축 -> z 축 -> y축 순서로 이루어집니다.

3. YXZ 회전
y, x, z 축으로 회전하는 각도를 나타냅니다. 이 회전 순서는 y축 -> x축 -> z 축 순서로 이루어집니다.

4. YZX 회전
y, z, x 축으로 회전하는 각도를 나타냅니다. 이 회전 순서는 y축 -> z축 -> x축 순서로 이루어집니다.

5. ZXY 회전
z, x, y 축으로 회전하는 각도를 나타냅니다. 이 회전 순서는 z축 -> x축 -> y축 순서로 이루어집니다.

6. ZYX 회전
z, y, x 축으로 회전하는 각도를 나타냅니다. 이 회전 순서는 z축 -> y축 -> x축 순서로 이루어집니다.

각 축에서 회전하는 각도는 각각 -180도에서 180도 사이의 값이 됩니다.

 

오일러 회전행렬(Euler rotation matrix)은 오일러 각(Euler angles)을 이용하여 3차원 공간에서 오브젝트의 회전을 표현하는 회전행렬입니다. 

오일러 회전행렬은 회전순서와 축에 따라 다양한 형태가 있습니다. 

이 중에서도 가장 많이 사용되는 회전순서는 z, y, x 축 순서로 회전하는 ZYX 회전이며, 이를 통해 구한 회전행렬은 다음과 같습니다.

[cos(y) cos(z), cos(z) sin(x) sin(y)-cos(x) sin(z), cos(x) cos(z) sin(y)+sin(x) sin(z)]
[cos(y) sin(z), cos(x) cos(z)+sin(x) sin(y) sin(z), -cos(z) sin(x)+cos(x) sin(y) sin(z)]
[-sin(y),         cos(y)sin(x),                                cos(x) cos(y)                              ]

여기서 x, y, z는 오일러 각으로, 각 축에서 회전하는 각도를 나타냅니다.

오일러 회전행렬은 3차원 공간에서 오브젝트의 위치 변환 행렬과 함께 합성하여 모든 변환을 표현할 수 있습니다. 

 

오일러 변환에서 물체의 방향은 회전이 결정한다 근데 회전은 오일러 변환이 담당할 수도 있다.

 

오일러 변환은 각도 3개(x,y,z)로 표현이 된다.  각 x, y, z가 key를 형성하고 중간 프레임에서는 보간이 된다.

 

이후 보간된 x,y,z가 있으면 행렬이 만들어지고 결합하여 3 *3 행렬이 나오고 이를 적용하면 회전이 적용된 물체가 나온다.

 

 그러나 오일러 변환의 주요 단점 중 하나는 회전 순서에 따라 결과가 달라질 수 있다는 것이다.

 

이러한 문제는 회전 행렬을 사용하거나 쿼터니언(quaternion)과 같은 다른 방법으로 해결할 수 있다.

 

 

Keyframe Animation in 2D에서  애니메이터는 처음과 끝, 중간을 구하면 중간 프레임은 런타임에 자동으로 생성이 되게끔 한다. 

현재는 런타임에 컴퓨터가 보간을 통해 사이 프레임을 만들어 낸다. 


다음은 3D 키 프레임 애니메이션에서 보간(interpolation)을 하는 방법입니다.

1. 선형 보간(Linear Interpolation)
선형 보간은 키 프레임 간의 선을 따라 움직임을 보간하는 것입니다. 이 방법은 간단하고 직관적인 방법이지만, 이동과 회전 등의 움직임이 일정하지 않은 경우 부자연스러울 수 있습니다.

선형 보간은 두 개의 키프레임 각도 값 사이에서 선형적으로 보간합니다. 예를 들어, 두 개의 키프레임이 있고 첫 번째 키프레임의 각도 값이 A이고, 두 번째 키프레임의 각도 값이 B일 때, 시간(t)에 따른 보간 각도 값 C는 다음과 같이 계산됩니다.

C = (1 - t) *A + Bt

여기서 t는 시간(0에서 1 사이의 값)을 의미합니다.

삼차 보간은 이전, 현재, 다음 키프레임 각도 값을 사용하여 부드러운 곡선으로 보강합니다. 이전, 현재, 다음 각도 값이 각각 A, B, C일 때, 시간(t)에 따른 삼차 보간 각도 값 D는 다음과 같이 계산됩니다.

D = (2t^3 - 3t^2 + 1)A + (t^3 - 2t^2 + t)(B - A) + (-2t^3 + 3t^2) C + (t^3 - t^2)(C - B)

여기서 t는 시간(0에서 1 사이의 값)을 의미합니다.

삼차 보간은 보간 곡선이 부드러워 자연스러운 애니메이션 효과를 제공하지만, 계산 비용이 높아 선형 보간에 비해 더 많은 연산이 필요합니다.


2. 스플라인 보간(Spline Interpolation)
스플라인 보간은 곡선을 따라 움직임을 보간하는 것입니다. 이 방법은 선형 보간에 비해 부드러운 애니메이션을 만들 수 있으며, 움직임이 일정하지 않은 경우에도 자연스러운 움직임을 만들 수 있습니다. 보관할 때에는 카테시안 좌표계(Cartesian coordinate system)와 유클리드 좌표계(Euclidean coordinate system)에서 스플라인 보간을 사용할 수 있습니다.

3. 쿼터니언 보간(Quaternion Interpolation)
쿼터니언 보간은 회전 움직임을 보간하는 방법입니다. 이 방법은 퀘스트의 회전 값이 상호 간의 직선상에 있어야만 가능하며, 보간 된 회전 값이 항상 유효한 회전 값이 되도록 제한됩니다. 

 

4차원 벡터의 보간이라 직관적으로는 그릴 수 없지만 별도의 공식이 있다. 



두 개의 쿼터니언 q1과 q2가 주어졌을 때, 보간되는 새로운 쿼터니언 q(t)는 다음과 같습니다.

q(t) = (q1 * (sin((1-t)*θ)) + q2 * (sin(t*θ))) / sin(θ)

여기서, 

- *는 쿼터니언의 곱셈 연산을 나타냅니다.
- θ는 두 쿼터니언의 사잇각(half-angle)을 나타내며, 아래와 같이 계산됩니다.

θ = acos(q1 dot q2)

여기서 dot은 쿼터니언의 내적(inner product)을 나타냅니다.

- t는 0과 1 사이의 값으로, q1에서 q2로의 보간 위치를 나타냅니다.

 

이를 spherical linear interpolation 약자로 slerp이라고 합니다. !

 

 


4. 베지어 보간(Bézier Interpolation)
베지어 보간은 Spline Interpolation의 한 종류로, 더욱 자연스러운 곡선을 만들어 줍니다. 제어점(control point)을 이용하여 자연스러운 곡선을 만들 수 있으며, 이 방법을 사용하면 객체의 움직임을 정확하게 조정할 수 있습니다.

이러한 방법들을 사용하여 키 프레임 애니메이션을 부드럽게 보간할 수 있습니다. 보간 된 결과물은 객체의 자연스러운 움직임을 보여주며, 디자인, 게임, 영화 등의 분야에서 널리 사용됩니다.

 

 

 

그중 쿼터니언은 복소수를 확장한 것입니다.  4차원 벡터로 결론되고 우리는 이를 4 원수라고도 한다.

 

쿼터니언(quaternion)은 4개의 실수로 이루어진 수이며, 일반적으로 다음과 같은 형태로 표현됩니다:

q = w + xi + yj + zk

여기서 w, x, y, z는 실수이고, i, j, k는 서로 다른 세 가지 허수단위로, 다음과 같은 관계를 가집니다:

i² = j² = k² = ijk = -1

쿼터니언은 벡터와 회전을 표현하는 데 자주 사용됩니다. 예를 들어, 벡터 v를 쿼터니언으로 표현하려면 다음과 같은 방법을 사용할 수 있습니다:

v = xi + yj + zk
q = w + v

이때, w는 0이고, v의 크기가 1이면, 쿼터니언 q는 v를 회전시키는 단위 쿼터니언입니다. 회전 변환은 다음과 같이 쿼터니언 곱셈으로 표현됩니다:

p' = qpq*

여기서 p는 회전하기 전의 벡터이고, p'는 회전한 후의 벡터입니다. q*는 q의 켤레(quaternion conjugate)로, 다음과 같이 정의됩니다:

q* = w - xi - yj - zk

켤레는 w는 그대로 두고, i, j, k 부호만 바꾸어서 구합니다. 쿼터니언의 곱셈은 다음과 같은 관계를 가집니다:

ij = k, jk = i, ki = j
ji = -k, kj = -i, ik = -j
i² = j² = k² = ijk = -1

 

쿼터니언 사칙연산은 다음과 같이 정의됩니다:

덧셈: 
(q₁ = w₁ + x₁i + y₁j + z₁k) + (q₂ = w₂ + x₂i + y₂j + z₂k) = (w₁ + w₂) + (x₁ + x₂) i + (y₁ + y₂) j + (z₁ + z₂) k

뺄셈:
(q₁ = w₁ + x₁i + y₁j + z₁k) - (q₂ = w₂ + x₂i + y₂j + z₂k) = (w₁ - w₂) + (x₁ - x₂)i + (y₁ - y₂) j + (z₁ - z₂) k

곱셈:
(q₁ = w₁ + x₁i + y₁j + z₁k) × (q₂ = w₂ + x₂i + y₂j + z₂k) = 
(w₁w₂ - x₁x₂ - y₁y₂ - z₁z₂) + (w₁x₂ + x₁w₂ + y₁z₂ - z₁y₂)i + (w₁y₂ - x₁z₂ + y₁w₂ + z₁x₂) j + (w₁z₂ + x₁y₂ - y₁x₂ + z₁w₂) k

나눗셈:
q₁ / q₂ = q₁ × q₂⁻¹

여기서 q₂⁻¹은 q₂의 역수를 의미합니다. 쿼터니언의 역수는 다음과 같이 정의됩니다:

q⁻¹ = q* / |q|²

여기서 |q|는 쿼터니언 q의 크기를 의미합니다. 즉, 다음과 같습니다:

|q| = sqrt(w² + x² + y² + z²)

이렇게 정의된 쿼터니언의 사칙연산은 3차원 공간에서 회전 변환을 나타내는 데 자주 사용됩니다. 또한 쿼터니언은 회전을 표현하는 오일러각과 호도각보다 다양한 이점을 가지고 있습니다.

 

 



2차원 평면 상의 벡터를 회전시키는 것은 쿼터니언(quaternion)을 사용하여 간단하게 설명할 수 있습니다.

2차원 평면 상에서 벡터를 회전시키려면 쿼터니언의 스칼라 부분과 벡터 부분을 다음과 같이 정의합니다.

스칼라 부분: cos(θ/2)
벡터 부분: sin(θ/2) * (0, 0, 1)

여기서 θ는 회전각이며, (0, 0, 1)은 z축의 단위 벡터입니다. 따라서 2차원 평면에서 x축을 기준으로 θ만큼 회전시키려면 다음과 같은 쿼터니언을 사용합니다.

q = cos(θ/2) + sin(θ/2) * j

이 쿼터니언은 회전각 θ/2를 축으로 하는 회전을 나타냅니다. 이 쿼터니언을 이용하여 벡터 v를 회전시키려면 다음과 같은 계산을 수행합니다.

v' = q * v * q*

여기서 q*는 쿼터니언 q의 켤레(quaternion conjugate)입니다. 이 계산을 수행하면, v'는 v를 θ만큼 회전시킨 벡터가 됩니다.

즉, 2차원 평면 상의 벡터를 회전시키기 위해서는 회전각을 축으로 하는 쿼터니언을 만들고, 이 쿼터니언을 이용하여 벡터를 회전시키면 됩니다.



3차원 공간에서의 회전을 쿼터니언으로 표현하기 위해서는 회전 중심 축과 회전 각도가 필요합니다. 회전 중심축은 벡터로 표현되며, 회전 각도는 라디안 단위로 표현됩니다.

예를 들어, x축을 중심으로 90도 회전시키려면 다음과 같은 쿼터니언을 사용합니다.

q = cos(θ/2) + sin(θ/2) * i

여기서 θ는 회전 각도이며, i는 x축의 단위 벡터입니다. 이 쿼터니언은 회전각 θ/2를 축으로 하는 회전을 나타냅니다. 이 쿼터니언을 이용하여 벡터 v를 회전시키려면 다음과 같은 계산을 수행합니다.

v' = q * v * q*

여기서 q*는 쿼터니언 q의 켤레(quaternion conjugate)입니다. 이 계산을 수행하면, v'는 v를 x축을 중심으로 90도 회전시킨 벡터가 됩니다.

마찬가지로 y축이나 z축을 중심으로 회전시키려면, 적절한 회전 중심축과 회전각을 가지는 쿼터니언을 사용하면 됩니다.

 

사실 이 쿼터니언은 다양한 축을 기준으로 회전이 가능하다는 것도 매우 중요하다. 

 

 

회전은 변환이고 이러한 변환은 트랜스레이션, 스케일링 등이 있지만 모두 4 * 4 행렬로 표현이되어있다. 

 

그런데 쿼터니언은 행렬이 아닌 4차원 벡터로 표현되어있다.  그래서 이를 행렬로 변환하는 별도의 공식이 있다. 

 

그래서 여러 개의 변환을 결합하고 싶으면 회전을 표현하는 쿼터니언을 행렬로 변경해주어야 한다. 

 

 

정리

 

오일러 변환은 물체의 임의의 방향을 주는 임의의 회전을 중축 중심의 회전의 조합으로 표현했다. 

 

임의의 방향을 주는 회전을 쿼터니언으로도 표현할 수 있고 쿼터니언은 slerp을 통해 잘 보간이 되고 이도 행렬로도 변환이 가능하여 여러 변환에 이용될 수 있다.

 

키프레임 입장에서 오일러로 보간을 하면 중간 프레임의 회전을 잘 표현하지 못하여 이를 쿼터니언으로

 

변경하면 slerp을 통해 나온 쿼터니언은 중간 프레임의 회전을 표현하고 이로써 더 부드러운 보간 및 여러 변환행렬과도 연산이 가능하다. 

 

 

반응형

'도전' 카테고리의 다른 글

Bounding Volumes  (0) 2023.05.13
3D Computer Graphics (8)  (0) 2023.04.29
3D Computer Graphics (6)  (0) 2023.04.15
3D Computer Graphics (5)  (0) 2023.04.15
기억장치와 PLD(2)  (0) 2023.04.04

댓글