[vtkusers] vtkImagePlaneWidget: how to update plane's orientation?

Miguel Sotaquirá msotaquira at gmail.com
Fri Mar 23 15:09:13 EDT 2012


Hi again,

So I've managed to rotate the plane widget 90 degrees (see code below) but
somehow the rotated plane is not located on the center of the 3D volume. In
the code below I define the origin of the plane widget (wc) as the center
of the volume in x,y,z coordinates. I don't know if I'm not defining
correctly this center or the transformation (or both?)

How can I ensure that the center of the plane matches the center of the
volume?

Thanks,
Miguel

// Get volume's center
vtkSmartPointer<vtkImageData> imageData
= this->planeWidget[whichPlane]->GetResliceOutput();
double spacing[3];
imageData->GetSpacing(spacing);
double origin[3];
imageData->GetOrigin(origin);
int extent[6];
imageData->GetWholeExtent(extent);
 // Define widget's center as the center of the volume
double wc[3];
wc[0] = origin[0] + 0.5 * spacing[0] * ( extent[0] + extent[1] );
wc[1] = origin[1] + 0.5 * spacing[1] * ( extent[2] + extent[3] );
wc[2] = origin[2] + 0.5 * spacing[2] * ( extent[4] + extent[5] );
 // planeWidget's vector 2 (used as the axis of rotation)
double v2[3];
this->planeWidget[whichPlane]->GetVector2(v2);
// Transform
vtkSmartPointer<vtkTransform> transform
= vtkSmartPointer<vtkTransform>::New();
transform->PreMultiply();
transform->Translate(wc[0],wc[1],wc[2]);
transform->RotateWXYZ(90,v2[0],v2[1],v2[2]);
transform->Translate(-wc[0],-wc[1],-wc[2]);
// Modify and update planeWidget
double newpt[3];
transform->TransformPoint(this->planeWidget[whichPlane]->GetPoint1(),newpt);
this->planeWidget[whichPlane]->SetPoint1(newpt);
transform->TransformPoint(this->planeWidget[whichPlane]->GetPoint2(),newpt);
this->planeWidget[whichPlane]->SetPoint2(newpt);
transform->TransformPoint(this->planeWidget[whichPlane]->GetOrigin(),newpt);
this->planeWidget[whichPlane]->SetOrigin(newpt);
planeWidget[whichPlane]->UpdatePlacement();



2012/3/23 Miguel Sotaquirá <msotaquira at gmail.com>

> Hi everybody!
>
> I've implemented a four pane viewer using the example found
> at Examples/GUI/Qt/FourPaneViewer/QtVTKRenderWindows.cxx. This viewer
> allows me to explore a 3-D volume using a set of three vtkImagePlaneWidgets
> that can be interactively placed (translated, rotated) by the user using
> mouse events.
>
> What I want to do now after user interaction is to take one of these
> planes and rotate it 90 degrees along its normal, and update the four panes
> accordingly. In order to do so I'm using this workflow:
>
> - Define a vtkTransform (transform) and SetMatrix as vtkImagePlaneWidget's
> current orientation:
>     vtkSmartPointer<vtkTransform> transform
> = vtkSmartPointer<vtkTransform>::New();
>     transform->PreMultiply();
>     transform->SetMatrix(planeWidget->GetResliceAxes());
>
> - Apply 90 degrees rotation around Y axis:
>     transform->RotateY(90);
>
> - Update planeWidget using methods SetOrigin, SetPoint1, SetPoint2 and
> UpdatePlacement, where origin, point1, point2 are extracted from "transform"
>
> When using this approach I get strange results: neither planeWidget's
> origin nor its extension are well defined, and I'm not able to update the
> four panes accordingly. The origin is located outside the 3-D volume, and
> the extension does not cover the entire volume.
>
> Am I missing something? How to correctly update planeWidget's orientation?
> Thanks for your help,
>
> Miguel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120323/6ce13af8/attachment.htm>


More information about the vtkusers mailing list