1. VTK屏幕绘制多边形需求解析
在3D可视化项目中,我们经常需要实现屏幕空间的多边形绘制功能。标准VTK库提供的vtkInteractorStyleDrawPolygon虽然能实现基本功能,但在实际使用中存在明显缺陷:
- 绘制体验差:需要持续按住鼠标左键移动才能绘制,不符合现代交互习惯
- 视觉闪烁:动态绘制过程中会出现明显的画面闪烁
- 灵活性不足:无法自定义绘制样式和交互逻辑
提示:VTK的2D绘制与3D场景绘制有本质区别。屏幕坐标绘制需要考虑视口变换和像素精度问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 自定义绘制方案设计
2.1 核心架构设计
我们采用继承vtkInteractorStyleTrackballCamera的方式实现自定义交互,主要组件包括:
mermaid复制classDiagram
class PolygonRubberBandStyle{
+AddToRenderer()
+OnLeftButtonDown()
+OnMouseMove()
+OnRightButtonDown()
-Update2DDrawing()
-PixelPoints
-Points2D
-PolyData2D
-Actor2D
}
2.2 关键数据结构
cpp复制class PolygonRubberBandStyle : public vtkInteractorStyleTrackballCamera {
private:
std::vector<std::vector<double>> PixelPoints; // 屏幕像素坐标
vtkSmartPointer<vtkPoints> Points2D; // 顶点容器
vtkSmartPointer<vtkPolyData> PolyData2D; // 几何数据
vtkSmartPointer<vtkActor2D> Actor2D; // 渲染对象
};
3. 核心实现细节
3.1 初始化2D绘制管线
cpp复制PolygonRubberBandStyle::PolygonRubberBandStyle() {
// 设置顶点容器
this->Points2D = vtkSmartPointer<vtkPoints>::New();
this->Points2D->SetDataTypeToDouble(); // 必须设为Double保证精度
// 构建几何数据
this->PolyData2D = vtkSmartPointer<vtkPolyData>::New();
this->PolyData2D->SetPoints(this->Points2D);
// 配置Mapper
auto mapper2D
