vtkTransform에 대해서 작성한 내용이 이전에 있었으니, VTK 내부의 작동 방식을 보며 공부한 내용을 다시 정리하려 합니다.
1. vtkTransform 개요
vtkTransform 은 Homogeneous Transform 을 기반으로 이동, 회전, 크기 조절등과 같은 3차원 공간에서의 조작을 위한 기능을 제공위한 클래스이다. Homogeneous Transform 은 여러 행렬을 순차적으로 곱을 하여 최종 변형 값을 계산하게 되는데, 이를 위해서 vtkTransformConcatenation 클래스 객체로 내부에 리스트로 저장되어 있는 Transform 데이터를 설정에 따라서 행렬 곱을 수행하고 결과 값을 전달한다.
2. VTK Transform List 저장방식
모든 VTK에서의 Transform 클래스의 최상위 클래스는 vtkAbstractTransform이며, 이곳에는 연속 행렬을 계산하기 위해 데이터를 List에 저장합니다. 그리고 Transform에서 변환을 수행하는 함수를 호출할 때마다 해당 데이터를 List에 저장합니다.
이때 저장되는 순서는 PreMultiply와 PostMultiply 설정에 따라 결정됩니다.
PreMultiply는 새로운 matrix가 들어올 때 이를 List의 앞에 저장합니다.
PostMultiply는 새로운 matrix가 들어올 때 이를 List의 뒤에 저장합니다.
3. VTK Matrix Update
PreMultiply와 PostMultiply 설정에 따라 데이터를 list의 어느 위치로 저장하는지 달라집니다. 그러나 계산은 어떻게 이루어질까요?
VTK에서 내부적으로 Matrix를 업데이트하는 방식은 list의 마지막 행렬부터 순차적으로 곱합니다.
이는 PostMultiply 방식이라고 하며, 가장 끝단의 데이터부터 곱을 수행한다고 생각하면 됩니다.
4. PreMultiply vs PostMultiply 정리
앞에서 설정 방식에 따라 list에 저장하는 방식이 다르지만 계산하는 방식은 list의 마지막 행렬부터 순차적으로 계산하는 PostMultiply라고 했습니다. 이러한 것들이 결국에 어떻게 적용되는지 살펴보겠습니다.
우선, 행렬 계산은 곱의 순서에 따라 결과 값이 다릅니다. 비가환(Non-commutative) 특성을 갖기 때문에 행렬 곱을 어떤 순서로 계산하느냐가 중요합니다.
여기 A, B, C 세 개의 행렬이 있다고 가정해봅시다. ABC의 행렬 곱을 수행할 때 A→B→C 순서로 수행하면 좌표계 변환은 이전의 값이 적용되므로 상대적 좌표계로 변환됩니다. 즉, 여러 개의 행렬이 있을 때 앞선 행렬을 먼저 적용하는 방식입니다.
그리고 C→B→A 순서로 곱을 하게 되면, 반대로 절대적 좌표계로 변환됩니다. 다시 말하면, 여러 개의 행렬이 있을 때 마지막 행렬을 먼저 적용하는 방식입니다.
그렇다면, 이 내용을 위에서 알아본 PreMultiply와 PostMultiply에 대입해보겠습니다.
PreMultiply의 경우 새로운 Matrix를 list의 앞단에 저장하므로 계산은 마지막에 적용되고, PostMultiply의 경우는 처음 계산에 적용됩니다. 이는 기존의 Matrix가 먼저 적용되느냐 아니면 나중에 적용되느냐로 바꿔 말할 수 있는데, 이것이 좌표계 변환을 상대적 변환 또는 절대적 변환으로 결정짓게 됩니다.
PreMultiply : 상대적 좌표계 변환
PostMultiply : 절대적 좌표계 변환