2017-03-27 356 views
1

我有一个3D vtk场景,代表一个点云,通过QVTKWidget显示。 vtk7.1,Qt5.8。如何在特定点周围旋转vtk场景?

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

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

1)

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

2)

  • 设置转换为VTK过程
  • 设置之前,应用转换到VTK我是在正确的方向的过程

后申请?如果是的话,我可以如何实现这些解决方案之一..?

感谢提前,

艾蒂安。

回答

1

问题解决了。焦点的变化也会改变观点。所以,我进行了一些几何变换,就是这样。

// 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(); 
+0

试图避免通过旋转演员来实现弧球相机渲染 - 但现在我发现了你的解决方案,不由得尝试一下。谢谢! [python-vtk实现通过gist共享](https://gist.github.com/pangyuteng/facd430d0d9761fc67fff4ff2e5fffc3) – teng

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 
+0

这可能是一个解决方案,但焦点的变化也集中在焦点上的观点。即使移动相机,我也想修复旋转中心。 –