Artoke

리깅: 변환 행렬 — 이동·회전·스케일을 행렬 곱 하나로

선형 변환은 곧 행렬이다

리깅에서 관절 하나를 움직이면 그 아래 딸린 뼈, 스킨 정점 수천 개가 한꺼번에 따라 움직인다. 이 모든 이동을 좌표마다 따로 계산하지 않고 단 한 번의 곱셈으로 처리할 수 있는 이유가 변환 행렬이다. 출발점은 선형대수의 기본 정리 하나다. 선형 변환 차원 공간 의 벡터를 차원 공간 으로 보내는 함수라면, 반드시 어떤 행렬 가 존재해서 다음이 성립한다.

기호를 하나씩 풀면 이렇다. 는 성분이 개인 열벡터, 즉 변환하려는 점의 좌표다. 는 행이 개, 열이 개인 숫자표이고, 는 행렬과 벡터의 곱이다. 좌변의 는 "점 를 변환한 결과"라는 함수 표기인데, 우변은 그것이 단순한 산술 연산 하나로 계산된다고 말한다. 함수라는 추상적인 대상이 숫자표 하나로 완전히 요약되는 것이다. 이 변환 행렬이라 부른다.

행렬의 크기가 인 이유도 곱셈 규칙에서 나온다. 개의 성분을 가진 벡터에 곱하려면 열이 개여야 하고, 결과가 차원이려면 행이 개여야 한다. 2D 그래픽이라면 , 3D 리깅이라면 이 기본이다.

행렬의 열은 기저 벡터의 도착지

그렇다면 의 각 숫자는 무엇을 뜻할까. 표준 기저 벡터 , 에 곱해 보면 답이 나온다. 은 정확히 의 첫째 열이고, 는 둘째 열이다. 즉,

행렬의 열은 "각 축의 단위 벡터가 변환 후 어디로 가는가"를 그대로 적어 놓은 것이다. 임의의 점 는 기저의 조합이므로, 선형성에 의해 가 된다. 기저 두 개의 행선지만 알면 평면 전체의 행선지가 결정된다.

이 관점으로 회전과 스케일을 읽어 보자. 원점 기준 반시계 방향 회전은 로, 로 보내므로,

축 방향으로 , 배 늘리는 스케일은 각 기저를 자기 방향으로 늘리기만 하므로 대각 행렬이 된다.

여기서 , 로 두면 좌우 반전이 된다. 반사가 스케일 행렬의 특수한 경우인 이유다.

이동은 선형 변환이 아니다

문제는 이동(translation)이다. 모든 점을 만큼 옮기는 변환 는 선형 변환의 정의를 만족하지 못한다. 선형 변환은 반드시 원점을 원점으로 보내야 하는데(), 이동은 원점마저 로 옮겨 버리기 때문이다. 따라서 어떤 행렬로도 이동을 표현할 수 없고, 회전·스케일과 이동을 섞으려면 "행렬 곱 + 벡터 덧셈"이라는 두 종류의 연산을 계속 끌고 다녀야 한다. 변환을 수십 번 합성하는 리깅에서는 치명적인 불편이다.

동차좌표 — 차원을 하나 올려서 해결한다

해법은 놀랄 만큼 단순하다. 2D 점 에 성분 1을 덧붙여 3차원 벡터 로 취급하는 것이다. 이를 동차좌표(homogeneous coordinates)라 한다. 이제 행렬로 이동까지 곱셈 하나에 담을 수 있다.

결과의 셋째 성분이 여전히 1이므로, 계산 후 다시 2D 점으로 읽으면 된다. 좌상단 블록 는 회전·스케일·기울이기 같은 선형 부분을, 마지막 열의 는 이동을 담당한다. 덧붙인 성분 1이 이동 열과 곱해지면서 , 라는 덧셈이 곱셈 안으로 흡수되는 구조다. 이런 형태의 변환을 아핀 변환(affine transformation)이라 한다.

단위 정사각형에 여러 2D 아핀 변환 행렬을 적용했을 때의 효과
Effect of applying various 2D affine transformation matrices on a unit square. Note that the reflection matrices are special cases of the scaling matrix. · 출처: 변환 행렬 — 이동·회전·스케일을 행렬 곱 하나로
리깅: 변환 행렬 — 이동·회전·스케일을 행렬 곱 하나로 도식

위 도식에서 파란 블록만 바꾸면 회전·스케일이, 빨간 열만 바꾸면 이동이 바뀐다. 두 성질이 한 행렬 안에서 자리를 나눠 갖는다.

합성 — 행렬 곱 하나로 묶기

동차좌표의 진짜 위력은 합성에서 나온다. 변환 를 먼저 적용하고 를 나중에 적용하는 것은 행렬 곱 를 한 번 적용하는 것과 같다.

순서에 주의해야 한다. 벡터가 오른쪽에서 곱해지므로 먼저 적용할 변환일수록 오른쪽에 놓인다. 그래픽에서 흔히 쓰는 "스케일 → 회전 → 이동" 순서는

로 적는다. 여기서 는 스케일, 은 회전, 는 이동 행렬이다. 행렬 곱은 교환법칙이 성립하지 않으므로() 순서를 바꾸면 결과가 달라진다. 회전 후 이동하는 것과 이동 후 회전하는 것은 실제로 다른 동작이니, 수식의 비가환성이 기하학적 직관과 정확히 맞아떨어지는 셈이다.

리깅의 관절 계층이 바로 이 구조다. 손가락 끝 정점의 월드 좌표는 손가락 관절, 손목, 팔꿈치, 어깨의 로컬 변환 행렬을 차례로 곱한 결과다.

관절이 아무리 많아도 행렬들을 미리 곱해 하나의 행렬(3D의 동차좌표)로 접어 둘 수 있고, 정점마다 할 일은 곱셈 한 번뿐이다. 어깨를 돌리면 팔 전체가 따라오는 것은, 어깨의 이 곱셈 사슬의 왼쪽에서 하위 관절 전부에 영향을 주기 때문이다.

마지막 행을 건드리면 — 원근 변환

지금까지 마지막 행은 로 고정했다. 이 행에 0이 아닌 값을 넣으면 어떻게 될까. 결과 벡터의 셋째 성분 가 더 이상 1이 아니게 되고, 2D 점으로 되돌리려면 로 나눠야 한다. 이 나눗셈이 점의 위치에 따라 다르게 작용하면서, 평행선이 한 점으로 모이는 원근 변환(perspective transformation)이 만들어진다. 아핀 변환이 평행선을 평행선으로 보존하는 것과 대비되는 지점이다.

단위 정사각형에 아핀 변환과 원근 변환을 적용했을 때의 비교
Comparison of the effects of applying 2D affine and perspective transformation matrices on a unit square. · 출처: 변환 행렬 — 이동·회전·스케일을 행렬 곱 하나로

3D 렌더링에서 카메라 투영 행렬이 정확히 이 원리로 동작한다. 결국 이동·회전·스케일·원근까지, 좌표를 다루는 거의 모든 연산이 "차원 하나 올린 뒤 행렬 곱"이라는 단일한 언어로 통일된다. 리깅 도구의 채널 박스에서 보는 숫자들 뒤에는 항상 이 행렬이 있다.

함께 읽기 — 이 글이 쓰는 기초 수학

출처

광고

리깅 파이프라인 자동화 도구

반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.

리깅 도구 보기