<font size="2"><font face="verdana,sans-serif">I solved this (see my other mail). But I still don&#39;t know why I had to set origin and position:<br></font></font><div><font class="Apple-style-span" face="verdana, sans-serif"><div>

volume-&gt;SetOrigin(-origin[0], -origin[1], -origin[2]);</div><div>volume-&gt;SetPosition(-origin[0], -origin[1], -origin[2]);</div><div><br></div><div>Can you explain it? Also, a link to some text explaining vtk&#39;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.</div>

<div><br></div><div>Regards,</div><div>Dženan</div><div><br></div></font><div class="gmail_quote">2011/7/1 Dženan Zukić <span dir="ltr">&lt;<a href="mailto:dzenanz@gmail.com">dzenanz@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<font size="2"><font face="verdana,sans-serif">I did the math, and it should be as simple as this:<br></font></font><div><div class="im"><div style="font-family:verdana, sans-serif"><br></div><div><font face="&#39;courier new&#39;, monospace">VisualizingImageType::DirectionType d=logic-&gt;visualizing-&gt;GetDirection();</font></div>


</div><div><font face="&#39;courier new&#39;, monospace">vtkMatrix4x4 *mat=vtkMatrix4x4::New(); //identity matrix</font></div><div class="im"><div><font face="&#39;courier new&#39;, monospace">for (int i=0; i&lt;3; i++)</font></div>


<div><font face="&#39;courier new&#39;, monospace">    for (int k=0; k&lt;3; k++)</font></div><div><font face="&#39;courier new&#39;, monospace">        mat-&gt;SetElement(i,k, d(i,k));</font></div>
</div><div class="im"><div><font face="&#39;courier new&#39;, monospace">VisualizingImageType::PointType origin=logic-&gt;visualizing-&gt;GetOrigin();</font></div><div><font face="&#39;courier new&#39;, monospace">for (int i=0; i&lt;3; i++)</font></div>


</div><div><font face="&#39;courier new&#39;, monospace">    mat-&gt;SetElement(i,3, origin[i]);</font></div><div><font face="&#39;courier new&#39;, monospace">//mat-&gt;Invert(); //inverse produces even wrong orientation</font></div>


<div><font face="&#39;courier new&#39;, monospace">volume-&gt;SetUserMatrix(mat);</font></div><div style="font-family:verdana, sans-serif"><br></div><div style="font-family:verdana, sans-serif">
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&#39;s transform matrix. And equations I will have to obtain by passing a number of points through ITK&#39;s transformation and add some simple objects to the vtk scene at that spot and on index space spot but with VTK transformation applied.</div>


<div style="font-family:verdana, sans-serif"><br></div><div style="font-family:verdana, sans-serif">Regards,</div><div style="font-family:verdana, sans-serif">Dženan</div><font color="#888888"><div style="font-family:verdana, sans-serif">


<br></div></font><div><div></div><div class="h5"><div class="gmail_quote">2011/6/29 Dženan Zukić <span dir="ltr">&lt;<a href="mailto:dzenanz@gmail.com" target="_blank">dzenanz@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<font size="2"><font face="verdana,sans-serif">I tried trial and error: premultiply translation, postmultiply, divide</font></font><font size="2"><font face="verdana,sans-serif"> by and multiply by spacing, all that unsuccessfully. Now I need to work out the math :D<br>



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