[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