[vtkusers] Rendering huge amount of polyData with 1 actor and vtkMultiBlockDataSet/vtkCompositePolyDataMapper2
finfanillo
esteban.vidal at huawei.com
Thu Aug 29 04:41:03 EDT 2013
Hi all,
I have a huge amount of polydata (octagons) created from a point cloud, so I
want to render them with 1 actor, in order to save memory. I need to keep
track of color information, which is different for every point. My code is
something like:
////////////
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkUnsignedCharArray> colors =
vtkSmartPointer<vtkUnsignedCharArray>::New();
vtkSmartPointer<vtkPolygon> octagon = vtkSmartPointer<vtkPolygon>::New();
vtkSmartPointer<vtkCellArray> Octagons =
vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
vtkMultiBlockDataSet* Blocks = vtkMultiBlockDataSet::New();
for(size_t i=0;i<point_cloud_size;++i)
{
// Create and octagon for every point, using them at a central points and
getting 8 vertices
points->InsertNextPoint(vertex_1_x[i], vertex_1_y[i], vertex_1_z[i]);
...
points->InsertNextPoint(vertex_8_x[i], vertex_8_y[i], vertex_8_z[i]);
// Add color information to every vertex
colors->SetNumberOfComponents(3);
colors->SetName("Colors");
colors->InsertNextTupleValue(point_color[i]);
...
colors->InsertNextTupleValue(point_color[i]); // 8 times, 1 for every
vertex
// Create every octagon
octagon->GetPointIds()->SetNumberOfIds(8);
octagon->GetPointIds()->SetId(0, 0);
octagon->GetPointIds()->SetId(1, 1);
...
octagon->GetPointIds()->SetId(7, 7);
Octagons->InsertNextCell(octagon);
// Create the polydatas and put it into a MultiBlockDataSet
polyData ->SetPoints(points);
polyData ->SetPolys(Octagons);
polyData ->GetPointData()->SetScalars(colors);
Blocks ->SetBlock(i+1,polyData);
Blocks ->Modified();
// Initialize
points->Initialize();
colors->Initialize();
octagon->Initialize();
Octagons->Initialize();
polyData->Initialize();
}
// Rendering. I guess the problem is here, but I don't know where exactly
vtkSmartPointer<vtkCompositeDataGeometryFilter> geom =
vtkSmartPointer<vtkCompositeDataGeometryFilter>::New();
geom->SetInput(Blocks);
geom->Update();
vtkCompositePolyDataMapper2* mapper = vtkCompositePolyDataMapper2::New();
mapper->SetInputConnection(0,geom->GetOutputPort(0));
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderWindow->Render();
renderWindowInteractor->Start();
////////////////
The result is that only the last polygon is rendered. Can anybody help me
please? Thank you!
--
View this message in context: http://vtk.1045678.n5.nabble.com/Rendering-huge-amount-of-polyData-with-1-actor-and-vtkMultiBlockDataSet-vtkCompositePolyDataMapper2-tp5723120.html
Sent from the VTK - Users mailing list archive at Nabble.com.
More information about the vtkusers
mailing list