如何围绕特定点旋转vtk场景?

时间:2017-03-27 12:42:18

标签: c++ vtk point-cloud-library qvtkwidget

我有一个代表点云的3D vtk场景,通过QVTKWidget显示。 vtk7.1,Qt5.8。

我希望能够围绕特定坐标旋转场景,但我不知道如何继续。

我喜欢轨迹球互动。我只需要设置中心,但我在VTK api中有点迷失。 我想我可以通过改变旋转矩阵来做到这一点:InvTranslation + Rotation + Translation应该可以解决问题。我看到了两种方法:

1)

  • 获取由VTK计算的旋转矩阵
  • 生成新矩阵
  • 应用矩阵。

2)

  • 将转换设置为vtk以在流程
  • 之前应用
  • 将转换设置为vtk以在流程
  • 之后应用

我是朝着正确的方向吗?如果是,我如何实施其中一种解决方案..?

谢谢我提前,

艾蒂安。

2 个答案:

答案 0 :(得分:1)

问题解决了。 focale的改变也会改变观点。所以,我应用了几个几何变换,就在那里。

// vtk Element /////////////////////////////////////////////////////////
vtkRenderWindowInteractor *rwi = widget->GetInteractor();
vtkRenderer *renderer = widget->GetRenderWindow()->GetRenderers()->GetFirstRenderer();
vtkCamera *camera = renderer->GetActiveCamera();

// Camera Parameters ///////////////////////////////////////////////////
double *focalPoint = camera->GetFocalPoint();
double *viewUp = camera->GetViewUp();
double *position = camera->GetPosition();
double axis[3];
axis[0] = -camera->GetViewTransformMatrix()->GetElement(0,0);
axis[1] = -camera->GetViewTransformMatrix()->GetElement(0,1);
axis[2] = -camera->GetViewTransformMatrix()->GetElement(0,2);

// Build The transformatio /////////////////////////////////////////////////
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->Identity();

transform->Translate(d->center[0], d->center[1], d->center[2]);
transform->RotateWXYZ(rxf, viewUp); // Azimuth
transform->RotateWXYZ(ryf, axis);   // Elevation
transform->Translate(-d->center[0], -d->center[1], -d->center[2]);

double newPosition[3];
transform->TransformPoint(position,newPosition); // Transform Position
double newFocalPoint[3];
transform->TransformPoint(focalPoint, newFocalPoint); // Transform Focal Point

camera->SetPosition(newPosition);
camera->SetFocalPoint(newFocalPoint);

// Orhthogonalize View Up //////////////////////////////////////////////////
camera->OrthogonalizeViewUp();
renderer->ResetCameraClippingRange();

rwi->Render();

答案 1 :(得分:0)

您只需更改vtkCamera的焦点

即可
vtkSmartPointer<vtkCamera> camera = 
   vtkSmartPointer<vtkCamera>::New();
camera->SetPosition(0, 0, 20);
camera->SetFocalPoint(0, 0, 10); // The center point is not 0, 0, 10