Search code examples
c++visual-studiovtk

Apply an image on cube faces - VTK


I use VTK on visual studio 2010, I would like apply an image on the cube faces.

Code to read my image :

// Read JPG image
vtkSmartPointer<vtkJPEGReader> JPEGReader = vtkSmartPointer<vtkJPEGReader>::New();
JPEGReader->SetFileName(argv[1]);
JPEGReader->Update();

// Image actor
vtkSmartPointer<vtkImageActor> imageActor = vtkSmartPointer<vtkImageActor>::New();
imageActor->GetMapper()->SetInputData(JPEGReader->GetOutput());

Setup cube code :

// Setup cube
vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New();
cubeSource->Update();
vtkSmartPointer<vtkPolyDataMapper> cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cubeMapper->SetInputConnection(cubeSource->GetOutputPort());
vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New();
cubeActor->SetMapper(cubeMapper);
cubeActor->GetProperty()->SetDiffuseColor(.3, .6, .4);

How I do that ?


Solution

  • You need to use a texture and a texture map to achieve what you want. I adapted a small example from this one (although in python) that can help you with a starting point. In this case, vtkTextureMapToPlane is not the ideal one, because it only covers 2 faces of the cube (check out the image below). However, I think vtkTextureMapToBox, as in this link, should be able to do the trick (I could not use it because I am using VTK 5.8).

    Code:

    import vtk
    
    # Create a render window
    ren = vtk.vtkRenderer()
    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(ren)
    renWin.SetSize(480,480)
    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
    
    # Generate a cube 
    cube = vtk.vtkCubeSource()
    
    # Read the image data from a file
    reader = vtk.vtkJPEGReader()
    reader.SetFileName("yourimage.jpg")
    
    # Create texture object
    texture = vtk.vtkTexture()
    texture.SetInputConnection(reader.GetOutputPort())
    
    #Map texture coordinates
    map_to_plane = vtk.vtkTextureMapToPlane()
    map_to_plane.SetInputConnection(cube.GetOutputPort())
    
    # Create mapper and set the mapped texture as input
    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(map_to_plane.GetOutputPort())
    
    # Create actor and set the mapper and the texture
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    actor.SetTexture(texture)
    
    ren.AddActor(actor)
    
    iren.Initialize()
    renWin.Render()
    iren.Start()
    

    Result:

    enter image description here