728x90
vtkTransform 에서는 모든 Transform 을 concatenate 방식으로 적재하여 최종 transform 을 구한다.
Concatenate 된 Transform 을 무시하고 원하는 위치나 회전 값으로 변경하기 위해서는 새로운 객체에 값을 입력하고 Matrix로 업데이트 하는 방식을 해야한다.
var originXfm = vtkTransform.New();
originXfm.Translate(10, 20, 30);
originXfm.RotateX(50);
originXfm.Translate(100, 200, 100);
originXfm.GetMatrix().SetElement(0,3, -50); // Warning 발생
직접 Transform의 Matrix에 접근하여 Element 업데이트를 하면 아래와 같은 경고가 발생한다.
InternalUpdate: doing hack to support legacy code. This is deprecated in VTK 4.2. May be removed in a future version.
1. Set Translation
public void TestTransformSetTranslation()
{
var originXfm = vtkTransform.New();
originXfm.Translate(10, 20, 30);
originXfm.RotateX(50);
originXfm.Translate(100, 200, 100);
Console.WriteLine($"Get Origin Final Position : {originXfm.GetPosition().ToStringJoin()}");
// Transform 방식
var newPos = new double[] {-50, -50, 100};
vtkMatrix4x4 setTranslate = vtkMatrix4x4.New();
setTranslate.DeepCopy(originXfm.GetMatrix());
setTranslate.SetElement(0, 3, newPos[0]);
setTranslate.SetElement(1, 3, newPos[1]);
setTranslate.SetElement(2, 3, newPos[2]);
originXfm.SetMatrix(setTranslate);
Console.WriteLine($"Get Origin New Position : {originXfm.GetPosition().ToStringJoin()}");
}
2. Set Rotation
public void TestTransformSetRotation()
{
var originXfm = vtkTransform.New();
originXfm.Translate(10, 20, 30);
originXfm.RotateX(50);
originXfm.RotateY(50);
originXfm.Translate(100, 200, 100);
originXfm.RotateZ(50);
Console.WriteLine($"Get Origin Final Rotaion : {originXfm.GetOrientation().ToStringJoin()}");
// Transform 방식
vtkTransform rotXfm = vtkTransform.New();
rotXfm.Translate(originXfm.GetPosition().ToIntPtr());
rotXfm.RotateX(90);
originXfm.SetMatrix(rotXfm.GetMatrix());
Console.WriteLine($"Get Origin New Position : {originXfm.GetOrientation().ToStringJoin()}");
}
728x90
728x90