[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