很高兴在雪易的CSDN遇见你
专栏内容同步更新在公众号 VTK忠粉,期待小伙伴的关注!
【vtkWidgetRepresentation】第三期 VTK中的三维建模约束器
前言
三维建模中,创建点,拾取点,约束点都是基本功,本文分享基于VTK可以实现的拾取点的方式,希望对各位小伙伴有所帮助!进一步分享了自定义的vtkPointPlacer子类,能够不使用vtkPointPicker就能拾取三维窗口中的各种点。
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的点赞就是我的动力(^U^)ノ~YO
目标:
目录
1. 拾取坐标系中任意点
用户通过点击“显示坐标系”下的点,计算出世界坐标系。在vtkHandleRepresentation的默认点放置器vtkPointPlacer下,即可获得。
void vtkHandleRepresentation::SetDisplayPosition(double displyPos[3])
{
if (this->Renderer && this->PointPlacer)
{
if (this->PointPlacer->ValidateDisplayPosition(this->Renderer, displyPos))
{
double worldPos[3], worldOrient[9];
if (this->PointPlacer->ComputeWorldPosition(this->Renderer, displyPos, worldPos, worldOrient))
{
this->DisplayPosition->SetValue(displyPos);
this->WorldPosition->SetValue(worldPos);
this->DisplayPositionTime.Modified();
}
}
}
else
{
this->DisplayPosition->SetValue(displyPos);
this->DisplayPositionTime.Modified();
}
}
int vtkPointPlacer::ComputeWorldPosition(
vtkRenderer* ren, double displayPos[2], double worldPos[3], double vtkNotUsed(worldOrient)[9])
{
if (ren)
{
vtkCoordinate* dpos = vtkCoordinate::New();
dpos->SetCoordinateSystemToDisplay();
dpos->SetValue(displayPos[0], displayPos[1]);
double* p = dpos->GetComputedWorldValue(ren);
worldPos[0] = p[0];
worldPos[1] = p[1];
worldPos[2] = p[2];
dpos->Delete();
return 1;
}
return 0;
}
2. 拾取具有约束位置的点,如平面上的点,曲面上的点。
根据具体的约束对象,选择合适的点放置器vtkPointPlacer的子类,实现完成。
3 拾取PolyData(多边形数据)的几何结构点。
几何结构点即构成PolyData数据的点。vtkPointPicker可以拾取PolyData数据的几何结构点。
4 拾取对象的中心点
创建对象的几何中心点。
5.自定义vtkPointPlacer子类拾取各种点
自定义vtkPointPlacer的子类zxPolyDataPointPlacer,实现拾取三维窗口中所有对象的几何结构点和约束点。无需像vtkPolygonalSurfacePointPlacer需要输入指定的Actor和PolyData。使用vtkHandleRepresentation或其他vtkWidgetRepresentation时,可以将zxPolyDataPointPlacer指定为点约束器,这样在三维窗口中就可以方便的实现点的拾取了。
结论:
总结了在VTK中拾取点的几种方式,最后给出了自定义的拾取点的方式,简单易用。
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的赞赏是我的最最最最大的动力(^U^)ノ~YO