[vtkusers] Volume rendering with png slice images

Joseph D. Wieber Jr. jdwieber at gmail.com
Wed Aug 3 19:18:40 EDT 2011


Hi all,

I'm trying to do some volume rendering using the below code, but nothing 
is showing in the render window.  When I run the code I see the window 
and the background color that I set, but no data.  The code cranks for 
about 5 seconds before I see the default render window replaced (the 
default render window is white, and the volume render window is 
gray-ish).  I don't see error messages in the console either.

I'm using Qt with QVTKWidget to create the GUI.  I'm obviously doing 
something wrong, but I don't see what it is.  Does anyone see what I'm 
missing?  Thanks.

Regards,

Joseph

void MainWindow::on_actionOpenDirectory_triggered()
{
     QString dirname = QFileDialog::getExistingDirectory( this,
                                                         tr("Select a 
Directory"),
                                                         
QDir::currentPath() );
     if( !dirname.isNull() )
     {
         string pattern( dirname.toStdString () );
         pattern += "/%03d.png";
         cerr << "using pattern:<" << pattern << ">\n";

         vtkSmartPointer< vtkVolume > spVolume = generateVolume ( pattern );

         vtkSmartPointer<vtkRenderWindow> spRenWin =
                 vtkSmartPointer<vtkRenderWindow>::New();

         vtkSmartPointer< vtkRenderer> spRen =
                 vtkSmartPointer< vtkRenderer >::New();
         spRen->AddViewProp ( spVolume );

         spRenWin->AddRenderer( spRen );
         m_pUi->qvtkWidget->SetRenderWindow ( spRenWin );
         vtkSmartPointer< vtkRenderWindowInteractor > spIren =
                 m_pUi->qvtkWidget->GetInteractor ();
         spIren->SetRenderWindow( spRenWin );
         spRen->SetBackground( 0.2, 0.3, 0.4 );
         spRen->ResetCamera ();

         //I tried this in place of ResetCamera, but id didn't work either
         //        vtkSmartPointer< vtkCamera > spCamera = 
spRen->GetActiveCamera();
         //        double* c = spVolume->GetCenter();
         //        spCamera->SetFocalPoint( c[ 0 ], c[ 1 ], c[ 2 ] );
         //        spCamera->SetPosition( c[ 0 ] + 400, c[ 1 ], c[ 2 ] );
         //        spCamera->SetViewUp( 0, 0, -1 );


         spRenWin->Render();
         m_pUi->qvtkWidget->setCursor ( Qt::ArrowCursor );
     }
     else
     {
         //TODO: do something intelligent here!
     }
}


//---------------------------------------------------------------------------------------------------------------------------
vtkSmartPointer< vtkVolume > MainWindow::generateVolume( const 
std::string& pattern )
{
     //m_spReader is a vtkSmartPointer< vtkPNGReader >
     m_spReader->SetFilePattern ( pattern.c_str () );
     m_spReader->SetFileNameSliceOffset ( 1 );//images start at 001.png
     //TODO: derive these from input
     m_spReader->SetDataExtent( 0, 511, 0, 511, 1, 370 );//images go 
from 1 to 370
     m_spReader->SetDataSpacing( 1.0, 1.0, 1.0 ); // mm
     m_spReader->SetDataOrigin( 0, 0, 0 );
     m_spReader->SetDataScalarTypeToUnsignedChar();
     //m_spReader->Update();

     vtkSmartPointer< vtkPiecewiseFunction > spOpacityTransferFunction =
             vtkSmartPointer< vtkPiecewiseFunction >::New();
     spOpacityTransferFunction->AddPoint( 0, 0.0 );
     spOpacityTransferFunction->AddPoint( 255, 1.0 );

     vtkSmartPointer< vtkVolumeProperty > spVolumeProperty =
             vtkSmartPointer< vtkVolumeProperty >::New();
     spVolumeProperty->SetScalarOpacity( 0, spOpacityTransferFunction );
     spVolumeProperty->SetScalarOpacity( 1, spOpacityTransferFunction );
     spVolumeProperty->SetScalarOpacity( 2, spOpacityTransferFunction );
     spVolumeProperty->IndependentComponentsOff();
     spVolumeProperty->SetInterpolationTypeToLinear();
     //spVolumeProperty->ShadeOn();
     //spVolumeProperty->SetAmbient( 0.4 );
     //spVolumeProperty->SetDiffuse( 0.6 );
     //spVolumeProperty->SetSpecular( 0.2 );

     vtkSmartPointer< vtkFixedPointVolumeRayCastMapper > spVolumeMapper =
             vtkSmartPointer< vtkFixedPointVolumeRayCastMapper >::New();

     spVolumeMapper->SetInputConnection( m_spReader->GetOutputPort() );

     vtkSmartPointer< vtkVolume > spVolume =
             vtkSmartPointer< vtkVolume >::New();
     spVolume->SetMapper( spVolumeMapper );
     spVolume->SetProperty( spVolumeProperty );

     return spVolume;
}




More information about the vtkusers mailing list