<html><head></head><body bgcolor="#FFFFFF"><div>I think you need to normalize v2 before you compose the transform<br><br>Sent from my iPad</div><div><br>On Mar 23, 2012, at 3:09 PM, Miguel Sotaquirá &lt;<a href="mailto:msotaquira@gmail.com">msotaquira@gmail.com</a>&gt; wrote:<br><br></div><div></div><blockquote type="cite"><div>Hi again,<div><br></div><div>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?)</div>

<div><br></div><div>How can I ensure that the center of the plane matches the center of the volume?</div><div><br></div><div>Thanks,</div><div>Miguel</div><div><br></div><div>// Get volume's center</div><div><div>vtkSmartPointer&lt;vtkImageData&gt; imageData =&nbsp;this-&gt;planeWidget[whichPlane]-&gt;GetResliceOutput();</div>
<div>double spacing[3];</div><div>imageData-&gt;GetSpacing(spacing);</div><div>double origin[3];</div><div>imageData-&gt;GetOrigin(origin);</div>
<div>int extent[6];</div><div>imageData-&gt;GetWholeExtent(extent);</div><div><span style="white-space:pre-wrap">        </span></div>
<div>// Define widget's center as the center of the volume</div><div>double wc[3];</div><div>wc[0] = origin[0] + 0.5 * spacing[0] * ( extent[0] + extent[1] );</div>
<div>wc[1] = origin[1] + 0.5 * spacing[1] * ( extent[2] + extent[3] );</div><div>wc[2] = origin[2] + 0.5 * spacing[2] * ( extent[4] + extent[5] );</div>
<div><span style="white-space:pre-wrap">        </span></div><div>// planeWidget's vector 2 (used as the axis of rotation)</div><div>double v2[3];</div>
<div>this-&gt;planeWidget[whichPlane]-&gt;GetVector2(v2);</div><div><span style="white-space:pre-wrap">        </span></div><div>// Transform</div>
<div>vtkSmartPointer&lt;vtkTransform&gt; transform =&nbsp;vtkSmartPointer&lt;vtkTransform&gt;::New();</div>
<div>transform-&gt;PreMultiply();</div><div>transform-&gt;Translate(wc[0],wc[1],wc[2]);</div><div>transform-&gt;RotateWXYZ(90,v2[0],v2[1],v2[2]);</div>
<div>transform-&gt;Translate(-wc[0],-wc[1],-wc[2]);</div><div><span style="white-space:pre-wrap">        </span></div><div>// Modify and update planeWidget</div>
<div>double newpt[3];</div><div>transform-&gt;TransformPoint(this-&gt;planeWidget[whichPlane]-&gt;GetPoint1(),newpt);</div>
<div>this-&gt;planeWidget[whichPlane]-&gt;SetPoint1(newpt);</div><div>transform-&gt;TransformPoint(this-&gt;planeWidget[whichPlane]-&gt;GetPoint2(),newpt);</div>
<div>this-&gt;planeWidget[whichPlane]-&gt;SetPoint2(newpt);</div><div>transform-&gt;TransformPoint(this-&gt;planeWidget[whichPlane]-&gt;GetOrigin(),newpt);</div>
<div>this-&gt;planeWidget[whichPlane]-&gt;SetOrigin(newpt);</div><div><span style="white-space:pre-wrap">        </span></div><div>planeWidget[whichPlane]-&gt;UpdatePlacement();</div>
</div><div><br></div><div><br><br><div class="gmail_quote">2012/3/23 Miguel Sotaquirá <span dir="ltr">&lt;<a href="mailto:msotaquira@gmail.com" target="_blank">msotaquira@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Hi everybody!<div><br></div><div>I've implemented a four pane viewer using the example found at&nbsp;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.</div>


<div><br></div><div>What I want to do now after user interaction&nbsp;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:</div>


<div><br></div><div>- Define a vtkTransform (transform) and SetMatrix as vtkImagePlaneWidget's current orientation:&nbsp;</div><div><div>&nbsp; &nbsp; vtkSmartPointer&lt;vtkTransform&gt; transform =&nbsp;vtkSmartPointer&lt;vtkTransform&gt;::New();</div>


<div>&nbsp; &nbsp; transform-&gt;PreMultiply();</div><div><span>&nbsp; &nbsp; transform-&gt;SetMatrix(</span>planeWidget-&gt;GetResliceAxes()<span>);</span></div><div><span><br>
</span></div><div><span>- Apply 90 degrees rotation around Y axis:</span></div><div><span>&nbsp; &nbsp; transform-&gt;RotateY(90);</span></div><div><span><br>
</span></div><div><span>- Update planeWidget using methods SetOrigin, SetPoint1, SetPoint2 and UpdatePlacement, where origin, point1, point2 are extracted from "transform"</span></div><div>
<span><br></span></div><div>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.</div>


</div><div><br></div><div>Am I missing something? How to correctly update planeWidget's orientation? Thanks for your help,</div><div><br></div><div>Miguel</div>
</blockquote></div><br></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Powered by <a href="http://www.kitware.com">www.kitware.com</a></span><br><span></span><br><span>Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a></span><br><span></span><br><span>Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ">http://www.vtk.org/Wiki/VTK_FAQ</a></span><br><span></span><br><span>Follow this link to subscribe/unsubscribe:</span><br><span><a href="http://www.vtk.org/mailman/listinfo/vtkusers">http://www.vtk.org/mailman/listinfo/vtkusers</a></span><br></div></blockquote></body></html>