Как вращать сцену vtk вокруг определенной точки?

У меня есть 3D-сцена vtk, представляющая облако точек, отображаемое через QVTKWidget.
vtk7.1, Qt5.8.

Я хочу иметь возможность вращать сцену вокруг определенных координат, но я не знаю, как действовать дальше.

Мне нравится взаимодействие трекбола. Мне просто нужно установить центр, но я немного запутался в API VTK.
Я думаю, что могу сделать это, изменив матрицу вращения: InvTranslation + Rotation + Translation должен помочь. Я вижу два способа сделать это:

1)

  • Получить матрицу вращения, вычисленную ВТК
  • Генерация новой матрицы
  • Примените матрицу.

2)

  • установить преобразование в vtk для применения перед процессом
  • установить преобразование в vtk, чтобы применить после процесса

Я в правильном направлении? Если да, то как я могу реализовать одно из этих решений?

Спасибо, я заранее,

Etienne.

1

Решение

Вам просто нужно изменить фокус вашей 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

Другие решения

Задача решена. Изменение фокуса также изменило бы представление. Итак, я применил несколько геометрических преобразований, и вот оно.

// 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

По вопросам рекламы [email protected]