[vtkusers] A Problem Viewing 3D vtkImageData
Shashwath T.R.
trshash at gmail.com
Thu Sep 23 06:41:32 EDT 2010
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>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
>
> 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/b7ee64c4/attachment.htm>
More information about the vtkusers
mailing list