QT & amp; Стиль взаимодействия ВТК

Я использую VTK как qvtkwidget для отображения 3D объектов в QT.
Я знаю, что могу изменить его стиль взаимодействия, создав собственный модифицированный стиль взаимодействия.
Я хочу повернуть и переместить объект, щелкнув правой кнопкой мыши и удерживая левой кнопкой мыши соответственно.
И попытался создать модифицированный класс стиля взаимодействия в заголовочном файле, но есть некоторые трудности с использованием функций, объявленных в других классах в модифицированном стиле взаимодействия. Это должно быть просто.
Кто-нибудь знает об этом?

  boxWidget.at(boxWidget.count()-1)->SetInput(reader->GetOutput());
boxWidget.at(boxWidget.count()-1)->SetScalingEnabled(0); //turn this on to be able to resize the model
boxWidget.at(boxWidget.count()-1)->SetRotationEnabled(0);
boxWidget.at(boxWidget.count()-1)->SetInteractor(this->ui->qvtkWidget->GetInteractor());
boxWidget.at(boxWidget.count()-1)->GetInteractor()->SetInteractorStyle(MyStyle::New());  /

BoxWidget — это объект, который я пытаюсь применить «MyStyle»
И следующий класс MyStyle

class MyStyle : public vtkInteractorStyleTrackballCamera , public MainWindow
{
private:
unsigned int NumberOfClicks;
int PreviousPosition[2];
int ResetPixelDistance;
public:
static MyStyle *New();

vtkTypeMacro(MyStyle, vtkInteractorStyleTrackballCamera);

PeterStyle() : NumberOfClicks(0) , ResetPixelDistance(5)
{
this->PreviousPosition[0] = 0;
this->PreviousPosition[1] = 0;
}

virtual void OnLeftButtonDown()
{
qDebug() << "My Style Mouse Left Clicked";
//std::cout << "Pressed left mouse button." << std::endl;
this->NumberOfClicks++;
//std::cout << "NumberOfClicks = " << this->NumberOfClicks << std::endl;
int pickPosition[2];
this->GetInteractor()->GetEventPosition(pickPosition);

int xdist = pickPosition[0] - this->PreviousPosition[0];
int ydist = pickPosition[1] - this->PreviousPosition[1];

this->PreviousPosition[0] = pickPosition[0];
this->PreviousPosition[1] = pickPosition[1];

int moveDistance = (int)sqrt((double)(xdist*xdist + ydist*ydist));

// Reset numClicks - If mouse moved further than resetPixelDistance
if(moveDistance > this->ResetPixelDistance)
{
this->NumberOfClicks = 1;
}if(this->NumberOfClicks == 2)
{
vtkSmartPointer<vtkCamera> camera =
vtkSmartPointer<vtkCamera>::New();
camera->SetPosition(140.0, 155.0, 590.0);
camera->SetFocalPoint(140.0, 155.0, 0.0);
camera->SetClippingRange(590.0, 600.0);

this->GetCurrentRenderer()->SetActiveCamera(camera);
qDebug() << "Double clicked.";
this->NumberOfClicks = 0;
}
// forward events
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}

Я не знаю, что изменить, чтобы переместить объекты левой кнопкой мыши.

2

Решение

Если вы ищете только чтобы перемещать объекты с помощью левых кнопок, вам не нужно создавать подкласс своего собственного стиля взаимодействия, vtk уже реализует vtkInteractorStyleTrackballActor стиль, который позволяет управлять актерами мышью, не взаимодействуя с камерой. Затем вы можете переопределить его, чтобы сделать все, что вы хотите.

0

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


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