鼠标左键按下开始画线,抬起则完成画线,此功能的重点在于在鼠标移动时更新线的状态。使用的是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.鼠标左键抬起结束绘制(可以使用一个标志量来进行判断)
运行效果如下: