1. 어파인 공간과 기초 개념
그래픽스에서는 위치를 나타내는 점(Point) 과 방향과 크기를 나타내는 벡터(Vector) 를 명확히 구분합니다.
📌 벡터 연산
벡터는 방향과 크기를 가지는 물리적인 양이며, 보통 화살표로 표현합니다.

📌 점과 벡터 연산

- ❗
점 + 점
은 수학적으로 정의되지 않음: 위치 간의 덧셈은 의미 없음
2. 어파인 결합과 좌표계
📌 어파인 결합이란?
어파인 결합은 여러 점 또는 벡터를 선형 결합한 것으로, 계수의 합이 1인 경우 점을, 0인 경우 벡터를 생성합니다. 다음 수식처럼 표현할 수 있습니다:


예시 수식을 통해 자세히 보면:

📌 n차원 어파인 좌표계
어파인 공간에서는 기준점(origin) 과 기저 벡터(basis vectors) 로 좌표계를 정의합니다.
n차원 어파인 공간에서는:

3차원 예시에서는 다음과 같이 표현됩니다:

이 표현 방식은 점과 벡터의 본질적인 차이를 명확하게 해줍니다. (벡터는 원점과 무관하지만, 점은 원점 기준으로 위치를 정함)
3. 동차(Homogeneous) 좌표와 그 필요성
📌 동차 좌표란?

📌 왜 동차 좌표를 사용하는가?
일반적인 선형 변환 행렬은 이동(translation)을 포함할 수 없습니다. 그러나 동차 좌표를 사용하면 이동까지도 행렬 곱으로 표현할 수 있습니다.
이 방식은 OpenGL이나 행렬 기반 그래픽 시스템에서 필수적입니다. 예:

❗ 점 + 점이 정의되지 않는 이유 (동차 좌표 관점)
동차 좌표에서 점은 ( (x, y, 1) ), 벡터는 ( (v_x, v_y, 0) )입니다. 점 + 점을 하면 마지막 좌표 값이 ( 1 + 1 = 2 )가 되어 점인지 벡터인지 구분할 수 없게 되어 수학적으로 무의미합니다. 반면 점 - 점 = 벡터는 ( 1 - 1 = 0 )이 되어 정상적인 벡터로 해석됩니다.
4. 어파인 변환과 행렬 표현
📌 어파인 변환이란?
어파인 변환은 직선성(linearity)을 유지하는 변환으로, 벡터의 평행성, 직선의 보존, 비율 유지 등의 특성을 가집니다. 일반적으로:
- 이동 (Translation)
- 회전 (Rotation)
- 스케일 (Scaling)
- 밀림 (Shearing)
을 포함합니다.
📌 어파인 변환의 동차 행렬 표현
모든 어파인 변환은 동차 좌표를 사용해 3×3 행렬로 표현할 수 있습니다 (2D 기준).
예시 (이동 변환):

이러한 형식은 변환들을 쉽게 행렬 곱으로 합성할 수 있게 해줍니다.
5. 기본 어파인 변환 종류

🔹 이동 (Translation)
🔹 2D의 경우
동차 좌표계를 사용하여 이동 변환을 행렬로 나타내면:

🔹 3D의 경우

이 행렬의 오른쪽 마지막 열 ( (t_x, t_y, [t_z]) ) 성분이 바로 이동량입니다.
✍️ 실제로 계산해보기
🌟 점에 대한 이동 변환

➡️ 점은 정확히 원하는 만큼 이동함을 확인할 수 있어요!
🌟 벡터에 대한 이동 변환

➡️ 벡터는 이동 변환의 영향을 전혀 받지 않음!
이유는 마지막 성분이 0이기 때문에, 행렬 곱에서 ( t_x, t_y ) 가 곱해질 일이 없기 때문이에요.
🔄 이동 변환의 역행렬
역행렬은 다음과 같이 간단합니다:

👉 이유: 원래 위치로 되돌리려면, 이동했던 거리만큼 반대로 이동하면 되기 때문이에요!
🧮 행렬 곱으로 확인해보기
직접 곱해보면:

➡️ 단위 행렬 ( I ) 이 되므로, 역행렬이 맞는 걸 알 수 있어요!
🔹 회전 (Rotation)
회전 변환은 어떤 기준점(보통은 원점)을 중심으로 객체(점, 벡터)를 일정 각도만큼 회전시키는 변환입니다.
이 변환은:
- 길이와 각도 유지
- 직선성과 평행성 유지
- 벡터와 점 모두 회전 대상이 될 수 있음
✅ 2. 2D 회전 변환 (z축 기준 회전)
🔹 회전 행렬

이 행렬은 원점을 기준으로 θ만큼 반시계 방향으로 회전합니다.
🔹 어떤 성분이 회전을 만드는가?
- 회전은 상위 2×2 블록의 cosθ, (sinθ 성분이 담당합니다.
- 이들은 x, y 좌표를 서로 섞어 바꾸는 방식으로 회전을 만들어냅니다.
🔹 실제 적용 예시

➡️ 반시계 방향으로 회전한 새로운 위치가 됩니다.
✅ 3. 3D 회전 변환 (원점 기준)
3D에서는 회전 축이 3가지로 나뉘고, 각 축에 대한 회전 행렬이 다릅니다.
🔹 x축 기준 회전 (y–z 평면에서 회전)

➡️ y와 z 좌표만 변하고, x는 그대로 유지됩니다.
🔹 y축 기준 회전 (x–z 평면에서 회전)

➡️ x와 z 좌표가 섞이고, y는 그대로 유지됩니다.
💥 주의할 점:
- x축 회전에서는 -sinθ가 아래에 나오지만
- y축 회전에서는 -sinθ가 왼쪽 위로 이동합니다.
- 👉 부호 위치가 달라지므로 주의!
🔹 z축 기준 회전 (x–y 평면에서 회전)

➡️ x와 y 좌표가 바뀌고, z는 고정됩니다.
→ 2D 회전 행렬과 구조가 거의 동일해요.
✅ 4. 왜 부호가 다를까? — 오른손 법칙(Right-Hand Rule)
회전 방향은 단순히 수학적 convention이 아니라, 오른손 법칙에 따라 결정됩니다.
🖐 오른손 법칙이란?
- 오른손 엄지를 회전축 방향으로 뻗습니다.
- 나머지 손가락을 구부리는 방향이 양의 회전 방향입니다.
예시:
- 엄지를 z축 위로 → x–y 평면에서 반시계 방향 회전
- 엄지를 y축 앞쪽으로 → x–z 평면에서 z→x 방향으로 회전
- 그래서 y축 기준 회전은 -sinθ와 sinθ의 위치가 바뀜 → 부호 위치 달라짐
🎯 임의 축에 대한 회전 변환이란?
우리는 지금까지 x축, y축, z축을 중심으로 도는 회전만 배웠지만,
현실에서는 물체가 임의의 방향(예: 대각선 방향)으로도 회전할 수 있어야 하죠.
그래서 어떤 단위벡터 ( \vec{u} = (u_x, u_y, u_z) ) 를 축으로 해서,
각도 θ만큼 회전하는 행렬이 필요합니다.
✅ 수식 정리
회전 축:

회전 각도:
θ (radian)
📌 임의 축 회전 행렬 공식:

이 표현은 Rodrigues의 회전 공식이라고도 불러요.
🧠 의미 분석
이 공식은 3가지 성분의 합입니다:
항 | 의미 | 역할 |
---|---|---|
I * cosθ | 항등행렬 × 회전량 | 원래 방향 유지 |
K * sinθ | 반대방향의 회전 기여 | 회전의 축에 수직인 성분 회전 |
(1 - cosθ)(vec{u} ⊗ vec{u})) | 외적이 아닌 내적의 기여 | 축 방향으로 남는 부분 보정 |
🔷 1. 직교 행렬(Orthogonal Matrix)이란?
📌 정의
행렬 ( R )이 직교 행렬이라면 다음을 만족합니다: R^{-1} = R^T
즉, 역행렬이 전치(transpose) 와 같아요!
📌 직교 행렬의 특징
- 각 행/열은 단위 벡터 (길이 = 1)
→ 예: ( cos^2(θ) + sin^2(θ) = 1 ) - 행/열 벡터끼리는 서로 직교 (내적 = 0)
→ 예: ( cosθsinθ - sinθcosθ = 0 ) - 직교 행렬을 곱하면 크기와 각도가 보존됨
→ 물체를 회전해도 형태가 유지됨! - 행렬식 = ±1
- +1: 회전 행렬
- −1: 반사 행렬
🔷 2. 회전 행렬은 직교 행렬이다
✅ 2D 회전 행렬 예시

이 행렬은 직교 행렬 조건을 만족합니다:
- 각 열 벡터는 단위 길이
- 서로 직교
- 전치가 역행렬
🔷 3. 회전 행렬의 역행렬
✅ 핵심 공식

즉:
- 역회전은 θ의 부호만 바꾸면 됨
- 전치 행렬을 구하면 곧 역행렬
✅ 2D 회전 역행렬

→ 전치 행렬과 같은 결과!
✅ 3D 회전 역행렬
축별로 회전 역행렬을 보면:

→ 모두 전치 행렬과 같다는 것을 확인할 수 있어요.
✨ 요약
항목 | 내용 |
---|---|
직교 행렬 | 역행렬 = 전치행렬 |
회전 행렬 | 항상 직교 행렬이다 |
역회전 | 부호만 반대로 하면 됨 |
🔹 스케일 (Scaling)
스케일 변환은 객체의 크기를 늘리거나 줄이는 변환이에요.
x, y (또는 z) 방향으로 각각 다른 배율로 확대하거나 축소할 수 있습니다.
- 크기를 2배 키우는 건 ( s = 2 )
- 절반으로 줄이는 건 ( s = 0.5 )
✅ 2. 2D 스케일 변환
🔹 스케일 행렬

여기서:
- ( s_x ): x축 방향 배율
- ( s_y ): y축 방향 배율
🔹 점/벡터에 적용
점 p = (x, y) 또는 벡터 vec{v} = (v_x, v_y)를 동차좌표로 나타내고 곱하면:

➡️ 점이든 벡터든, 해당 축 방향으로 늘어나거나 줄어듭니다.
✅ 3. 3D 스케일 변환
🔹 4×4 동차 좌표 행렬

- ( s_x ), ( s_y ), ( s_z ): 각각 x, y, z 축 방향의 배율
✅ 4. 역 스케일 변환
스케일링의 역변환은 간단하게 1/s 를 곱하는 형태입니다.

📌 주의할 점
- 0으로 스케일하면?
→ 해당 방향으로 완전히 납작해짐(축소) → 되돌릴 수 없음 → 역행렬 존재하지 않음 - 스케일은 크기만 바꾸므로, 방향이나 각도는 보존되지 않음
✨ 정리
항목 | 설명 |
---|---|
스케일 행렬 | 대각 성분에 각각 축 방향 배율 |
점과 벡터 | 모두 스케일의 영향을 받음 |
역변환 | 배율의 역수 곱 |
🔹 밀림 (Shearing)
한 축을 기준으로 다른 축이 기울어지는 변환입니다.
밀림 변환은 물체를 특정 축을 기준으로 기울이는 변환입니다.
- 마치 상자가 비스듬히 눕는 듯한 효과를 줘요.
- 모양은 변하지만, 각 꼭짓점 간의 평행 관계는 유지됩니다.
✅ 2. 2D 밀림 변환
🔹 밀림 행렬

🔹 점에 적용

🔹 예시 해석

- 왼쪽 행렬: ( a = 2 ) → y좌표가 클수록 x방향으로 많이 밀림
- 오른쪽 행렬: ( b = 2 ) → x좌표가 클수록 y방향으로 많이 밀림
👉 노란색 삼각형이 각각 비스듬히 기울어진 평행사변형으로 변형됨!
✅ 3. 3D 밀림 변환
3D에서는 축이 3개(x, y, z)이므로, 총 6가지 방향으로 밀림이 가능합니다.
🔹 일반적인 3D 밀림 행렬

항목 | 의미 |
---|---|
( sh_{xy} ) | y좌표에 따라 x방향으로 밀림 |
( sh_{xz} ) | z좌표에 따라 x방향으로 밀림 |
( sh_{yx} ) | x좌표에 따라 y방향으로 밀림 |
( sh_{yz} ) | z좌표에 따라 y방향으로 밀림 |
( sh_{zx} ) | x좌표에 따라 z방향으로 밀림 |
( sh_{zy} ) | y좌표에 따라 z방향으로 밀림 |
🔹 예시: z축이 0이고 2D처럼 생각할 수 있는 경우
예:

- y좌표가 클수록 x축 방향으로 더 많이 이동 → 비스듬히 누운 효과
✅ 4. 밀림 변환과 다른 변환과의 차이점
변환 | 크기 변화 | 각도 유지 | 평행성 유지 |
---|---|---|---|
스케일 | 있음 | 유지 안 됨 | 유지됨 |
회전 | 없음 | 유지됨 | 유지됨 |
밀림 | 없음 | 유지 안 됨 | 유지됨 ✅ |
👉 밀림은 평행 구조는 유지되지만, 각도와 모양은 변형됩니다.
✨ 정리
항목 | 내용 |
---|---|
정의 | 기준축에 따라 물체가 기울어지는 변환 |
2D | x, y축 밀림 (a, b 계수) |
3D | xy, xz, yx, yz, zx, zy 방향 총 6종 |
특징 | 길이·각도는 변하지만, 직선성과 평행성은 유지 |
응용 | 기울어진 텍스트, 아이소메트릭 뷰 연출 등 |
'프로그래밍 > 컴퓨터그래픽스' 카테고리의 다른 글
합성 변환과 해석 (0) | 2025.04.05 |
---|---|
어파인 변환의 해석 (0) | 2025.04.05 |
OpenGL 기본 출력 객체 속성 정리 (0) | 2025.04.04 |
점, 선, 다각형을 이용한 다양한 도형 그리기 (0) | 2025.04.04 |
Hello OpenGL 예제 분석: Freeglut 기반 기초 코드 설명 (0) | 2025.04.04 |