场景
有限元数据渲染时,同时存在节点属性数据和单元属性数据,交互界面操作时,需要根据用户的选择实时渲染单元数据或者节点数据。
最初的想法是:
- 实例化一个 vtkUnstructuredGrid 对象
unStructGrid
- 设置节点序列信息
cells
和单元序列信息points
- 需要渲染节点属性信息时,通过节点属性信息
pointScalars
进行赋值,并且通过SetScalarModeToUsePointData()
方法设置 mapper 只显示节点属性
unStructGrid->GetPointData()->SetScalars(pointScalars);
ugridMapper->SetScalarModeToUsePointData();
需要渲染单元属性信息时,通过单元属性信息 cellScalars
进行赋值,并且通过 SetScalarModeToUseCellData()
方法设置 mapper 只显示单元属性
unStructGrid->GetCellData()->SetScalars(cellScalars);
ugridMapper->SetScalarModeToUseCellData();
- 将
unStructGrid
对象传入 vtk 渲染管线
ugridMapper->SetInputData(unStructGrid);
...
问题
在切换过程中,最初节点属性渲染正常,切换至单元属性渲染正常,但是切换回节点属性渲染则出现异常,数据传输没有问题,界面只显示一个颜色且无变化,再切换至单元属性却能正常渲染。
分析
可能是 vtkMapper 关于渲染模式的选择存在冲突限制。
解决
始终只选择节点属性数据进行渲染。不做 SetScalarModeToUsePointData
和 SetScalarModeToUseCellData
的切换。
同时实例化一个 vtkUnstructuredGrid 对象 unStructGrid_tem
和一个 vtkCellDataToPointData 对象 c2p
,利用 c2p
将单元属性数据转换为节点属性数据,然后将节点属性数据赋值到 unStructGrid
进行渲染。
unStructGrid_temp->GetCellData()->SetScalars(cellScalars); //单元属性信息
c2p->SetInputData(unStructGrid_temp);//单元属性转化 为节点属性
c2p->Update();
unStructGrid->GetPointData()->SetScalars(c2p->GetOutput()->GetPointData()->GetScalars());
ugridMapper->SetInputData(unStructGrid);