[vtkusers] vtkPolyDataMapper ColorByArrayComponent

Eric Pichon eric at ece.gatech.edu
Mon Jun 16 21:50:45 EDT 2003


Hi All,

I am trying to generate an isosurface and then color it with a different
scalar field. This is described in the VTK user guide (p86, 5.1, "Color an
isosurface with another scalar") but strangely whichever color field I
try to map to the isosurface color I cannot seem to get anything but a
dull gray.

Any idea on what I am doing wrong would be really appreciated !

Thanks,

Eric

----
(I think that the construction of the vtkImageData might be incorrect ? I
am trying to use 'inImage' for the isosurface and 'outImage' for the
color. Again, the isosurface is fine but not colored.

It looks like any arguments can be given to ColorByArray component
without causing any error message at runtime. This is also the behavior
in the example ColorIsosurface.tcl)


	// Create the RenderWindow, Renderer and both Actors
	vtkRenderer *ren1 = vtkRenderer::New();
	vtkRenderWindow *renWin = vtkRenderWindow::New();
    renWin->AddRenderer(ren1);

	vtkRenderWindowInteractor *iren =
vtkRenderWindowInteractor::New();
    iren->SetRenderWindow(renWin);

	// create pipeline
	vtkMergePoints *locator = vtkMergePoints::New();
	locator->SetDivisions(32, 32, 46);
	locator->RetainCellListsOff();
	locator->SetNumberOfPointsPerBucket(2);
	locator->AutomaticOff();

	vtkImageData *data = vtkImageData::New();
	data->SetScalarTypeToShort();

	data->SetSpacing( dx, dy, dz );
	data->SetDimensions( nX, nY, nZ );

	short *ptrData = (short *)data->GetScalarPointer();

	vtkShortArray *array = vtkShortArray::New();
	array->SetName("HU");
	array->SetNumberOfValues(nX*nY*nZ);
	short *ptrArray = array->GetPointer( 0 );

	int x, y, z;
	int index=0;
		for( z=0;z<nZ;z++)
			for( y=0;y<nY;y++)
				for( x=0;x<nX;x++)
				{

ptrData[index]=inImage->xyz(x,y,z);

ptrArray[index]=outImage->xyz(x,y,z);

					index++;
				}

	vtkFieldData *field = vtkFieldData::New();
	field->AddArray( array );

	cout << "field:";
	vtkIndent *indent = vtkIndent::New();
	field->PrintSelf(cout, *indent );
	cout << endl;

	data->SetFieldData( field );

	vtkContourFilter *iso = vtkContourFilter::New();
    iso->SetInput( data );
    iso->SetValue( 0, 0.5 );

/*
	vtkMarchingCubes *iso = vtkMarchingCubes::New();
    iso->SetInput( data );
    iso->SetValue( 0, 0.5 );
    iso->ComputeGradientsOn();
    iso->ComputeScalarsOn(); //iso->ComputeScalarsOff();
    iso->SetLocator(locator);
*/

	cout << "iso:";
	iso->PrintSelf(cout, *indent );
	cout << endl;

	cout << "iso->GetFieldData():";
	iso->GetOutput()->GetFieldData()->PrintSelf(cout, *indent );
	cout << endl;

	vtkPolyDataMapper *isoMapper = vtkPolyDataMapper::New();
	isoMapper->SetInput( iso->GetOutput() );
	isoMapper->ScalarVisibilityOn();
	isoMapper->SetScalarRange(0, 500);
	isoMapper->SetScalarModeToUsePointFieldData();
	isoMapper->ColorByArrayComponent("HU", 0);

	vtkActor *isoActor=vtkActor::New();
    isoActor->SetMapper( isoMapper );

	vtkOutlineFilter *outline=vtkOutlineFilter::New();
    outline->SetInput( data );
	vtkPolyDataMapper *outlineMapper = vtkPolyDataMapper::New();
    outlineMapper->SetInput( outline->GetOutput() );
	vtkActor *outlineActor = vtkActor::New();
    outlineActor->SetMapper( outlineMapper );

	// Add the actors to the renderer, set the background and size
	ren1->AddActor( outlineActor );
	ren1->AddActor( isoActor );
	ren1->SetBackground( 1, 1, 1 );

	renWin->SetSize( 500, 500 );
	ren1->SetBackground( 0.1, 0.2, 0.4 );

	ren1->GetActiveCamera()->Elevation(90);
	ren1->GetActiveCamera()->SetViewUp( 0, 0, -1 );
	ren1->GetActiveCamera()->Zoom( 1.5 );

	ren1->ResetCameraClippingRange();

	// render the image
	renWin->Render();

	iren->Start();




More information about the vtkusers mailing list