vtk 鼠标移动画线(鼠标轨迹生成)

鼠标左键按下开始画线,抬起则完成画线,此功能的重点在于在鼠标移动时更新线的状态。使用的是vtkPloyLine实现。

1.鼠标左键按下时,记录下按下的坐标,并且初始化线条对象等

m_points = vtkSmartPointer<vtkPoints>::New();
            cells = vtkSmartPointer<vtkCellArray>::New();
            polyLine = vtkSmartPointer<vtkPolyLine>::New();
            vtkSmartPointer<vtkPolyData>  outputVector = vtkSmartPointer<vtkPolyData>::New();
            m_points->InsertNextPoint(picked[0], picked[1], picked[2] + 10);
            polyLine->GetPointIds()->SetNumberOfIds(m_points->GetNumberOfPoints());

            for (int i = 0; i < m_points->GetNumberOfPoints(); i++) {
                // newPoints->InsertNextPoint(points->GetPoint(i));
                polyLine->GetPointIds()->SetId(i, i);
            }
            cells->InsertNextCell(polyLine);
            outputVector->SetPoints(m_points);
            outputVector->SetLines(cells);

            vtkSmartPointer<vtkPolyDataMapper> freeLineMapper =
                vtkSmartPointer<vtkPolyDataMapper>::New();
            freeLineMapper->SetInputData(outputVector);
            vtkSmartPointer<vtkActor> freeLineActor = vtkSmartPointer<vtkActor>::New();
            freeLineActor->SetMapper(freeLineMapper);
            freeLineActor->GetProperty()->SetColor(0, 0.73, 0.83);
            freeLineActor->GetProperty()->SetLineWidth(2);
            this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(freeLineActor);

2.按住左键,鼠标移动,添加点,通过修改cells和points改变polydata。重新渲染

m_points->InsertNextPoint(picked[0], picked[1], picked[2]+10);
            int numOfPoints = m_points->GetNumberOfPoints();
            polyLine->GetPointIds()->InsertNextId(numOfPoints);
            polyLine->GetPointIds()->SetId(numOfPoints - 1, numOfPoints - 1);
                m_points->Modified();
                cells->Initialize(); // reset the cells to remove the old spiral
                cells->InsertNextCell(polyLine); // re-insert the updated spiral
                cells->Modified(); // required to update

                //renderer->GetRenderWindow()->GetInteractor()->Initialize();
              //  renderer->Render();
                this->Interactor->GetRenderWindow()->Render();

3.鼠标左键抬起结束绘制(可以使用一个标志量来进行判断)

运行效果如下:

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用VTK(Visualization Toolkit)库绘制一个立方体,并实现鼠标拖拽功能的主要步骤如下: 1. 导入VTK库和相关头文件: ```C++ #include <vtkSmartPointer.h> #include <vtkCubeSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> ``` 2. 创建立方体数据源: ```C++ vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New(); ``` 3. 创建数据映射器: ```C++ vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cubeSource->GetOutputPort()); ``` 4. 创建绘制对象(立方体的Actor): ```C++ vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); ``` 5. 创建渲染器和窗口: ```C++ vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); ``` 6. 创建交互器,并添加窗口对象: ```C++ vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); ``` 7. 配置交互器,使其支持鼠标拖拽操作: ```C++ vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); interactor->SetInteractorStyle(style); ``` 8. 启动渲染和交互过程: ```C++ renderWindow->Render(); interactor->Start(); ``` 以上便是使用VTK库实现鼠标拖拽绘制立方体的基本步骤。通过调用相应的函数,可以修改立方体的属性,如大小、颜色等,以实现个性化的立方体绘制效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值