[vtkusers] [Edit]: UGrid volume ray cast Bug?

Juan José Aja Fernández juan.aja at gmail.com
Wed Apr 5 20:37:40 EDT 2006


(Sorry for the double post, The first url was broken)

Hi, Everyone:

This is the third time I'm posting about this issue, of the previous two one
remained unanswered and the last one I've got a kind response by Randall
Hand: http://public.kitware.com/pipermail/vtkusers/2006-February/083786.html

 who pointed me in the direction of this fixed bug:

http://www.vtk.org/Bug/bug.php?op=show&bugid=2546&pos=3 but the problem
persists.

I think the vtkUnstructuredGridVolumeRayCastMapper has some serious bug
(look at the screenshots posted in the thread that Randall answered), and to
prove It I think I need to post my entire example code:

(Really, I think I'm on to something, specially If you consider that the
mapper for unstructured grids is fairly new, but I didn't want to litter the
bug report with false positives).


#include "vtkVoxel.h"
#include "vtkCellData.h"
#include "vtkRenderer.h"
#include "vtkPoints.h"
#include "vtkUnstructuredGrid.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkColorTransferFunction.h"
#include "vtkPiecewiseFunction.h"
#include "vtkVolume.h"
#include "vtkVolumeProperty.h"
#include "vtkUnstructuredGridWriter.h"
#include "vtkDoubleArray.h"
#include "vtkDataSetTriangleFilter.h"
#include "vtkUnstructuredGridVolumeRayCastMapper.h"
#include "vtkUnstructuredGridVolumeRayCastFunction.h"
#include "vtkImageData.h"
#include "vtkDataSetToImageFilter.h"
#include "stdio.h"
#include "iostream.h"
#include "fstream.h"
#include "string.h"
#include "vtkOpenGLRenderer.h"
#include "vtkXOpenGLRenderWindow.h"
#include "vtkXRenderWindowInteractor.h"


int main(int argc, char *dim[])
{

  int dim_x =  atoi(dim[1]);
  int dim_y =  atoi(dim[1]);
  int dim_z =  atoi(dim[1]);
  int i, j, k;
  int no_points = dim_x * dim_x * dim_x;
  int no_voxels = (dim_x-1) * (dim_x-1) * (dim_x-1);

  vtkPoints *points = vtkPoints::New();
  points->SetNumberOfPoints(no_points);
  points->SetDataTypeToDouble();

  for(k=0; k< dim_z; k++)
    for(j=0; j< dim_y; j++)
      for(i=0; i< dim_x; i++)
        points->InsertNextPoint(i, j, k);

  vtkDoubleArray *pts = vtkDoubleArray::New();
  pts->SetName("pts");

  for(i=0; i < no_voxels; i++)
    pts->InsertNextValue(i);

  vtkUnstructuredGrid *grid = vtkUnstructuredGrid::New();

  vtkColorTransferFunction *funtrans = vtkColorTransferFunction::New();

  //To create the grid we need to know if we are in any of the
  //cube limits (height, width, depth), to prevent from adding
  //inexistant cells
  j=0;
  k=0;
  int w = 0;
  int count = 0;
  vtkVoxel *v = vtkVoxel::New();

  for(i=0; i< (no_points - ((dim_x * dim_x) + (dim_x + 1))); i++) {
    if(j != dim_x - 1 && k!= dim_x - 1) {
      (v->GetPointIds())->SetId(0, i);
      (v->GetPointIds())->SetId(1, i+1);
      (v->GetPointIds())->SetId(2, i+dim_x);
      (v->GetPointIds())->SetId(3, i+dim_x+1);
      (v->GetPointIds())->SetId(4, i + (dim_x * dim_y));
      (v->GetPointIds())->SetId(5, i + (dim_x * dim_y) + 1);
      (v->GetPointIds())->SetId(6, i + (dim_x * dim_y) + dim_x);
      (v->GetPointIds())->SetId(7, i + (dim_x * dim_y) + dim_x + 1);
      grid->InsertNextCell(v->GetCellType(), v->GetPointIds());

      j++;
      count++;
    }
    else {
      if(j == dim_x-1) {
        j=0;
        k++;
        if(k == dim_x-1) {
          j=0;
          k=0;
          i = i+dim_x;
          w++;
        }
      }
    }
  }
  grid->SetPoints(points);

  vtkCellData *cd = grid->GetCellData();
  cd->SetNumberOfTuples(no_voxels);
  cd->SetScalars(pts);

  int idx = 0;
  while (idx < no_voxels) {
    if (idx%2 == 0 )

      funtrans->AddRGBPoint(pts->GetValue(idx), 1, 0, 0);
    else funtrans->AddRGBPoint(pts->GetValue(idx), 0, 1,0);

    idx++;
  }
  vtkOpenGLRenderer *renderer = vtkOpenGLRenderer::New();
  vtkXOpenGLRenderWindow *renwin =  vtkXOpenGLRenderWindow::New();
  vtkXRenderWindowInteractor *iren = vtkXRenderWindowInteractor::New();

  renwin->AddRenderer(renderer);
  iren->SetRenderWindow(renwin);

  vtkPiecewiseFunction *funop = vtkPiecewiseFunction::New();
  funop->AddPoint(0, 1);
  funop->AddPoint(no_voxels, 1);

  vtkVolumeProperty *vp = vtkVolumeProperty::New();
  vp->SetColor(funtrans);
  vp->SetScalarOpacity(funop);

  vtkUnstructuredGridVolumeRayCastMapper *vrcm =
vtkUnstructuredGridVolumeRayCastMapper::New();

  vtkDataSetTriangleFilter *filter = vtkDataSetTriangleFilter::New();
  filter->SetInput(grid);

  vrcm->SetInput(filter->GetOutput());

  vtkVolume *volume = vtkVolume::New();
  volume->SetMapper(vrcm);
  volume->SetProperty(vp);

  renderer->AddActor(volume);

  renwin->Render();
  iren->Start();
}


This will attempt to create a cube with dimensions arg[1] coloring odd and
even cells with green and red.
Try it with argv[1] = 6, then argv[1] = 20, see the results.

Is this a bug, or I'm doing things the wrong way?


Thanks in advance,

Juan.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20060405/1f091fa0/attachment.htm>


More information about the vtkusers mailing list