728x90
1. 개요
vtkTransform 의 PreMultiply와 PostMultiply 방식을 비교한다.
2. PreMultiply
Matrix 곱을 수행할 때 기존의 matrix를 pre 즉 앞단에 놓고 계산을 한다. 함수의 명칭때문에 헷갈리지만 명칭의 기준이 기존 matrix 값을 의미한다.
Matrix = PrevMatrix * NewMatrix
로 표현할 수 있다.
이럴 경우 matrix의 좌표계는 상대 좌표계로 계산된다.
3. PostMultiply
PreMultipy 와 반대로 기존 matrix 값을 post 뒷단에 놓고 계산 한다.
Matrix = NewMatrix * PrevMatrix
로 표현할 수 있다.
이럴 경우 matrix의 좌표계는 월드 좌표계로 계산된다.
3. 구현
vtkAnnotationCubeActor를 만들고 각각의 Matrix multiply 방식에 따라 Actor가 어떻게 이동하는지 비교한다.
public void TestMultiplyAnalysis()
{
var cubePreMultiply = CreateAnnotatedCubeActor();
cubePreMultiply.GetCubeProperty().SetColor(VtkColorUtils.GetNamedColor3dPtr("Red"));
var preAssembly = cubePreMultiply.GetAssembly();
// PreMultiply 는 Default 설정값이다.
// 연속되는 Matrix를 상대 좌표계로 계산되어 축적된다.
// Matrix = PrevMatrix * NewMatrix
vtkTransform transform = vtkTransform.New();
transform.PreMultiply();
transform.Translate(5.0, 0, 0);
transform.RotateZ(90);
transform.RotateX(45);
preAssembly.SetUserTransform(transform);
Console.WriteLine(PrintMatrix(transform.GetMatrix()));
var cubePostMultiply = CreateAnnotatedCubeActor();
cubePostMultiply.GetCubeProperty().SetColor(VtkColorUtils.GetNamedColor3dPtr("Blue"));
var postAssembly = cubePostMultiply.GetAssembly();
// PostMultiply 는 연속되는 Matrix를 앞단으로 계산을 한다.
// 따라서 Matrix를 역으로 계산하게 되며, 이는 Global 좌표계를 기준으로 축적된다.
// Matrix = NewMatrix * PrevMatrix
transform = vtkTransform.New();
transform.Identity();
transform.PostMultiply();
transform.Translate(5.0, 0, 0);
transform.RotateZ(90);
transform.RotateX(45);
postAssembly.SetUserTransform(transform);
Console.WriteLine(PrintMatrix(transform.GetMatrix()));
axesLength = 5;
renderer.AddActor(cubePreMultiply);
renderer.AddActor(cubePostMultiply);
renderer.ResetCamera();
}
private vtkAnnotatedCubeActor CreateAnnotatedCubeActor()
{
vtkAnnotatedCubeActor cube = vtkAnnotatedCubeActor.New();
cube.GetTextEdgesProperty().SetColor(1, 1, 1); // set edge color to white
cube.GetTextEdgesProperty().SetLineWidth(2); // increase edge line width
cube.GetCubeProperty().SetColor(0, 0, 1); // set the cube color to blue
return cube;
}
Matrix Output
[PreMultiply]
0.0000 -0.7071 0.7071 5.0000
1.0000 0.0000 0.0000 0.0000
0.0000 0.7071 0.7071 0.0000
0.0000 0.0000 0.0000 1.0000
[PostMultiply]
0.0000 -1.0000 0.0000 0.0000
0.7071 0.0000 -0.7071 3.5355
0.7071 0.0000 0.7071 3.5355
0.0000 0.0000 0.0000 1.0000
Render 된 결과를 보면 Red(PreMultiply)의 경우는 글로벌 좌표를 기준으로 X 이동 후 해당 로컬 좌표계에서 Rotation 을 연속으로 수행한다.
반면, Blue(PostMultiply)는 글로벌 좌표를 기준으로 X 이동 후 계속해서 글로벌 좌표계 원점(0,0)를 기준으로 Rotation을 연속으로 수행한다.
728x90
728x90