[vtkusers] Announcement: New image rendering classes for VTK

Dženan Zukić dzenanz at gmail.com
Wed Jun 29 13:23:36 EDT 2011


I tried trial and error: premultiply translation, postmultiply, divide by
and multiply by spacing, all that unsuccessfully. Now I need to work out the
math :D

2011/6/29 David Gobbi <david.gobbi at gmail.com>

> Hi Dzenan,
>
> For your code, my guess is that the "translation" part of the 4x4
> matrix should be set to something like the origin multiplied by the
> rotation matrix, but there might be other little details that you need
> to take care of.  My only suggestion is that you don't try to fix it
> through trial-end-error.  Use pencil-and-paper to work through the
> math.
>
>  - David
>
> 2011/6/29 Dženan Zukić <dzenanz at gmail.com>:
> > Hi David,
> >
> > with this I try to do what you suggested, i.e. consider VTK's world
> > coordinate system as DICOM patient coordinate system:
> > //red is the transformation-related code
> > void MainWindow::updateVisualization()
> > {
> >     typedef itk::ImageToVTKImageFilter<VisualizingImageType>
> > itkVtkConverter;
> >     itkVtkConverter::Pointer conv=itkVtkConverter::New();
> >     conv->SetInput(logic->visualizing);
> >     vtkGPUVolumeRayCastMapper *mapper = vtkGPUVolumeRayCastMapper::New();
> >     mapper->SetInput(conv->GetOutput());
> >     if (volume)
> >         volume->Delete();
> >     volume=vtkVolume::New();
> >     volume->SetProperty( myTransferFunction );
> >     volume->SetMapper( mapper );
> >     mapper->SetBlendModeToComposite();
> >     VisualizingImageType::DirectionType
> > d=logic->visualizing->GetDirection();
> >     vtkMatrix4x4 *mat=vtkMatrix4x4::New();
> >     for (int i=0; i<3; i++)
> >         for (int k=0; k<3; k++)
> >             mat->SetElement(i,k, d(i,k));
> >     mat->SetElement(3,3, 1);
> >     VisualizingImageType::SpacingType sp =
> logic->visualizing->GetSpacing();
> >     VisualizingImageType::PointType
> origin=logic->visualizing->GetOrigin();
> >     for (int i=0; i<3; i++)
> >         mat->SetElement(i,3, origin[i]/sp[i]);
> >     volume->SetUserMatrix(mat); //orientation and size OK, position wrong
> >     vtkRenderer *renderer =
> > vis->GetRenderWindow()->GetRenderers()->GetFirstRenderer();
> >     renderer->RemoveAllViewProps();
> >     renderer->AddVolume( volume );
> >     defaultCameraPos(); //centers view on the volume, looking at it from
> > left
> >     vis->GetRenderWindow()->Render();
> >
> >
> vis->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->ResetCamera();
> > }
> > The polygonal data is in DICOM's patient coordinate system (vertex
> positions
> > from itk::Image->TransformIndexToPhysicalPoint() etc). The orientation is
> > correct, but I can't get the position correctly. I have tried
> > -origin[i]/sp[i], origin[i]*sp[i], origin[i], -origin[i], -2*origin[i]
> and
> > similar combinations but none of them worked. Any suggestion to what am I
> > doing wrong?
> > Regards,
> > Dženan
> > 2011/6/29 David Gobbi <david.gobbi at gmail.com>
> >>
> >> On Tue, Jun 28, 2011 at 9:40 AM, Dženan Zukić <dzenanz at gmail.com>
> wrote:
> >> > Hi David,
> >> >
> >> > I am interested in this too:
> >> > Does the above approach affect the polygonal actors in the scene
> >> > (segmented
> >> > parts of the image)?
> >> > Regards,
> >> > Dženan
> >>
> >> When the DICOM patient coordinate system is used as the VTK world
> >> coordinate system, the assumption is that everything (images AND
> >> polydata) would have a either already be in the patient coordinate
> >> system, or if not, you would to have a 4x4 transform to set as the
> >> actor's UserMatrix (or UserTransform).  I.e. a transform to bring the
> >> data from its original coordinate system into the patient coordinate
> >> system.
> >>
> >>  - David
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110629/da697388/attachment.htm>


More information about the vtkusers mailing list