#c #vtk
Вопрос:
Я создал новый класс PieSource
(на основе vtkCylinderSource
), который создает несколько треугольников вместе с цветами, которые они должны иметь:
int vtkPieSource::RequestData(vtkInformation *info,
vtkInformationVector **infoV,
vtkInformationVector *outputVector) {
vtkInformation *outInfo = outputVector->GetInformationObject(0);
vtkPolyData *output = vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));
vtkPoints *newPoints;
vtkFloatArray *newNormals;
vtkUnsignedCharArray *newCols = vtkUnsignedCharArray::New();
newCols->SetNumberOfComponents(3);
newCols->SetName("Colors");
newPoints = vtkPoints::New();
newPoints->SetDataType(VTK_FLOAT);
newPoints->Allocate(iNumVerts);
newPolys = vtkCellArray::New();
newPolys->Allocate(iNumTriangles);
(-- here we create the triangles and determine their colors --)
for (uint i = 0; i < iNumVerts; i =3) {
vtkTriangle *triangle1 =vtkTriangle::New();
triangle1->GetPointIds()->SetId(0, i);
triangle1->GetPointIds()->SetId(1, i 1);
triangle1->GetPointIds()->SetId(2, i 2);
newPolys->InsertNextCell(triangle1);
}
output->SetPoints(newPoints);
newPoints->Delete();
output->GetPointData()->SetScalars(newCols);
newCols->Delete();
output->SetPolys(newPolys);
newPolys->Delete();
return 0;
}
В моем приложении я создаю vtkGlyph3DMapper
файл, который использует вывод PieSource
vtkNew<vtkPieSource> pieSource;
pieSource->SetData(5, testData);
vtkNew<vtkGlyph3DMapper> glyph3Dmapper;
glyph3Dmapper->SetSourceConnection(pieSource->GetOutputPort());
glyph3Dmapper->SetInputData(polydata);
// glyph3Dmapper->SelectColorArray("Colors");
( polydata
содержит 2 треугольника с цветами-без этих входных данных ничего не рисуется)
Когда я запускаю это, геометрия глифа рисуется в правильных местах с правильной ориентацией, но у них нет цветов, которые я им назначил (все треугольники серые). Если я раскомментирую линию glyph3Dmapper->SelectColorArray("Colors");
, весь глиф будет нарисован одним и тем же цветом (тем, который указан в массиве с именем «Цвета»).
Возможно ли иметь глиф, треугольники которого индивидуально окрашены?
Если да, то как я должен это сделать?
Ответ №1:
Во — первых, поскольку ваш newCols
массив пуст, я не знаю, какого цвета вы ожидаете.
Затем, если вы хотите, чтобы цвет был связан с треугольником, вам следует добавить свой массив данных в CellData
, а не в PointData
. Массив должен содержать один кортеж на ячейку (треугольник здесь).
Небольшое замечание по стилю: вместо vtkXXX * myObj = vtkXXX::New();
этого рекомендуется использовать экземпляр объекта с локальной областью vtkNew<vtkXXX> myObject;
действия , поэтому вам это не нужно Delete
.
Комментарии:
1.
newCols
не пусто — оно заполнено в той части кода, которую я опустил («здесь мы создаем…»). Но дело в том, что я ожидал, что треугольники будут иметь разные цвета. — и спасибо, что указалиCellData