<div dir="ltr">Yes, if they are not coincident then it does get a bit tricky. <div><br></div><div>If it helps, the range of values for the units can go all the way up to +-65000 which would be enough to pull something from the far clipping plane all the way up to the front clipping plane. So while we normally talk about small values such as +-2 for coincident topology the actual range can be quite a bit larger if needed.</div><div><br></div><div><div><br></div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 14, 2017 at 12:55 PM, Luca Pallozzi Lavorante <span dir="ltr"><<a href="mailto:lplavorante@gmail.com" target="_blank">lplavorante@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Hi Ken, thank you very much for your reply.<br></div>In my application, some of the surfaces are not exactly coincident, due to their build process, so I'll have to test the best set of factor/units values. These values will have to be high. <br><br></div>   Best regards<br><br></div>     Luca<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 14, 2017 at 11:43 AM, Ken Martin <span dir="ltr"><<a href="mailto:ken.martin@kitware.com" target="_blank">ken.martin@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">In this example Surf1 and Surf2 are NOT (just emphasizing not yelling :-) coincident as you have shifted surf2 by 10 world units in Z. So depending on the geometry of surf and the viewing direction surf2 may be in front of or behind surf1 by up to 10 world coordinates. The relation between world coordinates and polygon offset is complex and non-linear so it will be hard to pick values for surf2 that ALWAYS place it in front of surf1 given that they are NOT coincident and the user can rotate the camera etc.<div><br></div><div>But if you go with a large enough set of values you can probably force it to be in front for most all viewpoints.</div><div><br></div><div>If surf1 and surf2 are really supposed to be coincident then leave them at the same position and just use the Polygon offsets to do what you want. And yes with different sets of factor/unit values you should be able to have many sets of surfaces/lines, all coincident, but yet shown with the order you desire. Just leave them all coincident and adjust the factor offset by say -3, -3 for each layer would be my guess. </div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_-1498847696491592093h5">On Thu, Sep 14, 2017 at 10:12 AM, Luca Pallozzi Lavorante <span dir="ltr"><<a href="mailto:lplavorante@gmail.com" target="_blank">lplavorante@gmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-1498847696491592093h5"><div dir="ltr"><div><div><div><div><div>Hi vtkusers,<br><br></div>I am trying to visualize several (almost) coincident surfaces and wireframe objects using VTK 8.0 and OpenGL2 on Linux. I am providing a code snippet in Python, in which I have created two Mappers from the same object and then the corresponding Actors. One of the two actors is slighty shifted in order to simulate geometries which are not exactly coincident. Also note that I had to perform a relatively high Z scaling because the objects are geologic regional surfaces, which would appear nearly flat without proper scaling.<br><br># Surface 1 (Red)<br>surf1Mapper = vtk.vtkPolyDataMapper()<br>surf1Mapper.SetInputData(surf)<br>surf1Mapper.SetResolveCoincide<wbr>ntTopologyToPolygonOffset()<br>surf1Mapper.SetRelativeCoincid<wbr>entTopologyPolygonOffsetParame<wbr>ters(-2.0, -2.0)<br><br>surf1Actor = vtk.vtkActor()<br>surf1Actor.SetMapper(surf1Mapp<wbr>er)<br>surf1Actor.GetProperty().SetCo<wbr>lor(1, 0, 0)<br>surf1Actor.SetScale(1, 1, 100)<br><br></div><div># Not necessary. Only used to clarify things.<br></div><div>surf1Actor.SetPosition(0, 0, 0) <br><br># Surface 2 (Blue)<br>surf2Mapper = vtk.vtkPolyDataMapper()<br>surf2Mapper.SetInputData(surf)<br>surf2Mapper.SetResolveCoincide<wbr>ntTopologyToPolygonOffset()<br>surf2Mapper.SetRelativeCoincid<wbr>entTopologyPolygonOffsetParame<wbr>ters(-4.0, -9.0)<br><br>surf2Actor = vtk.vtkActor()<br>surf2Actor.SetMapper(surf2Mapp<wbr>er)<br>surf2Actor.GetProperty().SetCo<wbr>lor(0, 0, 1)<br>surf2Actor.SetScale(1, 1, 100)<br># Perform small shift in order to simulate interaction between non-coincident geometries.<br>surf2Actor.SetPosition(0, 0, 10)<br><br># Edges from surface 1. Observe that this object is not translated, so that its geometry is coincident with surface1's (which has a lower polygon offset priority compared to surface2).<br>edges = vtk.vtkExtractEdges()<br>edges.SetInputData(surf)<br>edges.Update()<br><br>edgesMapper = vtk.vtkPolyDataMapper()<br>edgesMapper.SetInputData(edges<wbr>.GetOutput())<br>edgesMapper.SetResolveCoincide<wbr>ntTopologyToPolygonOffset()<br>edgesMapper.SetRelativeCoincid<wbr>entTopologyLineOffsetParameter<wbr>s(-20.0, -20.0)<br><br>edgesActor = vtk.vtkActor()<br>edgesActor.SetMapper(edgesMapp<wbr>er)<br>edgesActor.GetProperty().SetCo<wbr>lor(0, 0, 0)<br>edgesActor.SetScale(1, 1, 100)<br><br></div><div># Again, this is not necessary.<br></div><div>edgesActor.SetPosition(0, 0, 0)<br><br></div>To avoid Z-fighting between the surfaces' faces, I used vtkMapper:: SetResolveCoincidentTopologyTo<wbr>PolygonOffset() and then provided different values for the parameters factor and units, using each mapper's SetRelativeCoincidentTopology PolygonOffset Parameters() method. Surface 1 has (factor, units) = (-2, -2), whereas Surface 2 (which has drawing priority) uses (-4, -9). I had to use units = -9 because lower values would end up showing some polygons from surface 1.<br></div>Then I tried to add a wireframe object, whose geometry is the same as surface1's.<br></div>You can see in the code that I had to use high values (-20, -20) for factor and units (via the SetRelativeCoincidentTopology LineOffset Parameters() method). This was necessary because I wasn't able to see all the edges on surface2.<br><br></div>I have read Ken Martin's post explaining the difference between the factor and units parameters:<br><a href="http://markmail.org/search/?q=vtkusers+polygonoffset#query:vtkusers%20polygonoffset+page:1+mid:lpucqjdjbjz3hy53+state:results" target="_blank">http://markmail.org/search/?q=<wbr>vtkusers+polygonoffset#query:v<wbr>tkusers%20polygonoffset+page:1<wbr>+mid:lpucqjdjbjz3hy53+state:re<wbr>sults</a><br><div><br></div><div>I verified that to avoid Z-fighting issues between polygons, the factor and units parameters must have the same order of magnitude (e.g. -2,  -2). Also, I have tried, whenever possible, to follow Ken's advice not to use values with magnitudes higher than (minus or plus) 10. But in the case  of the wireframe object, my parameters had to be higher. And even so, I couldn't assure the visualization of all the edges, as you can see in the attached image.<br></div><div>Moreover, the problem persists even when I use exactly coincident surfaces (e.g., removing the vtkActor::SetPosition() methods. <br></div><div><br></div><div>If you have had the patience of following me until this point, I'd like to ask these questions:<br><br></div><div>1. Is is possible to specify priorities between polygon/polygon and line/polygon parameters? For example, surface 1 used (factor, units) = (-2, -2), surface 2 used (-4, -9) (PolygonOffset parameters), whereas edges used (-20, -20), the highes priority among the three objects, set using LineOffset parameters. Is this consistent?<br></div><div><div>In my application, I have Z-fighting issues among 3-4 coincident 
surfaces (each with its own geologic meaning provided by different 
CellData values) and also among 8-9 coincident lines. And the two groups 
interact, in the sense that lines must always be drawn correctly on any 
surface. Can I achieve this using VTK's Polygon Offset approach?<br></div><div><br></div>2. Would it be possible to do what I am trying to achieve using different approaches? I have tried using vtkMapper::SetResolveCoinciden<wbr>tTopologyZShift(), but with little success.<br></div><br><div>I know this is a very long post and apologize for that, but I have been struggling with this issue for  the last two weeks. So I tried to add as much information as possible.<br></div><div><br></div><div>Thank you very much for any advice.<span class="m_-1498847696491592093m_8384801407617094138HOEnZb"><font color="#888888"><br></font></span></div><span class="m_-1498847696491592093m_8384801407617094138HOEnZb"><font color="#888888"><div><br></div><div>    Luca<br></div></font></span></div>
<br></div></div>______________________________<wbr>_________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensou<wbr>rce/opensource.html</a><br>
<br>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_FA<wbr>Q</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=<wbr>vtkusers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mail<wbr>man/listinfo/vtkusers</a><br>
<br></blockquote></div><span class="m_-1498847696491592093HOEnZb"><font color="#888888"><br><br clear="all"><span class="HOEnZb"><font color="#888888"><div><br></div>-- <br><div class="m_-1498847696491592093m_8384801407617094138gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Ken Martin PhD<div>Distinguished Engineer<br><span style="font-size:12.8px">Kitware Inc.</span><br></div><div><a href="https://maps.google.com/?q=28+Corporate+Drive+Clifton+Park+NY+12065&entry=gmail&source=g" target="_blank">28 Corporate Drive</a><br><a href="https://maps.google.com/?q=28+Corporate+Drive+Clifton+Park+NY+12065&entry=gmail&source=g" target="_blank">Clifton Park NY 12065</a><br><div><br></div><div><span style="font-size:10pt;font-family:Tahoma,sans-serif">This communication,
including all attachments, contains confidential and legally privileged
information, and it is intended only for the use of the addressee.  Access to this email by anyone else is
unauthorized. If you are not the intended recipient, any disclosure, copying,
distribution or any action taken in reliance on it is prohibited and may be
unlawful. If you received this communication in error please notify us
immediately and destroy the original message. 
Thank you.</span></div></div></div></div></div>
</font></span></font></span></div>
</blockquote></div><br></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Ken Martin PhD<div>Distinguished Engineer<br><span style="font-size:12.8px">Kitware Inc.</span><br></div><div>28 Corporate Drive<br>Clifton Park NY 12065<br><div><br></div><div><span style="font-size:10pt;font-family:Tahoma,sans-serif">This communication,
including all attachments, contains confidential and legally privileged
information, and it is intended only for the use of the addressee.  Access to this email by anyone else is
unauthorized. If you are not the intended recipient, any disclosure, copying,
distribution or any action taken in reliance on it is prohibited and may be
unlawful. If you received this communication in error please notify us
immediately and destroy the original message. 
Thank you.</span></div></div></div></div></div>
</div>