I finished the visualization program with vtk, here are some results:<br><br><a href="http://es.youtube.com/watch?v=MEEd3oOf9To">http://es.youtube.com/watch?v=MEEd3oOf9To</a><br><br>I think it&#39;s a nice application of VTK (what can I say, I&#39;m the father).
<br><br>Many thanks for the software!!!<br><br><div><span class="gmail_quote">2007/7/6, Francisco Jesús Martínez Serrano:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I found the problem: VTK was using the opaque codepath to render my<br>geometry. The following quick and dirty hack solved it:<br><br>actor-&gt;GetProperty()-&gt;SetOpacity(0.999999);<br><br><br>2007/7/6, Francisco Jesús Martínez Serrano:
<br>&gt; Dear vtk users,<br>&gt;<br>&gt; I&#39;m trying to create an application to visualize the results of<br>&gt; galaxy-formation simulations<br>&gt; using particles. The technique that I want to use is the technique<br>
&gt; that was used to make<br>&gt; these videos:<br>&gt;<br>&gt; <a href="http://www.aip.de/People/AKhalatyan/COSMOLOGY/STEREO/MW_ANDROMEDA/MW.htm">http://www.aip.de/People/AKhalatyan/COSMOLOGY/STEREO/MW_ANDROMEDA/MW.htm</a>
<br>&gt;<br>&gt; It is basically a billboarding using a texture for each particle that<br>&gt; reproduces the density field of each particle.<br>&gt;<br>&gt; The billboarding implementation that I have so far consists of adding
<br>&gt; all the particles as<br>&gt; input of a vtkGlyph3D object and a vtkPlaneSource as source. The<br>&gt; texture (consisting of a<br>&gt; white square R=G=B=255 with varying alpha value for transparency) is<br>&gt; then added to the
<br>&gt; actor of the vtkPolyDataMapper of the glyph. I have set up a callback<br>&gt; that sets the normal<br>&gt; vector of each plane in the glyph directed towards the camera:<br>&gt;<br>&gt; void OrientNormal( vtkObject* vtkNotUsed(object),unsigned long
<br>&gt; eventId,void* sr,void* vtkNotUsed(calldata))<br>&gt; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallbackData* cd = reinterpret_cast&lt;CallbackData*&gt;(sr);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkCamera* cam = cd-&gt;cam;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkPolyData* pdata = cd-&gt;pdata;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkPointData *PD = pdata-&gt;GetPointData();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkGlyph3D* glyph = cd-&gt;glyph;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double *rz;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double rzm[3],rym[3],rxm[3];<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double *pos;
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double *cpos = cam-&gt;GetPosition();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Vector data for directions<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vtkFloatArray *FA = vtkFloatArray::New();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FA-&gt;SetName(&quot;directions&quot;);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FA-&gt;SetNumberOfComponents(3);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint n=pdata-&gt;GetNumberOfPoints();<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (uint i=0; i&lt;n; i++)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( cam-&gt;GetParallelProjection() != 0 )<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rz = cam-&gt;GetDirectionOfProjection();
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rzm[0] = -rz[0];<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rzm[1] = -rz[1];<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rzm[2] = -rz[2];<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos=pdata-&gt;GetPoint(i);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rzm[0] = -cpos[0] + pos[0];<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rzm[1] = -cpos[1] + pos[1];<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rzm[2] = -cpos[2] + pos[2];
<br>&gt; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vtkMath::Normalize(rzm);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FA-&gt;InsertNextTuple(rzm);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add the data arrays to the point data<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PD-&gt;SetNormals(FA);
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FA-&gt;Delete();<br>&gt; }<br>&gt;<br>&gt;<br>&gt; The problem comes with some relative postions of particles which don&#39;t<br>&gt; work as supposed.<br>&gt; An example can be seen at:<br>&gt;<br>&gt; <a href="http://franjesus.googlepages.com/alphaproblem.png">
http://franjesus.googlepages.com/alphaproblem.png</a><br>&gt;<br>&gt; Here the green particle is on the front (you can tell by the size, all<br>&gt; particles have the same<br>&gt; radius) and is partially covering the yellow and cyan particles. For
<br>&gt; the yellow particle the<br>&gt; desired effect is obtained and there&#39;s a blended transition zone. With<br>&gt; the cyan particle, the<br>&gt; problem happens and the green particle totally covers it until the
<br>&gt; alpha channel goes to zero<br>&gt; (ie. like a threshold).<br>&gt;<br>&gt; Is there any option of the renderer that I have to set so get it<br>&gt; working correctly?<br>&gt; Might it be a problem with the OpenGL implementation? (nvidia linux 9755)
<br>&gt;<br></blockquote></div><br>