프로그래밍/컴퓨터그래픽스

합성 변환과 해석

studylida 2025. 4. 5. 04:34

🔄 합성 변환: 고정점을 기준으로 회전하기

지금까지 우리는 주로 원점(0, 0)을 기준으로 한 회전만 다뤄왔습니다.
하지만 실제 그래픽스에서는 임의의 점, 예를 들어 (1, 1) 같은 점을 기준으로 물체를 회전시켜야 할 일이 자주 발생합니다.

이때 단순히 회전 행렬만 사용하는 것으로는 원하는 결과를 얻을 수 없습니다. 왜 그런지, 그리고 어떻게 해결하는지 차근차근 예시와 함께 살펴보겠습니다.


❌ 첫 번째 시도: 그냥 회전만 하기 (잘못된 결과)

아래는 점 (1, 1)을 기준으로 도형(삼각형)을 90도 회전시키고 싶은 상황입니다.

이때 단순히 위와 같은 회전 행렬을 적용했다면:

이 행렬은 원점(0, 0) 을 기준으로 90도 회전시키는 행렬입니다. 따라서 삼각형은 회전은 하지만, 원점 기준으로 도는 것이기 때문에 회전 중심인 (1, 1)에서 벗어나버리게 됩니다.

👉 결국, 도형의 위치는 의도하지 않은 곳으로 이동하게 되며, 회전 효과는 왜곡됩니다.
(1, 1)은 여전히 제자리인데, 삼각형은 뚝 떨어진 곳에 있게 되는 거죠.


✅ 두 번째 시도: 합성 변환으로 정확한 회전 구현하기

이번에는 정말로 (1, 1) 을 기준으로 회전시키고자 합니다.
이를 위해서는 세 단계의 변환을 합성해야 합니다.

![두 번째 슬라이드]

  1. 도형을 원점으로 이동
    → (1, 1)을 원점으로 옮기기 위해 (−1, −1) 만큼 이동

[ T(-1, -1) = \begin{bmatrix} 1 & 0 & -1 \ 0 & 1 & -1 \ 0 & 0 & 1 \end{bmatrix} ]

  1. 원점 기준으로 회전
    → 일반적인 90도 회전 행렬 사용

[ R(90^\circ) = \begin{bmatrix} 0 & -1 & 0 \ 1 & 0 & 0 \ 0 & 0 & 1 \end{bmatrix} ]

  1. 도형을 다시 원래 위치로 이동
    (1, 1)만큼 이동시켜 원래 중심으로 복귀

[ T(1, 1) = \begin{bmatrix} 1 & 0 & 1 \ 0 & 1 & 1 \ 0 & 0 & 1 \end{bmatrix} ]


🔁 세 행렬을 합성하면:

[ T(1,1) \cdot R(90^\circ) \cdot T(-1, -1) ]

이렇게 합성된 하나의 행렬을 이용하면 도형은 정확히 (1, 1) 을 중심으로 회전하게 됩니다.


💡 시각적으로 요약하면:

단계 설명 도형 변화
(1, 1)을 원점으로 이동 도형이 왼쪽 아래로 밀림
원점 기준 회전 도형이 제자리에서 회전
다시 (1, 1)으로 복귀 회전한 모양 그대로 제자리로 돌아옴 ✅

🔄 합성 변환: 고정점을 기준으로 한 스케일(확대/축소)

앞에서 배운 기본 스케일 행렬은 모두 원점(0, 0) 을 기준으로 확대나 축소가 이루어졌습니다. 하지만 실제 그래픽스에서는 어떤 도형을 특정한 위치—예를 들어 (1, 1)—를 중심으로 스케일해야 하는 경우가 자주 있습니다.

하지만!
단순히 스케일 행렬만 적용해서는 절대 원하는 결과를 얻을 수 없습니다.

아래 예시를 통해 왜 그런지, 어떻게 해결해야 하는지 단계적으로 살펴보겠습니다.


❌ 첫 번째 시도: 단순 스케일 적용 (실패)

위 그림에서는 삼각형을 점 (1, 1)을 기준으로 스케일하고 싶었지만,
기본 스케일 행렬

[ S = \begin{bmatrix} 2 & 0 & 0 \ 0 & 3 & 0 \ 0 & 0 & 1 \end{bmatrix} ]

만 적용했습니다. 이 행렬은 무조건 원점을 기준으로 도형을 x축 방향으로 2배, y축 방향으로 3배 확장합니다.

그래서 도형은 원점에서 멀어지며 기준점인 (1, 1) 주변에서 스케일되지 않고, 도형의 위치가 어긋난 결과가 발생합니다. 😢


✅ 두 번째 시도: 합성 변환으로 해결 (성공)

정확히 (1, 1) 을 중심으로 스케일하려면, 세 단계를 거쳐야 합니다:

  1. 도형을 (1, 1) → 원점으로 이동
    • 이동 행렬 ( T(-1, -1) )
  2. 원점 기준으로 스케일 적용
    • 스케일 행렬 ( S(2, 3) )
  3. 다시 (1, 1) 위치로 되돌리기
    • 이동 행렬 ( T(1, 1) )

이 세 가지 변환을 합성하면 다음과 같은 행렬 곱이 됩니다:

[T(1,1) \cdot S(2,3) \cdot T(-1,-1)] [ \begin{bmatrix}1 & 0 & 1 \0 & 1 & 1 \0 & 0 & 1\end{bmatrix}\cdot\begin{bmatrix}2 & 0 & 0 \0 & 3 & 0 \0 & 0 & 1\end{bmatrix}\cdot\begin{bmatrix}1 & 0 & -1 \0 & 1 & -1 \0 & 0 & 1\end{bmatrix}]

이 합성 행렬을 도형에 적용하면, 도형은 정확히 (1, 1) 을 중심으로 x축 방향으로 2배, y축 방향으로 3배 스케일됩니다. 🎉


📈 시각적 정리

단계 설명 도형의 위치 변화
(1, 1)을 원점으로 옮김 도형이 왼쪽 아래로 이동
원점 기준 스케일 도형이 정확히 스케일됨
(1, 1) 위치로 복귀 도형이 원래 자리에서 확대된 상태로 복귀 ✅

🔁 합성 변환의 해석: 전역 vs 지역 좌표계의 차이

🎯 주어진 변환

[ X = T(2, 0) \cdot R(-90^\circ) ]

이건 두 가지 변환을 합친 합성 행렬입니다:

  1. 먼저 회전 R(-90°)  : -90도 회전 (시계 방향)
  2. 이후 이동 T(2, 0): 오른쪽으로 2만큼 이동

[ p' = T(2, 0) \cdot R(-90^\circ) \cdot p ]


📌 해석 1: 전역 좌표계 기준 (객체 변환 해석)

순서

  • 먼저 점 ( p )에 회전 행렬을 적용: R(-90°)p
  • 그 결과에 다시 이동 행렬을 적용: T(2, 0)R(-90°)p

의미

  • 좌표계는 그대로 고정되어 있고,
  • 도형(객체) 자체가 움직이고 있는 것처럼 해석됩니다.
  • 실제로는 먼저 도형이 회전하고, 그다음 위치를 옮긴다고 보면 됩니다.

결과

  • 도형이 회전한 후 오른쪽으로 이동된 새로운 위치에 나타납니다.
  • 그림에서도 파란 도형이 회전 후 붉은 도형으로 바뀌는 것을 확인할 수 있습니다.

📌 해석 2: 지역 좌표계 기준 (좌표계 변환 해석)

이번에는 같은 수식 X = T(2, 0)R(-90°)를
“좌표계 자체를 변형한다”는 관점으로 봅니다.

순서

  1. 기준 좌표계를 먼저 이동: T(2, 0)
  2. 그 좌표계를 다시 회전: R(-90°)
  3. 새로운 좌표계 위에 점 p를 배치

 

수식은 같지만,
이번에는 p는 새로운 좌표계에서의 좌표로 해석되고,
그 좌표계를 다시 전역 좌표계로 변환하는 과정이 되는 겁니다.

의미

  • 도형은 가만히 있고,
  • 좌표계가 움직이는 것처럼 해석합니다.
  • 좌표계가 회전 → 이동한 상태에서, 그 좌표계 기준으로 p를 배치함.

🧠 둘의 차이 정리

구분 전역 좌표계 해석 지역 좌표계 해석
기준 좌표계는 고정, 도형이 움직임 도형은 고정, 좌표계가 움직임
해석 방식 도형에 연달아 변환을 적용 좌표계를 변형한 후 도형을 배치
적용 대상 p는 기존 좌표계 기준 좌표 p는 새 좌표계 기준 좌표
해석 결과 도형이 회전 + 이동됨 좌표계 회전 + 이동 후 도형 위치 계산

✅ 왜 중요한가요?

OpenGL, 로봇공학, 물리 시뮬레이션 등에서는
이 두 해석 중 어느 쪽을 쓰느냐에 따라 수식의 순서와 의미가 완전히 달라집니다.

예를 들어:

  • 전역 좌표계 해석은 도형을 “움직인다”고 생각하는 경우 (예: 실제 모델 이동)
  • 지역 좌표계 해석은 도형이 “어디에 위치할지”를 기준 좌표계로 바꾸는 경우 (예: 카메라 좌표계 변환)