在计算机图形学中,三维坐标点用齐次坐标表示。利用其次坐标,可以将空间变换用4x4的矩阵来表示。这些变换都可以用矩阵的运算完成。
当从外界读入STL等三维模型时,其会按照它内部的坐标位置进行显示。因此它的位置和大小是确定的。但是在实际应用中,有可能需要人为地对这个模型在空间中进行旋转、平移或缩放等操作。VTK中有许多和旋转、平移相关的函数
VTK相关的类有:
vtkTransform, vtkTransformFilter, vtkMatrix4x4等
SetPosition、AddPosition(设置物体在世界坐标系中的位置)
SetPosition(x, y, z)—— 指定vtkProp3D对象在世界坐标系中的位置。AddPosition(deltaX, deltaY, deltaZ) —— 用指定的X、Y、Z三个方向的增量来平移Prop。
如立方体开始在原点处,调用SetPosition(50,0,0)后其位置变为(50,0,0)。可以通过GetPosition函数查看物体在世界坐标系中的位置
一、绕中心旋转,这个重要
1. 移动Prop到原点;
2. 绕Y轴旋转;
3. 绕X轴旋转;
4. 绕Z轴旋转;
5. 从原点中移动回原来的位置;
double * center = actor->GetCenter();
double * origin = actor->GetOrigin();
actor->SetOrigin(center);
actor->RotateX(10);
actor->SetOrigin(origin);
二、 绕左边的边中心旋转
static int count_rotate = 0;
count_rotate++;
double *center = mProp3DSec->GetCenter();//{ 0 };
double *bounds = mProp3DSec->GetBounds();
double newCenter[3]={ 0 };
)//这里是以起点水平为例,超过 90度,左边的边变成右边的,过中心点了
if (count_rotate >= 10
{
newCenter[0] = center[0] + ((bounds[1] - bounds[0]) / 2);
newCenter[1] = center[1] + ((bounds[3] - bounds[2]) / 2);
newCenter[2] = center[2] + ((bounds[5] - bounds[4]) / 2);
}
else
{
newCenter[0] = center[0] - ((bounds[1] - bounds[0]) / 2);
newCenter[1] = center[1] - ((bounds[3] - bounds[2]) / 2);
newCenter[2] = center[2] + ((bounds[5] - bounds[4]) / 2);
}
double * origin = mProp3DSec->GetOrigin();
mProp3DSec->SetOrigin(newCenter);
mProp3DSec->RotateY(10);
mProp3DSec->SetOrigin(origin);
数据旋转
// Read file
vtkNew<vtkImageReader2Factory> readerFactory;
vtkSmartPointer<vtkImageReader2> reader;
reader.TakeReference(readerFactory->CreateImageReader2(argv[1]));
reader->SetFileName(argv[1]);
reader->Update();
double bounds[6];
reader->GetOutput()->GetBounds(bounds);
// Rotate about the center of the image
vtkNew<vtkTransform> transform;
// Compute the center of the image
double center[3];
center[0] = (bounds[1] + bounds[0]) / 2.0;
center[1] = (bounds[3] + bounds[2]) / 2.0;
center[2] = (bounds[5] + bounds[4]) / 2.0;
// Rotate about the center
transform->Translate(center[0], center[1], center[2]);
transform->RotateWXYZ(angle, 0, 0, 1);
transform->Translate(-center[0], -center[1], -center[2]);
保存变换
vtkMatrix4x4::Multiply4x4(m_pPlaneSecMatri, transformN->GetMatrix(), m_pPlaneSecMatri);
vtkImageData
vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::New();
...
vtkSmartPointer<vtkTransformFilter> transformFilter = vtkSmartPointer<vtkTransformFilter>::New();
//transformFilter->SetInput(imageData);
transformFilter->SetInputData(imageData);
transformFilter->SetInformation(imageData->GetInformation());
transformFilter->SetTransform(vTransform);
transformFilter->Update();