리깅: 변환 행렬 — 이동·회전·스케일을 행렬 곱 하나로
선형 변환은 곧 행렬이다
리깅에서 관절 하나를 움직이면 그 아래 딸린 뼈, 스킨 정점 수천 개가 한꺼번에 따라 움직인다. 이 모든 이동을 좌표마다 따로 계산하지 않고 단 한 번의 곱셈으로 처리할 수 있는 이유가 변환 행렬이다. 출발점은 선형대수의 기본 정리 하나다. 선형 변환 가 차원 공간 의 벡터를 차원 공간 으로 보내는 함수라면, 반드시 어떤 행렬 가 존재해서 다음이 성립한다.
기호를 하나씩 풀면 이렇다. 는 성분이 개인 열벡터, 즉 변환하려는 점의 좌표다. 는 행이 개, 열이 개인 숫자표이고, 는 행렬과 벡터의 곱이다. 좌변의 는 "점 를 변환한 결과"라는 함수 표기인데, 우변은 그것이 단순한 산술 연산 하나로 계산된다고 말한다. 함수라는 추상적인 대상이 숫자표 하나로 완전히 요약되는 것이다. 이 를 의 변환 행렬이라 부른다.
행렬의 크기가 인 이유도 곱셈 규칙에서 나온다. 개의 성분을 가진 벡터에 곱하려면 열이 개여야 하고, 결과가 차원이려면 행이 개여야 한다. 2D 그래픽이라면 , 3D 리깅이라면 이 기본이다.
행렬의 열은 기저 벡터의 도착지
그렇다면 의 각 숫자는 무엇을 뜻할까. 표준 기저 벡터 , 을 에 곱해 보면 답이 나온다. 은 정확히 의 첫째 열이고, 는 둘째 열이다. 즉,
행렬의 열은 "각 축의 단위 벡터가 변환 후 어디로 가는가"를 그대로 적어 놓은 것이다. 임의의 점 는 기저의 조합이므로, 선형성에 의해 가 된다. 기저 두 개의 행선지만 알면 평면 전체의 행선지가 결정된다.
이 관점으로 회전과 스케일을 읽어 보자. 원점 기준 반시계 방향 회전은 을 로, 를 로 보내므로,
축 방향으로 , 배 늘리는 스케일은 각 기저를 자기 방향으로 늘리기만 하므로 대각 행렬이 된다.
여기서 , 로 두면 좌우 반전이 된다. 반사가 스케일 행렬의 특수한 경우인 이유다.
이동은 선형 변환이 아니다
문제는 이동(translation)이다. 모든 점을 만큼 옮기는 변환 는 선형 변환의 정의를 만족하지 못한다. 선형 변환은 반드시 원점을 원점으로 보내야 하는데(), 이동은 원점마저 로 옮겨 버리기 때문이다. 따라서 어떤 행렬로도 이동을 표현할 수 없고, 회전·스케일과 이동을 섞으려면 "행렬 곱 + 벡터 덧셈"이라는 두 종류의 연산을 계속 끌고 다녀야 한다. 변환을 수십 번 합성하는 리깅에서는 치명적인 불편이다.
동차좌표 — 차원을 하나 올려서 해결한다
해법은 놀랄 만큼 단순하다. 2D 점 에 성분 1을 덧붙여 3차원 벡터 로 취급하는 것이다. 이를 동차좌표(homogeneous coordinates)라 한다. 이제 행렬로 이동까지 곱셈 하나에 담을 수 있다.
결과의 셋째 성분이 여전히 1이므로, 계산 후 다시 2D 점으로 읽으면 된다. 좌상단 블록 는 회전·스케일·기울이기 같은 선형 부분을, 마지막 열의 는 이동을 담당한다. 덧붙인 성분 1이 이동 열과 곱해지면서 , 라는 덧셈이 곱셈 안으로 흡수되는 구조다. 이런 형태의 변환을 아핀 변환(affine transformation)이라 한다.

위 도식에서 파란 블록만 바꾸면 회전·스케일이, 빨간 열만 바꾸면 이동이 바뀐다. 두 성질이 한 행렬 안에서 자리를 나눠 갖는다.
합성 — 행렬 곱 하나로 묶기
동차좌표의 진짜 위력은 합성에서 나온다. 변환 를 먼저 적용하고 를 나중에 적용하는 것은 행렬 곱 를 한 번 적용하는 것과 같다.
순서에 주의해야 한다. 벡터가 오른쪽에서 곱해지므로 먼저 적용할 변환일수록 오른쪽에 놓인다. 그래픽에서 흔히 쓰는 "스케일 → 회전 → 이동" 순서는
로 적는다. 여기서 는 스케일, 은 회전, 는 이동 행렬이다. 행렬 곱은 교환법칙이 성립하지 않으므로() 순서를 바꾸면 결과가 달라진다. 회전 후 이동하는 것과 이동 후 회전하는 것은 실제로 다른 동작이니, 수식의 비가환성이 기하학적 직관과 정확히 맞아떨어지는 셈이다.
리깅의 관절 계층이 바로 이 구조다. 손가락 끝 정점의 월드 좌표는 손가락 관절, 손목, 팔꿈치, 어깨의 로컬 변환 행렬을 차례로 곱한 결과다.
관절이 아무리 많아도 행렬들을 미리 곱해 하나의 행렬(3D의 동차좌표)로 접어 둘 수 있고, 정점마다 할 일은 곱셈 한 번뿐이다. 어깨를 돌리면 팔 전체가 따라오는 것은, 어깨의 이 곱셈 사슬의 왼쪽에서 하위 관절 전부에 영향을 주기 때문이다.
마지막 행을 건드리면 — 원근 변환
지금까지 마지막 행은 로 고정했다. 이 행에 0이 아닌 값을 넣으면 어떻게 될까. 결과 벡터의 셋째 성분 가 더 이상 1이 아니게 되고, 2D 점으로 되돌리려면 를 로 나눠야 한다. 이 나눗셈이 점의 위치에 따라 다르게 작용하면서, 평행선이 한 점으로 모이는 원근 변환(perspective transformation)이 만들어진다. 아핀 변환이 평행선을 평행선으로 보존하는 것과 대비되는 지점이다.

3D 렌더링에서 카메라 투영 행렬이 정확히 이 원리로 동작한다. 결국 이동·회전·스케일·원근까지, 좌표를 다루는 거의 모든 연산이 "차원 하나 올린 뒤 행렬 곱"이라는 단일한 언어로 통일된다. 리깅 도구의 채널 박스에서 보는 숫자들 뒤에는 항상 이 행렬이 있다.
함께 읽기 — 이 글이 쓰는 기초 수학
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기