繁体   English   中英

使用 vtk 交互器后鼠标控制丢失

[英]mouse control is lost after using vtk interactor

我是 VTK 的新手,我正在尝试可视化一个 vtk unstructuredgrid mesh 。 为了获得我的网格点的坐标,我使用了 vtk 交互器。 我可以通过使用 OnRightButtonDown() "overrid" 选择点来获得点坐标。 但是,我失去了对 window 的控制。 意味着我不能旋转、平移或缩放我的网格。 我尝试使用 OnRightButtonDoubleClick() 但这似乎不起作用。 任何想法如何使用交互器获取节点坐标而不影响鼠标事件行为或如何在鼠标按钮向上时重新初始化它...

foo
{
...
// vtk visualization    
container = new QWidget(ui->graphicsView);
qvtkWidget = new QVTKOpenGLNativeWidget(container);
...

//Create and link the mapper actor and renderer together.
mapper = vtkSmartPointer<vtkDataSetMapper>::New();
actor = vtkSmartPointer<vtkActor>::New();
renderer = vtkSmartPointer<vtkRenderer>::New();
...

// add elements nodes
...
mapper->SetInputData(eleNodeIdsPtr);
actor->SetMapper(mapper);
renderer->AddActor(actor);

// ste up camera
renderer->SetBackground(0.06, 0.2, 0.5);
double pos[3] = { 0, 0.2, 1 };
double focalPoint[3] = { 0, 0, 0 };
double viewUp[3] = { 1, 1, 1 };
renderer->GetActiveCamera()->SetPosition(pos);
renderer->GetActiveCamera()->SetFocalPoint(focalPoint);
renderer->GetActiveCamera()->SetViewUp(viewUp);
renderer->GetActiveCamera()->Zoom(0.5);

//Add render
qvtkWidget->GetRenderWindow()->AddRenderer(renderer);
qvtkWidget->show();

// Select node
renderWindowInteractor = 
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(qvtkWidget- 
>GetRenderWindow());
vtkNew<InteractorStyle2> style;
renderWindowInteractor->SetInteractorStyle(style);
style->eleNodeIdsPtr = eleNodeIdsPtr;
style->xyzGlobalPtr = xyzGlobalPtr;
renderWindowInteractor->Initialize();

}

// 定义交互风格 class InteractorStyle2 : public vtkInteractorStyleTrackballActor { public: static InteractorStyle2* New(); vtkTypeMacro(InteractorStyle2, vtkInteractorStyleTrackballActor); vtk新颜色;

...
void OnLeftButtonDown()  //...>>>This doesn't work!!
{

}
void OnLeftButtonDown() override // .. this work but the I can't controle the transformation anymore!!
{
    this->PointPicker = vtkSmartPointer<vtkPointPicker>::New();
    // Get the selected point
    int x = this->Interactor->GetEventPosition()[0];
    int y = this->Interactor->GetEventPosition()[1];
    this->FindPokedRenderer(x, y);

    this->PointPicker->Pick(this->Interactor->GetEventPosition()[0],
        this->Interactor->GetEventPosition()[1],
        0, // always zero.
        this->Interactor->GetRenderWindow()
        ->GetRenderers()
        ->GetFirstRenderer());

    if (this->PointPicker->GetPointId() >= 0)
    {
        this->StartPan();
        this->SelectedPoint = this->PointPicker->GetPointId();
        double p[3];
        this->eleNodeIdsPtr->GetPoint(this->SelectedPoint, p);
        std::cout << "p: " << p[0] << " " << p[1] << " " << p[2] << std::endl;
    }
}

vtkSmartPointer<vtkPointPicker> PointPicker;
vtkIdType SelectedPoint;
vtkSmartPointer<vtkUnstructuredGrid>  eleNodeIdsPtr;
vtkSmartPointer< vtkPoints >  xyzGlobalPtr;
}
vtkStandardNewMacro(InteractorStyle2);
}

您应该调用父类的OnLeftButtonDown (或向上),方法是在方法 impl 的末尾添加这一行:

vtkInteractorStyleTrackballActor::OnLeftButtonDown();

一个类似的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM