[vtkusers] 3d texture map volume rendering

Sun Geun Kim sungeun at ecn.purdue.edu
Mon Jun 27 13:40:27 EDT 2005


Hi,

I am testing cvs-version VTK library on MS Windows platform(Win XP).There 
was no problem in compilation. However, when I test vtkVolumeTextureMap3D 
mapper with a simple volume (headsq/quater), it always gives me an error 
message. Does this mapper work correctly? I checked out the source code on 
June 20th. If it works right, can I get any example c-source code?

For your refernce, I attach my file. If there is anybody who make that 
mapper work, please check my source code.

Thank you in advance

===========================
Sun Geun Kim
Ph.D student
School of Electrical and Computer Engineering
Purdue University

---------------------------
email: sungeun at ecn.purdue.edu
-------------- next part --------------
/*=========================================================================



  Program:   Visualization Toolkit

  Module:    $RCSfile: Medical3.cxx,v $



  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen

  All rights reserved.

  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.



     This software is distributed WITHOUT ANY WARRANTY; without even

     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR

     PURPOSE.  See the above copyright notice for more information.



=========================================================================*/



// 

// This example reads a volume dataset, extracts two isosurfaces that

// represent the skin and bone, creates three orthogonal planes 

// (saggital, axial, coronal), and displays them.

//

#include "vtkRenderer.h"

#include "vtkRenderWindow.h"

#include "vtkRenderWindowInteractor.h"

#include "vtkVolume16Reader.h"

#include "vtkCamera.h"

#include "vtkImageData.h"

#include "vtkPiecewiseFunction.h"

#include "vtkVolume.h"

#include "vtkVolumeProperty.h"

#include "vtkColorTransferFunction.h"

#include "vtkVolumeRayCastCompositeFunction.h"

#include "vtkVolumeRayCastIsosurfaceFunction.h"

#include "vtkVolumeRayCastMIPFunction.h"

#include "vtkVolumeRayCastMapper.h"

#include "vtkVolumeTextureMapper2D.h"

#include "vtkVolumeTextureMapper3D.h"



int main (int argc, char **argv)

{

  if (argc < 2)

    {

      cout << "Usage: " << argv[0] << " DATADIR/headsq/quarter" << endl;

    return 1;

    }



  // Create the renderer, the render window, and the interactor. The

  // renderer draws into the render window, the interactor enables

  // mouse- and keyboard-based interaction with the data within the

  // render window.

  //

  vtkRenderer *aRenderer = vtkRenderer::New();

  vtkRenderWindow *renWin = vtkRenderWindow::New();

    renWin->AddRenderer(aRenderer);

  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();

    iren->SetRenderWindow(renWin);



  // The following reader is used to read a series of 2D slices (images)

  // that compose the volume. The slice dimensions are set, and the

  // pixel spacing. The data Endianness must also be specified. The

  // reader usese the FilePrefix in combination with the slice number to

  // construct filenames using the format FilePrefix.%d. (In this case

  // the FilePrefix is the root name of the file: quarter.)

  vtkVolume16Reader *v16 = vtkVolume16Reader::New();

    v16->SetDataDimensions(64,64);

    v16->SetDataByteOrderToLittleEndian();

    v16->SetFilePrefix (argv[1]);

    v16->SetImageRange(1, 93);

    v16->SetDataSpacing (3.2, 3.2, 1.5);

/*

  vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New();

  compositeFunction->SetCompositeMethodToInterpolateFirst();



  vtkVolumeRayCastMIPFunction *MIPFunction = vtkVolumeRayCastMIPFunction::New();

  MIPFunction->SetMaximizeMethodToScalarValue();



  vtkVolumeRayCastIsosurfaceFunction *isosurfaceFunction = vtkVolumeRayCastIsosurfaceFunction::New();

  isosurfaceFunction->SetIsoValue(80);

*/

  // Create a transfer function mapping scalar value to color (color)

  vtkColorTransferFunction *cTFun = vtkColorTransferFunction::New();

  cTFun->AddRGBPoint(  0.0, 0.0, 0.0, 0.0 );

  cTFun->AddRGBPoint(  500.0, 1.0, 0.49, 0.35 );

  cTFun->AddRGBPoint( 800.0, 0.81, 0.27, 0.1 );

  cTFun->AddRGBPoint( 1150.0, 0.92,0.9, 0.89 );

  cTFun->AddRGBPoint( 4095.0, 0.5, 0.5, 0.5 );



  // Create a transfer function mapping magnitude of gradient to opacity

  vtkPiecewiseFunction *goTFun = vtkPiecewiseFunction::New();

  goTFun->AddPoint(   0, 0.0 );

  goTFun->AddPoint(  50, 0.0 );

  goTFun->AddPoint(  150, 1.0 );



  vtkPiecewiseFunction *oTFun = vtkPiecewiseFunction::New();

  oTFun->AddPoint(20.0, 0.0);

  oTFun->AddSegment(20.0, 0.0, 500.0, 0.15);

  oTFun->AddSegment(500.0, 0.2, 1150.0, 0.35);

  oTFun->AddSegment(1150.0, 0.8, 3000.0, 0.45);



  vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();

	volumeProperty->SetColor(cTFun);

	volumeProperty->SetGradientOpacity(goTFun);

	volumeProperty->SetScalarOpacity(oTFun);

	volumeProperty->ShadeOn();

	volumeProperty->SetInterpolationTypeToLinear();

//	volumeProperty->SetAmbient(material->GetAmbient());

//	volumeProperty->SetDiffuse(material->GetDiffuse());

//	volumeProperty->SetSpecular(material->GetSpecular());

//	volumeProperty->SetSpecularPower(material->GetSpecularPower());



	vtkVolume *volume = vtkVolume::New();



	vtkVolumeTextureMapper3D *textureMap3D = vtkVolumeTextureMapper3D::New();

	textureMap3D->IsRenderSupported(volumeProperty);

	textureMap3D->SetInput(v16->GetOutput());



	volume->SetMapper(textureMap3D);

	volume->SetProperty(volumeProperty);



  // It is convenient to create an initial view of the data. The

  // FocalPoint and Position form a vector direction. Later on

  // (ResetCamera() method) this vector is used to position the camera

  // to look at the data in this direction.

  vtkCamera *aCamera = vtkCamera::New();

    aCamera->SetViewUp (0, 0, -1);

    aCamera->SetPosition (0, 1, 0);

    aCamera->SetFocalPoint (0, 0, 0);

    aCamera->ComputeViewPlaneNormal();



  // Actors are added to the renderer. 

	aRenderer->AddVolume(volume);



  // An initial camera view is created.  The Dolly() method moves 

  // the camera towards the FocalPoint, thereby enlarging the image.

  aRenderer->SetActiveCamera(aCamera);

  aRenderer->Render();

  aRenderer->ResetCamera ();

  aCamera->Dolly(1.5);



  // Set a background color for the renderer and set the size of the

  // render window (expressed in pixels).

  aRenderer->SetBackground(1,1,1);

  renWin->SetSize(640, 480);



  // Note that when camera movement occurs (as it does in the Dolly()

  // method), the clipping planes often need adjusting. Clipping planes

  // consist of two planes: near and far along the view direction. The 

  // near plane clips out objects in front of the plane; the far plane

  // clips out objects behind the plane. This way only what is drawn

  // between the planes is actually rendered.

  aRenderer->ResetCameraClippingRange ();



  // interact with data

  iren->Initialize();

  iren->Start(); 



  // It is important to delete all objects created previously to prevent

  // memory leaks. In this case, since the program is on its way to

  // exiting, it is not so important. But in applications it is

  // essential.

  v16->Delete();

  aCamera->Delete();

  aRenderer->Delete();

  renWin->Delete();

  iren->Delete();



  volume->Delete();

  volumeProperty->Delete();



  oTFun->Delete();

  goTFun->Delete();

  cTFun->Delete();



  textureMap3D->Delete();



  return 0;

}



More information about the vtkusers mailing list