[vtkusers] A Problem Viewing 3D vtkImageData
Alex Southern
mrapsouthern at gmail.com
Thu Sep 23 08:02:46 EDT 2010
Hi,
Thanks for the reply, unfortunately I'm properly stumped,
vtkSmartVolumeMapper sounds promising but its not installed (not a clue
where to start), can't find anything useful on vtkGPURayCastMapper and
the only example I found using vtkFixedPointVolumeRayCastMapper at
http://www.paraview.org/Wiki/VTK/Examples/Cxx/VolumeRendering/MinIntensityRendering
which is a bad example of volume rendering (IMHO), has almost put me off
using VTK for this portion of the project if that is the best on offer.
Can anyone show me an example or at least a screenshot of some volume
rendered data that will at least show that VTK can do this well and give
me some incentive to carry on with it?
Thanks
Alex
On 23.9.2010 13:41, Shashwath T.R. wrote:
> Hi Alex,
>
> You'll need to view it as a volume, not a vtkImageActor. vtkImageActor
> is purely 2D.
>
> Take a look at this example (if you don't have vtkSmartVolumeMapper,
> you can use vtkFixedPointVolumeRayCastMapper or vtkGPURayCastMapper):
> http://www.vtk.org/Wiki/VTK/Examples/Cxx/VolumeRendering/SmartVolumeMapper
>
> Regards,
> Shash
>
> On Thu, Sep 23, 2010 at 2:50 PM, Alex Southern <mrapsouthern at gmail.com
> <mailto:mrapsouthern at gmail.com>> wrote:
>
> Hi,
>
> Im trying to view a regular 3D grid of points using vtkImageData.
> Each point is a single scalar that is mapped to a color.
> I've included the complete source code and cmakelists.txt file of
> a simplified problem scenario.
>
> Basically, can someone confirm that they also do not see a cuboid
> but instead a 2D plane, why is this?
>
> In addition, the render window is not updated after each
> iteration as I intended. What am I doing wrong?
>
> (Note the source is called ImageSlicing.cpp, but I am not at the
> stage of the slicing yet, I want to view the whole 3D pressure
> field first)
>
> Thanks
> Alex
>
> // ----------- CmakeLists.txt ------------------
>
> cmake_minimum_required(VERSION 2.6)
>
> PROJECT(ImageSlicing)
>
> FIND_PACKAGE(VTK REQUIRED)
> INCLUDE(${VTK_USE_FILE})
>
> ADD_EXECUTABLE(ImageSlicing ImageSlicing.cpp)
> TARGET_LINK_LIBRARIES(ImageSlicing vtkHybrid vtkWidgets)
>
> //------------------------------ End Cmakelists.txt
>
> // --------------------------Start ImageSlicing.cpp
> ----------------------------------------
> #include "vtkSmartPointer.h"
> #include "vtkImageReslice.h"
> #include "vtkLookupTable.h"
> #include "vtkImageMapToColors.h"
> #include "vtkImageActor.h"
> #include "vtkRenderer.h"
> #include "vtkRenderWindow.h"
> #include "vtkRenderWindowInteractor.h"
> #include "vtkInteractorStyleImage.h"
> #include "vtkCommand.h"
> #include "vtkImageData.h"
> #include "vtkPointData.h"
> #include "vtkProperty.h"
> #include "vtkFloatArray.h";
> #include "vtkLookupTable.h";
> #include "vtkScalarBarActor.h";
> #include "vtkImageMapToColors.h";
>
> int RunMockSimulationStep(int L, int W, int H, int offset1, int
> offset2, float* p, int numPoints)
> {
>
> for(int z = 1; z < H-1;z++)
> {
> for(int y = 1; y < W-1;y++)
> {
> for(int x = 1; x < L-1;x++)
> {
> p[offset1+(z*L*W)+(y*W)+x] = (1.0/6.0)*
> (p[offset2+((z+1)*L*W)+(y*W)+x] +
> p[offset2+((z-1)*L*W)+(y*W)+x] +
> p[offset2+(z*L*W)+((y+1)*W)+x] +
> p[offset2+(z*L*W)+((y-1)*W)+x] +
> p[offset2+(z*L*W)+(y*W)+x+1] +
>
> p[offset2+(z*L*W)+(y*W)+x-1]) -
>
> p[offset1+(z*L*W)+(y*W)+x];
> }
> }
> }
>
> return 0;
> }
>
> int main (int argc, char *argv[])
> {
>
> // Setup Scalar Data Memory
> int L = 100; // Set Length/Width/Height of Pressure grid
> int W = 50;
> int H = 100;
> int numPoints = L*W*H;
> float* pressure;
> pressure = new float [2*numPoints]; // There are two pressure
> grids; we only want to view the first one though...
> float** viewPressure;
> viewPressure = new float* [numPoints];
>
> //Create any required VTK objects
> vtkSmartPointer<vtkFloatArray> vtkPressure =
> vtkSmartPointer<vtkFloatArray>::New();
> vtkSmartPointer<vtkImageData> imageData =
> vtkSmartPointer<vtkImageData>::New();
> vtkSmartPointer<vtkLookupTable> table =
> vtkSmartPointer<vtkLookupTable>::New();
> vtkSmartPointer<vtkImageMapToColors> color =
> vtkSmartPointer<vtkImageMapToColors>::New();
> vtkSmartPointer<vtkImageActor> imActor =
> vtkSmartPointer<vtkImageActor>::New();
> vtkSmartPointer<vtkRenderer> ren =
> vtkSmartPointer<vtkRenderer>::New();
> vtkSmartPointer<vtkRenderWindow> renWin =
> vtkSmartPointer<vtkRenderWindow>::New();
> vtkSmartPointer<vtkRenderWindowInteractor> iren =
> vtkSmartPointer<vtkRenderWindowInteractor>::New();
>
> // Specify the size of the image data
> imageData->SetDimensions(W,L,H);
> imageData->SetOrigin(0,0,0);
> imageData->SetSpacing(1.0,1.0,1.0);
> imageData->SetNumberOfScalarComponents(1);
> imageData->SetScalarTypeToFloat();
> imageData->AllocateScalars();
>
>
> int* dims = imageData->GetDimensions();
> std::cout << "ImageData Dimensions: " << "x: " << dims[0] << "
> y: " << dims[1] << " z: " << dims[2] << std::endl;
>
> //Initialize pressure across grid to zero
> for(int z = 0; z < H;z++)
> {
> for(int y = 0; y < W;y++)
> {
> for(int x = 0; x < L;x++)
> {
> pressure[(z*L*W)+(y*W)+x] = 0.0;
> pressure[numPoints+(z*L*W)+(y*W)+x] = 0.0;
> viewPressure[(y*W)+x] = &pressure[(z*L*W)+(y*W)+x];
> }
> }
> }
>
> // Now point imageData to the pressure vector points
> vtkPressure->SetArray(*viewPressure,L*W,1);
> imageData->GetPointData()->SetScalars(vtkPressure);
> vtkPressure->Modified();
>
> // Create a scale lookup table
> double r = 0;
> double g = 0;
> double b = 1.0;
> table->SetRange(-0.02, 0.02); // image intensity range
> table->SetNumberOfTableValues(64);
> for (int x = 0; x < 64 ; x++)
> {
> if (x > 32) { r = 1.0; g = g - 0.0312; b = b - 0.0312; }
> if (x == 32){ r = 1.0; g = 1.0; b = 1.0; }
> if (x < 32) { r = r + 0.0312; g = g + 0.0312; b
> = 1.0; }
> table->SetTableValue(x,r,g,b,1.0);
> }
> table->SetTableValue(32,1,1,1,1.0); // make sure middle value
> is total black
> table->SetRampToLinear();
> table->Build();
>
> // Map the image through the lookup table
> color->SetLookupTable(table);
> color->SetInput(imageData);
> imActor->SetInput(color->GetOutput());
>
> // Setup Interactor Renderer, RenderWindow etc...
> ren->AddActor(imActor);
> ren->SetBackground(0.0,0.0,0.0);
> renWin->SetInteractor(iren);
> renWin->AddRenderer(ren);
> renWin->Render();
>
> //Initial Condition - Set a pressure point to non-zero
> int xi = 20; int yi = 40; int zi = 36;
> pressure[(zi*L*W)+(yi*W)+xi] = 100.0;
>
> int T = 50; //Set number of time steps
> int offset1 = numPoints;
> int offset2 = 0;
> int tmp = 0;
>
> for (int t = 0; t < T; t++)
> {
>
> cout << t << endl;
>
> RunMockSimulationStep(L,W,H,offset1,offset2,pressure,numPoints);
>
> //Update Pressure Field View Here
> // How?
> vtkPressure->Modified();
> renWin->Render();
>
> // cycle offset
> tmp = offset1;
> offset1 = offset2;
> offset2 = tmp;
> }
>
> system("pause");
> delete []pressure;
> delete []viewPressure;
> return EXIT_SUCCESS;
> }
>
> // --------------- END CPP
> _______________________________________________
> Powered by www.kitware.com <http://www.kitware.com>
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20100923/6a2b5af5/attachment.htm>
More information about the vtkusers
mailing list