2014-12-30 4 views
2

QT에서 3D 개체를 표시하기 위해 VTK를 qvtkwidget으로 사용하고 있습니다. 나 자신의 수정 된 상호 작용 스타일을 만들어 상호 작용 스타일을 변경할 수 있음을 알고 있습니다. 마우스 오른쪽 버튼을 누른 상태에서 왼쪽 마우스를 클릭하여 객체를 회전시키고 움직여야합니다. 그리고 헤더 파일에 수정 된 상호 작용 스타일 클래스를 만들려고했지만 수정 된 상호 작용 스타일에서 다른 클래스에 선언 된 함수를 사용하는 데 어려움이 있습니다. 이것은 간단해야합니다. 누구든지이 사실을 알고 있습니까? QT 및 VTK 상호 작용 스타일

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' 을 적용하려고하는 객체입니다 그리고 다음은 내가 leftclick으로 객체를 이동하도록 변경해야할지 모르는 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(); 
} 

입니다.

+0

나는 이것을 할 필요가있을 때 (5 년 이상 전에) 자신의 상호 작용 스타일을 만들었습니다. 어쩌면 당신은 자신의 상호 작용 방식으로 무엇을했는지와 그 문제가 무엇인지 보여 주어야합니다. – drescherjm

+0

왼쪽 클릭을 vtkInteractorStyleTrackballCamera로 전달하지 않거나 최소한 조건에 따라이 작업을 수행 할 수 있습니다. – drescherjm

답변

0

당신이, 당신이 당신의 자신의 상호 작용 스타일을 서브 클래 싱 할 필요가 없습니다 만 왼쪽 버튼으로 객체를 이동 을 찾는 경우는, vtk 이미 카메라와 상호 작용하지 않고, 마우스로 배우를 제어 할 수 있습니다 vtkInteractorStyleTrackballActor 스타일을 구현합니다. 그런 다음 원하는대로 수행하도록 재정의 할 수 있습니다.