Skip to content

Latest commit

 

History

History
122 lines (71 loc) · 5.48 KB

README.md

File metadata and controls

122 lines (71 loc) · 5.48 KB

Matrix

Model Transformation (모델 변환)

Model Transform 물체를 가져다 놓는 것 (모양변화는 없다고 가정)

크기와 위치, 회전만 담당

scaling -> rotation -> translation 순으로 적용

M = Translate(0,0,0) * RotateY(30) * Scale(1, 1.5, 1);

이 행렬은 다음과 같은 변환을 의미합니다:

객체를 x축 방향으로 1, y축 방향으로 1.5배, z축 방향으로 1배 스케일링 y축을 중심으로 30도 회전 원점(0, 0, 0)으로 이동

실제 쉐이더 코드에선 뒤에서부터 계산된다. (CTM에 따라 계산 순서가 중요함) 또한, 계산을 줄이는 것이 효율적이기 때문에 법칙을 잘 이용해야 한다. (결합, 분배 법칙 등등)

View Transformation (뷰 변환)

View Transformation은 카메라의 위치와 방향을 설정하여, 월드 좌표계의 객체들을 카메라 좌표계로 변환하는 과정입니다. 이는 일반적으로 뷰 행렬(View Matrix)을 사용하여 수행됩니다. 뷰 행렬은 카메라의 위치, 타겟 위치, 업 벡터를 통해 정의됩니다.

LookAt 함수사용

Projection Transformation (투영 변환)

Projection Transformation은 3D 공간의 객체를 2D 화면에 적절히 투영하는 과정입니다. 이를 통해 3D 객체의 깊이와 원근감을 표현할 수 있습니다. 주로 두 가지 방식의 투영이 사용됩니다: **직교 투영(Orthographic Projection)**과 **원근 투영(Perspective Projection)**입니다.

Rotation Matrix

임의의 3차원 회전

3차원 공간에서 임의의 회전축 u와 회전 각도를 이용해 벡터를 회전시키는 방법입니다. 회전축을 적절히 변환하여 x, y, z 축으로 맞추면 원하는 방향으로 회전시킬 수 있습니다.

회전 과정

회전축을 x, y, z 축 중 하나와 일치하도록 회전합니다. 해당 축을 기준으로 회전합니다. 원래 회전축으로 되돌립니다. 이 과정을 통해, 임의의 회전축을 기준으로 3차원 벡터를 회전할 수 있습니다.

자유도

2차원 이동: 자유도 2 (x, y 방향) 3차원 이동: 자유도 3 (x, y, z 방향) 3차원 회전: 자유도 3 (3축 회전)

오일러 앵글 (Euler Angle)

회전을 나타내기 위해 세 개의 값 (피치, 요, 롤)을 사용합니다. 이 방식은 직관적이며, 비행기 등의 회전을 표현할 때 사용됩니다.

피치 (Pitch): x축을 중심으로 회전 요 (Yaw): y축을 중심으로 회전 롤 (Roll): z축을 중심으로 회전

예시: 비행기 회전

피치: 비행기의 기수를 위아래로 움직이는 회전 요: 비행기의 기수를 좌우로 움직이는 회전 롤링: 비행기의 몸체를 좌우로 기울이는 회전

짐벌락 (Gimbal Lock)

짐벌락은 3차원 회전을 3개의 축으로 나눠 회전할 때 발생할 수 있는 문제입니다. 두 개의 회전축이 일치하게 되면 회전의 자유도가 감소하여 원하는 회전을 수행할 수 없게 됩니다.

원인: 두 개의 회전축이 일치하게 되어 회전의 자유도가 2로 줄어듭니다. 결과: 원하는 회전을 수행할 수 없게 됩니다.

해결 방법: 쿼터니언 쿼터니언을 사용하여 짐벌락 문제를 해결할 수 있습니다. 쿼터니언은 4차원 벡터를 사용하여 3차원 회전을 표현하는 방법입니다.

쿼터니언 (Quaternion)

쿼터니언은 4차원 벡터로, 3차원 회전을 효율적으로 표현할 수 있습니다. 이를 통해 짐벌락 문제를 해결하고, 회전 연산을 더 안정적이고 효율적으로 수행할 수 있습니다. 복소수와 유사한 개념으로, 회전을 표현하는 단위 벡터와 각도로 구성됩니다.

복소수의 개념

복소수는 실수부와 허수부로 구성되는 수입니다. 복소수는 i^2 = -1을 만족하는 수입니다.

이 개념을 이해하기 위해선 수의 개념보단 액션의 개념으로 이해하는 것이 좋습니다. 즉 i는 90도 회전을 의미하며, i^2는 180도 회전을 의미합니다.

2차원 좌표공간에서 복소수를 사용하면 회전을 표현할 수 있습니다. 이를 통해 회전을 표현하고, 회전 연산을 수행할 수 있습니다.

라디안과 디그리

라디안 (Radian): 호의 길이가 반지름과 같은 원의 호의 길이를 갖는 각도 단위입니다. 2π 라디안은 360도와 같습니다. 디그리 (Degree): 360도를 1로 하는 각도 단위입니다. 1도는 π/180 라디안과 같습니다.

해당 값을 외우지 말고, 두 각도 단위 간 변환 공식을 이용하여 필요할 때 계산해야 한다. 두 단위 간의 상관관계를 이해하고 방정식을 만들어 계산하는 것이 중요하다.

//360도의 관계로

$$ 2\pi \text{ radian} = 360 \text{ degree} $$ $$ \pi \text{ radian} = 180 \text{ degree} $$ $$ \frac{\pi}{2} \text{ radian} = 90 \text{ degree} $$

// 1라디안으로

$$ 1 \text{ radian} = \frac{180}{\pi} \text{ degree} $$

// 각도를 라디안으로 변환

$$ \text{degree} \times \frac{\pi}{180} = \text{radian} $$

근사값으론 57.3 따라서 360도는 근사값으로 6.28 라디안이다.

2 * 3.14 = 6.28

추가적으로 오일러 공식을 2차원 좌표계로 확장하여 복소수를 사용하면 회전을 표현할 수 있다.

image