Yue_JIN
(Yue JIN)
February 20, 2020, 3:36am
1
Hi everybody, I use vtkCutter to show a section of an unstructuredgrid. My code works well in vtk 8.2. But in vtk 8.9, the actor of vtkCutter becomes white like shown in the picture attached. All these actors are rendered in QVTKOpenGLNativeWidget.
What may cause this issue?
Yue_JIN
(Yue JIN)
February 20, 2020, 8:24am
2
I can reproduce this issue in a very simple example. VTK 8.2 stills works well, but VTK 8.9 has the same problem. Maybe a bug?
Here is my code
#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkDataSetMapper.h>
#include <vtkPolyDataMapper.h>
#include <vtkMath.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkStructuredGrid.h>
#include <vtkUnstructuredGrid.h>
#include <vtkCutter.h>
#include <vtkDoubleArray.h>
#include <vtkPointData.h>
#include <vtkAppendFilter.h>
#include <vtkPlane.h>
int main(int, char *[])
{
// Create a grid
vtkSmartPointer<vtkStructuredGrid> structuredGrid =
vtkSmartPointer<vtkStructuredGrid>::New();
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkDoubleArray> dataArray =
vtkSmartPointer<vtkDoubleArray>::New();
unsigned int numi = 2;
unsigned int numj = 2;
unsigned int numk = 5;
for (unsigned int k = 0; k < numk; k++)
{
for (unsigned int n = 0; n < 4; n++)
{
dataArray->InsertNextValue(k*0.2);
}
}
for(unsigned int k = 0; k < numk; k++)
{
for(unsigned int j = 0; j < numj; j++)
{
for(unsigned int i = 0; i < numi; i++)
{
points->InsertNextPoint(i, j, k);
}
}
}
// Specify the dimensions of the grid
structuredGrid->SetDimensions(numi, numj, numk);
structuredGrid->SetPoints(points);
structuredGrid->GetPointData()->SetScalars(dataArray);
// Create a mapper and actor
vtkSmartPointer<vtkDataSetMapper> mapper =
vtkSmartPointer<vtkDataSetMapper>::New();
mapper->SetInputData(structuredGrid);
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkStructuredGrid> structuredGrid2 =
vtkSmartPointer<vtkStructuredGrid>::New();
vtkSmartPointer<vtkPoints> points2 =
vtkSmartPointer<vtkPoints>::New();
for (unsigned int k = 0; k < numk; k++)
{
for (unsigned int j = 0; j < numj; j++)
{
for (unsigned int i = 0; i < numi; i++)
{
points2->InsertNextPoint(3 + i, j, k);
}
}
}
structuredGrid2->SetDimensions(numi, numj, numk);
structuredGrid2->SetPoints(points2);
structuredGrid2->GetPointData()->SetScalars(dataArray);
// Create a mapper and actor
vtkSmartPointer<vtkDataSetMapper> mapper2 =
vtkSmartPointer<vtkDataSetMapper>::New();
mapper2->SetInputData(structuredGrid2);
vtkSmartPointer<vtkActor> actor2 =
vtkSmartPointer<vtkActor>::New();
actor2->SetMapper(mapper2);
// Create a renderer, render window, and interactor
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the second renderer for cutter
vtkSmartPointer<vtkRenderer> renderer2 =
vtkSmartPointer<vtkRenderer>::New();
renderWindow->SetSize(800, 400);
renderWindow->AddRenderer(renderer2);
renderer->SetViewport(0, 0, 0.5, 1);
renderer2->SetViewport(0.5, 0, 1, 1);
vtkSmartPointer<vtkAppendFilter> appendFilter =
vtkSmartPointer<vtkAppendFilter>::New();
vtkSmartPointer<vtkCutter> cutter =
vtkSmartPointer<vtkCutter>::New();
vtkSmartPointer<vtkPlane> cutPlane =
vtkSmartPointer<vtkPlane>::New();
vtkSmartPointer<vtkPolyDataMapper> cutterMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> cutterActor =
vtkSmartPointer<vtkActor>::New();
appendFilter->AddInputData(structuredGrid);
appendFilter->AddInputData(structuredGrid2);
cutPlane->SetOrigin(0, 0.5, 0);
cutPlane->SetNormal(0, 1, 0);
cutter->SetCutFunction(cutPlane);
cutter->SetInputConnection(appendFilter->GetOutputPort());
cutterMapper->SetInputConnection(cutter->GetOutputPort());
cutterActor->SetMapper(cutterMapper);
renderer2->AddActor(cutterActor);
// Add the actor to the scene
renderer->AddActor(actor);
renderer->AddActor(actor2);
renderer->SetBackground(.2, .3, .4);
// Render and interact
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
I think you can report a bug here: https://gitlab.kitware.com/vtk/vtk/issues
Please, mention the VTK version (8.9) in the topic title if you decide to file it.
mwestphal
(Mathieu Westphal (Kitware))
March 2, 2020, 2:34am
4
Already reported and I suggested to post here for more visibility.
1 Like