记录一次更改vtkPolyData对象标量值,但未达到预期效果,加上Modified函数后,问题解决。
通过以下代码,生成了一个扇形片actor,并且设置了半透明的颜色。
// 设置扇形角度和半径
double angle = 90, sectorRadius = 10;
double sectorCenter[] = {0, 0, 0};
// 根据圆弧的圆心和法向量计算圆弧的起点 point1
double point1Pos[3], point2Pos[3];
point1Pos[0] = sectorCenter[0] + std::cos(angle) * sectorRadius;
point1Pos[1] = sectorCenter[1];
point1Pos[2] = sectorCenter[2] + std::sin(angle) * sectorRadius;
point2Pos[0] = sectorCenter[0] + std::cos(angle) * sectorRadius;
point2Pos[1] = sectorCenter[1];
point2Pos[2] = sectorCenter[2] - std::sin(angle) * sectorRadius;
// 绘制扇形
vtkNew<vtkArcSource> arcSource;
arcSource->SetPoint1(point1Pos); // 圆弧的起点
arcSource->SetPoint2(point2Pos); // 圆弧的终点
arcSource->SetCenter(sectorCenter); // 圆弧的中心
arcSource->SetResolution(50);
arcSource->Update();
vtkNew<vtkPoints> points;
vtkNew<vtkCellArray> cell;
int pointCount = arcSource->GetOutput()->GetNumberOfPoints();
cell->InsertNextCell(pointCount + 2);
for (vtkIdType i = 0; i < pointCount; i++)
{
double* point = arcSource->GetOutput()->GetPoint(i);
points->InsertNextPoint(point);
cell->InsertCellPoint(i);
}
points->InsertNextPoint(sectorCenter);
cell->InsertCellPoint(pointCount);
cell->InsertCellPoint(0);
// 给扇形设置颜色
vtkNew<vtkUnsignedCharArray> cellScalar;
cellScalar->SetNumberOfComponents(4);
cellScalar->SetName("Colors");
cellScalar->InsertNextTuple4(255, 255, 255, 155);
vtkNew<vtkPolyData> sectorPolyData;
sectorPolyData->SetPoints(points);
sectorPolyData->SetPolys(cell);
sectorPolyData->GetCellData()->SetScalars(cellScalar);
vtkNew<vtkPolyDataMapper> sectorMapper;
sectorMapper->SetInputData(sectorPolyData);
sectorMapper->SetScalarVisibility(1);
sectorMapper->SetScalarRange(0, 1);
vtkNew<vtkActor> sectorActor;
sectorActor->SetMapper(sectorMapper);
后面当我想要更改扇形片的颜色的时候,编写了如下代码
vtkActor* actor; // 这个actor是扇形片actor,没写具体怎么得到的
vtkPolyDataMapper* mapper = dynamic_cast<vtkPolyDataMapper*>(actor->GetMapper());
vtkPolyData *data = dynamic_cast<vtkPolyData *>(mapper->GetInput());
vtkUnsignedCharArray* scalars = dynamic_cast<vtkUnsignedCharArray *>(data->GetCellData()->GetScalars());
scalars->SetTuple4(0, 255, 255, 0, 155);
data->Modified(); // 不加这一句颜色不会改变,加了之后重新渲染颜色变成了设定的值

浙公网安备 33010602011771号