раскрашивание отдельных треугольников в vtkGlyph3D

#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