[vtkusers] Announcement: New image rendering classes for VTK
Dženan Zukić
dzenanz at gmail.com
Tue Jul 5 08:42:34 EDT 2011
I solved this (see my other mail). But I still don't know why I had to set
origin and position:
volume->SetOrigin(-origin[0], -origin[1], -origin[2]);
volume->SetPosition(-origin[0], -origin[1], -origin[2]);
Can you explain it? Also, a link to some text explaining vtk's coordinate
transformation system for future reference would be very appreciated (if
such a text exists). I had been searching but could not find a source which
explains in which order are the transformation matrices applied, in which
space are voxels of a vtkVolume etc.
Regards,
Dženan
2011/7/1 Dženan Zukić <dzenanz at gmail.com>
> I did the math, and it should be as simple as this:
>
> VisualizingImageType::DirectionType d=logic->visualizing->GetDirection();
> vtkMatrix4x4 *mat=vtkMatrix4x4::New(); //identity matrix
> for (int i=0; i<3; i++)
> for (int k=0; k<3; k++)
> mat->SetElement(i,k, d(i,k));
> VisualizingImageType::PointType origin=logic->visualizing->GetOrigin();
> for (int i=0; i<3; i++)
> mat->SetElement(i,3, origin[i]);
> //mat->Invert(); //inverse produces even wrong orientation
> volume->SetUserMatrix(mat);
>
> However this does not work. This is a simple transformation from scaled
> index space (vtkVolume handles spacing) to DICOM physical space. If no one
> has any suggestion, I will simply have to create a system of linear
> equations from which to construct the VTK's transform matrix. And equations
> I will have to obtain by passing a number of points through ITK's
> transformation and add some simple objects to the vtk scene at that spot and
> on index space spot but with VTK transformation applied.
>
> Regards,
> Dženan
>
> 2011/6/29 Dženan Zukić <dzenanz at gmail.com>
>
>> 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/20110705/d76bbd96/attachment.htm>
More information about the vtkusers
mailing list