2017-03-27 355 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

這可能是一個解決方案,但焦點的變化也集中在焦點上的觀點。即使移動相機,我也想修復旋轉中心。 –