<html>
<body>
<font face="Courier New, Courier">Hello vtkers,<br><br>
I need to test the visibility of objects to be rendered and I am using
zbuffering to test for visibility. I test the visibility of an annotation
anchor point to manually clip the annotation if it is not
visible.<br><br>
I am not sure if the zbuffering method I am using is correct because I
had to make some changes from version 4.2 to 4.5 and the zbuffering does
not always work (before I had some problem only on the laptop with the
ATI mobility radeon 9700 card, now also with the invidia card). Sometimes
it happens that I see the anchor point displayed but the test says it is
not visible.<br><br>
In past vtk msgs and in vtk code, I found two zbuffering methods are used
(see z and z2 in the code) but they give different values, I used z
because its value seems the closest to the display coordinates of the
point.<br><br>
Can somebody help me? Please check if I am making any mistake or <br>
show me a working method to calculate the zbuffering for visibility
test.<br><br>
Thanks a lot,<br>
Monica<br><br>
<br><br>
ViewManager * vm = ViewManager::GetInstance();<br>
vector&lt;View *&gt; * vs= vm-&gt;GetViews();<br>
vtkRenderer* ren=(*vs)[0]-&gt;GetRenderer();<br>
double this-&gt;Tolerance = 0.01;<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
int* viewSize =ren-&gt;GetRenderWindow()-&gt;GetSize();&nbsp; <br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
// calculate visible labels<br>
vector &lt;AbstractDataSetRenderer *&gt; * viewRenderers =
(*vs)[0]-&gt;GetListRenderer();&nbsp;&nbsp; <br>
float* Zptr = ren-&gt;GetRenderWindow()-&gt;GetZbufferData(0,0,
(viewSize[0]-1), (viewSize[1]-1));<br>
double viewCoord[4];<br>
double z, z2, displayCoord[3];<br>
double worldCoord[4];<br>
vtkMatrix4x4* matrix= vtkMatrix4x4::New(); <br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
//aspect calculation<br>
int usize, vsize;<br>
ren-&gt;GetTiledSize(&amp;usize,&amp;vsize);<br>
double aspect[2];<br>
ren-&gt;ComputeAspect();<br>
ren-&gt;GetAspect(aspect);<br>
double aspect2[2];<br>
ren-&gt;vtkViewport::ComputeAspect();<br>
ren-&gt;vtkViewport::GetAspect(aspect2);<br>
double aspectModification =
aspect[0]*aspect2[1]/(aspect[1]*aspect2[0]);<br>
&nbsp; <br>
double finalAspect = 1.0;<br>
if(vsize &amp;&amp; usize){<br>
&nbsp;&nbsp;&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>finalAspect =
aspectModification*usize/vsize;<br>
&nbsp;}<br><br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
matrix-&gt;DeepCopy(ren-&gt;GetActiveCamera()-&gt;GetCompositePerspectiveTransformMatrix(finalAspect,0,1));<br>
worldCoord[3]=1.0;<br>
//viewRenderers is a vector containing the objects to be displayed and
annotations<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
for(int k=0; k&lt;(int) viewRenderers-&gt;size();
k++){<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
&nbsp;&nbsp; //get annotation data and check if it is visible <br>
&nbsp;&nbsp; if(!strcmp((*viewRenderers)[k]-&gt;GetId()-&gt;c_str(),
&quot;DataSetRenderer.LabelDataSetRenderer&quot;)){<br>
&nbsp;&nbsp; //get label anchor world coordinates and transform into
display coordinates<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>
((LabelDataSetRenderer*)(*viewRenderers)[k])-&gt;GetAnchor(worldCoord);
<br>
&nbsp;&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
matrix-&gt;MultiplyPoint(worldCoord, viewCoord);<br>
&nbsp;&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
ren-&gt;SetViewPoint(viewCoord[0]/viewCoord[3],
viewCoord[1]/viewCoord[3],viewCoord[2]/viewCoord[3]);<br>
&nbsp;&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
ren-&gt;ViewToDisplay();<br>
&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
ren-&gt;GetDisplayPoint(displayCoord);<br><br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
//first method to calculate zbuffer<br>
&nbsp;&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp; z=
Zptr[(int) displayCoord[0] + (int)(displayCoord[1])*viewSize[0]];<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
//another method to calculate zbuffer <br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp; z2=
ren-&gt;GetZ(
static_cast&lt;int&gt;(displayCoord[0]),static_cast&lt;int&gt;(displayCoord[1]));<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
cout&lt;&lt;&quot; depth z: &quot;&lt;&lt; z&lt;&lt; endl;<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
cout&lt;&lt;&quot; depth z2: &quot;&lt;&lt; z2&lt;&lt; endl;<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
cout&lt;&lt;&quot; display coord depth: &quot;&lt;&lt;
displayCoord[2]&lt;&lt; endl;<br><br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
if(displayCoord[2]&lt;(z + this-&gt;Tolerance)){<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>
cout&lt;&lt;&quot; visible &quot;&lt;&lt;endl;<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
}<br>
&nbsp;&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>&nbsp;
else{<br>
<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>
&nbsp;&nbsp;&nbsp; cout&lt;&lt;&quot; invisible &quot;&lt;&lt; endl;<br>
&nbsp; <x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab>
}<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><x-tab>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</x-tab><br>
&nbsp;&nbsp;&nbsp; }<br>
}<br><br>
<br>
</font><x-sigsep><p></x-sigsep>
<font face="Arial Baltic, Helvetica" size=2>&nbsp;Monica Gemo - Ph.D.
Student<br>
&nbsp;Communication and Remote Sensing Lab. (UCL/TELE)<br>
&nbsp;Belgium Lab. of Computer-Human Interaction (UCL/BCHI)<br>
&nbsp;Université catholique de Louvain<br>
&nbsp;Address : Stevin Building, room A.147<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Place du Levant, 2<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
B-1348 Louvain-la-Neuve, BELGIUM<br>
&nbsp;Tel : + 32 10 47.41.05&nbsp; -&nbsp; Fax : + 32 10 47.20.89<br>
&nbsp;E-mail : gemo@tele.ucl.ac.be<br>
&nbsp;<a href="http://www.tele.ucl.ac.be/view-people.php?id=54" eudora="autourl">
http://www.tele.ucl.ac.be/view-people.php?id=54<br>
</a></font></body>
</html>