[vtkusers] 3d texture map volume rendering
Yogi Girdhar
yogi.girdhar at kitware.com
Mon Jun 27 13:54:44 EDT 2005
What is the error?
What kind of graphics card do you have? As far as I know, this mapper is
highly dependent on your graphics hardware. I know it works for newer
NVIDIA cards, but I am not sure about others.
-Yogi
Sun Geun Kim wrote:
> 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
>
>------------------------------------------------------------------------
>
>/*=========================================================================
>
>
> 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;
>
>}
>
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>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
>
>
More information about the vtkusers
mailing list