[vtkusers] Problem getting vtkActor2D and vtkActor to render simultaneously

Dominic domaniak at gmail.com
Tue Jan 29 10:57:17 EST 2013


On 13-01-18 10:45 AM, Dominic Plourde wrote:
> I have a similar problem. I'm using VTK 5.10.1 on Ubuntu 11.10 The 
> vtkActor2D disappear when I moving other 3D actors outside the 
> viewport. If I remove the vtkAxesActor, my vtkActor2D is not visible. 
> My test code:
> #include <vtkVersion.h>
> #include <vtkImageData.h>
> #include <vtkSmartPointer.h>
> #include <vtkRenderWindow.h>
> #include <vtkRenderWindowInteractor.h>
> #include <vtkInteractorStyleImage.h>
> #include <vtkRenderer.h>
> #include <vtkImageMapper.h>
> #include <vtkActor2D.h>
>
>
> #include <vtkPolygon.h>
> #include <vtkPolyData.h>
> #include <vtkProperty.h>
> #include <vtkPolyDataMapper.h>
> #include <vtkCellData.h>
> #include <vtkCellArray.h>
>
> #include <vtkTexture.h>
> #include <vtkImageData.h>
> #include <vtkFloatArray.h>
> #include <vtkPointData.h>
> #include <vtkQImageToImageSource.h>
> #include <vtkAxesActor.h>
> #include <vtkVersion.h>
>
> #include <QImage>
> #include <QApplication>
>
> static void CreateColorImage(vtkImageData*);
>
> int main(int i, char** c)
> {
>    QApplication qapp(i, c);
>
>    vtkSmartPointer<vtkImageData> colorImage = vtkSmartPointer<vtkImageData>::New();
>    CreateColorImage(colorImage);
>    
>    vtkSmartPointer<vtkImageMapper> imageMapper = vtkSmartPointer<vtkImageMapper>::New();
>    imageMapper->SetInputConnection(colorImage->GetProducerPort());
>    imageMapper->SetColorWindow(255);
>    imageMapper->SetColorLevel(127.5);
>    
>    vtkSmartPointer<vtkActor2D> imageActor = vtkSmartPointer<vtkActor2D>::New();
>    imageActor->SetMapper(imageMapper);
>    imageActor->SetPosition(0, 0);
>
>    // Create a vtkPoints object and store the points in it
>    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
>
>    // Create a cell array to store the polygon in and add the polygon to it
>    vtkSmartPointer<vtkCellArray> polygons = vtkSmartPointer<vtkCellArray>::New();
>
>    // Read the image which will be the texture
>    QImage* qimage = new QImage("logo.png");
>
>    vtkSmartPointer<vtkQImageToImageSource> qImageToVtk = vtkSmartPointer<vtkQImageToImageSource>::New();
>    qImageToVtk->SetQImage(qimage);
>
>    vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New();
>    texture->SetInputConnection(qImageToVtk->GetOutputPort());
>
>    vtkSmartPointer<vtkFloatArray> textureCoordinates = vtkSmartPointer<vtkFloatArray>::New();
>    textureCoordinates->SetNumberOfComponents(3);
>    textureCoordinates->SetName("TextureCoordinates");
>
>    // Create a polydata to store everything in
>    vtkSmartPointer<vtkPolyData> polygonPolyData = vtkSmartPointer<vtkPolyData>::New();
>
>    float tuple[3] = {0.0, 0.0, 0.0};
>    textureCoordinates->InsertNextTuple(tuple);
>    tuple[0] = 1.0; tuple[1] = 0.0; tuple[2] = 0.0;
>    textureCoordinates->InsertNextTuple(tuple);
>    tuple[0] = 1.0; tuple[1] = 1.0; tuple[2] = 0.0;
>    textureCoordinates->InsertNextTuple(tuple);
>    tuple[0] = 0.0; tuple[1] = 1.0; tuple[2] = 0.0;
>    textureCoordinates->InsertNextTuple(tuple);
>
>    // Add the points to the dataset
>    polygonPolyData->SetPoints(points);
>    polygonPolyData->SetPolys(polygons);
>    polygonPolyData->GetPointData()->SetTCoords(textureCoordinates);
>
>    // Setup actor and mapper
>    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
>    mapper->SetInput(polygonPolyData);
>
>    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
>    actor->SetMapper(mapper);
>    actor->SetTexture(texture);
>    actor->GetProperty()->SetColor(0.0, 0.62, 0.85);
>
>    points->SetNumberOfPoints(4);
>    points->SetPoint(0, 0, 0, 0);
>    points->SetPoint(1, 10, 0, 0);
>    points->SetPoint(2, 10, 10, 0);
>    points->SetPoint(3, 0, 10, 0);
>
>    vtkSmartPointer<vtkPolygon> top = vtkSmartPointer<vtkPolygon>::New();
>    top->GetPointIds()->SetNumberOfIds(4);
>    top->GetPointIds()->SetId(3, 0);
>    top->GetPointIds()->SetId(2, 1);
>    top->GetPointIds()->SetId(1, 2);
>    top->GetPointIds()->SetId(0, 3);
>
>    polygons->InsertNextCell(top);
>
>    vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();
>
>    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
>    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
>    renderWindow->AddRenderer(renderer);
>
>    // Setup render window interactor
>    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
>    vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
>    renderWindowInteractor->SetInteractorStyle(style);
>
>    // Render and start interaction
>    renderWindowInteractor->SetRenderWindow(renderWindow);
>
>    renderer->AddActor(actor);
>    renderer->AddActor(axes);
>    renderer->AddActor2D(imageActor);
>
>    renderWindow->Render();
>    renderWindowInteractor->Start();
>    
>    return EXIT_SUCCESS;
> }
>
> void CreateColorImage(vtkImageData* image)
> {
>    unsigned int dim = 50;
>    
>    image->SetDimensions(dim, dim, 1);
> #if VTK_MAJOR_VERSION <= 5
>    image->SetNumberOfScalarComponents(3);
>    image->SetScalarTypeToUnsignedChar();
>    image->AllocateScalars();
> #else
>    image->AllocateScalars(VTK_UNSIGNED_CHAR,3);
> #endif
>    for(unsigned int x = 0; x < dim; x++)
>    {
>       for(unsigned int y = 0; y < dim; y++)
>       {
>          unsigned char* pixel = static_cast<unsigned char*>(image->GetScalarPointer(x,y,0));
>          if(x < dim/2)
> 	{
>             pixel[0] = 255;
>             pixel[1] = 0;
> 	}
>          else
> 	{
>             pixel[0] = 0;
>             pixel[1] = 255;
> 	}
>        
>          pixel[2] = 0;
>       }
>    }
>    image->Modified();
> }
>
>     Elvis Dowson wrote
>     Hi, In the following code, I cannot get both vtkActor2D and
>     vtkActor to display simultaneously. If I enable 2D map source and
>     text source, it displays the map and the text. If I enable the 3D
>     cylinder source, the 3D cylinder doesnt get displayed. However, if
>     I disable the 2D map source, the cylinder and the text message
>     appears. How can I get the 2D map to display below, and the 3D
>     cylinder to appear to hover above the 2D map ? Am I mixing things
>     here? Should I be using vtkImageActor instead of vtkActor2D, so
>     that there is a 3D image plane and then display the 3D source? I
>     really dont want to do that at the moment. Please help! :-) Best
>     regards, Elvis Dowson
>
>     #include "qapplication.h"
>     #include <QtGui>
>
>     #include <vtkActor.h>
>     #include <vtkActor2D.h>
>     #include <vtkImageActor.h>
>     #include <vtkTextActor.h>
>     #include <vtkJPEGReader.h>
>     #include <vtkRenderer.h>
>     #include <vtkRenderWindow.h>
>     #include <vtkRenderWindowInteractor.h>
>     #include <vtkImageMapper.h>
>     #include <vtkPolyDataMapper.h>
>     #include <vtkCylinderSource.h>
>
>
>     #if QT_VERSION >= 0x040000
>     # include "ui_GUI4.h"
>     #endif
>
>     #define PROTOTYPE_2D_MAP_SOURCE
>     #define PROTOTYPE_2D_TEXT_SOURCE
>     #define PROTOTYPE_3D_CYLINDER_SOURCE
>
>
>     int main(int argc, char** argv)
>     {
>         QApplication app(argc, argv);
>     	
>     #if QT_VERSION >= 0x040000
>     	Ui::Dialog ui;
>     	QDialog dialog;
>     #endif
>     	
>     	ui.setupUi(&dialog);
>     	dialog.setAttribute(Qt::WA_QuitOnClose);
>     	
>     	// Qt vtk integration
>     	vtkRenderer* ren = NULL;
>     	ren = vtkRenderer::New();
>     		ui.qvtkWidget->GetRenderWindow()->AddRenderer(ren);
>     	
>     	// Prototype: 2D Map Source
>     	// ----------------------------
>     	#ifdef PROTOTYPE_2D_MAP_SOURCE
>        	{
>     	// Declare object instance variables
>     	vtkJPEGReader* imageReader	= NULL;
>     	vtkImageMapper* imageMapper = NULL;
>     	vtkActor2D* mapActor		= NULL;			
>     			
>     	// Read 2D image file
>     	imageReader = vtkJPEGReader::New();
>     		imageReader->SetFileName("/Users/elvis/Image/sample.jpg");
>     		imageReader->Update();
>     	
>     	// Map 2D image file
>     	imageMapper = vtkImageMapper::New();
>     		imageMapper->SetInput(imageReader->GetOutput());
>     		imageMapper->SetColorWindow(255);
>     		imageMapper->SetColorLevel(127.5);
>     		
>     	// Actor in scene
>     	mapActor = vtkActor2D::New();
>     		mapActor->SetMapper(imageMapper);	
>
>     	// Actor in scene
>     	mapActor = vtkActor2D::New();
>     		//mapActor->SetLayerNumber(0);
>     		mapActor->SetMapper(imageMapper);			
>
>     	// Add Actor to renderer
>     	ren->AddActor2D(mapActor);
>     	}
>     	#endif
>
>     	// Prototype: 2D Text Source
>     	// -----------------------------
>     	#ifdef PROTOTYPE_2D_TEXT_SOURCE
>     	{
>     		// Declare object instance variables
>     		vtkTextActor* textActor;
>     		
>     		// Initialize objects
>     		textActor = NULL;
>     		
>     		// Actor in scene
>     		textActor = vtkTextActor::New();
>     		textActor->SetTextScaleMode(vtkTextActor::TEXT_SCALE_MODE_NONE);
>     		textActor->SetInput("This is a text message!");
>     		
>     		// Add Actor to renderer
>     		ren->AddActor2D(textActor);
>     	}
>     	#endif
>     	
>
>     	// Prototype: 3D Cyclinder Source
>     	// ----------------------------------
>     	#ifdef PROTOTYPE_3D_CYLINDER_SOURCE	
>     	{
>     	// Declare object instance variables
>     	vtkCylinderSource* source;
>     	vtkPolyDataMapper* mapper;
>     	vtkActor* actor;
>
>     	// Initialize objects
>     	source = NULL;
>     	mapper = NULL;
>     	actor = NULL;
>     	
>     	// Geometry
>     	source = vtkCylinderSource::New();
>     	
>     	// Mapper
>     	mapper = vtkPolyDataMapper::New();
>     	mapper->ImmediateModeRenderingOn();
>     	mapper->SetInputConnection(source->GetOutputPort());
>     	
>     	// Actor in scene
>     	actor = vtkActor::New();
>     	actor->SetMapper(mapper);
>     	
>     	// Add Actor to renderer
>     	ren->AddActor(actor);
>     	}
>     	#endif
>     	
>     	// Reset camera
>     	ren->ResetCamera();
>     	
>     	// Render the scene
>     	ren->GetRenderWindow()->Render();
>     	
>     	// Display the dialog window
>     	dialog.show();
>
>         return app.exec();
>     }
>
>     _______________________________________________ This is the
>     private VTK discussion list. Please keep messages on-topic. Check
>     the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ Follow this link to
>     subscribe/unsubscribe: http://www.vtk.org/mailman/listinfo/vtkusers
>
>
> ------------------------------------------------------------------------
> View this message in context: Re: Problem getting vtkActor2D and 
> vtkActor to render simultaneously 
> <http://vtk.1045678.n5.nabble.com/Problem-getting-vtkActor2D-and-vtkActor-to-render-simultaneously-tp1241640p5718018.html>
> Sent from the VTK - Users mailing list archive 
> <http://vtk.1045678.n5.nabble.com/VTK-Users-f1224199.html> at Nabble.com.
>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers

Has anyone encountered this?

Thanks,
Dominic

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20130129/7db64b4e/attachment.htm>


More information about the vtkusers mailing list