VTK Actor ImageData polyData,Transform 平移,旋转

在计算机图形学中,三维坐标点用齐次坐标表示。利用其次坐标,可以将空间变换用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();

你可能感兴趣的:(VTK,线性代数)