[vtkusers] How to use backface culling with polylines

Jim Peterson jimcp at cox.net
Sat Nov 20 21:18:36 EST 2010


Thanks Donny,
Always good to hear from the actual user. Maybe all we really need to do 
for now is make sure we have a good example of the algorithm on the 
wiki. We can let some additional experiences and requirements dictate 
where it might go in vtk.

Jim

Donny wrote:
> I tried using vtkGeoView. I am adding quite a few very different actors to
> the scene such as textured polydata, untextured polydata, lines, 2d text, 3d
> text, and volumes. I did not like the representation approach because it
> seemed too limited. I also wanted to control the interactor at a deeper
> level. Basically it was too high level for my purposes. 
>
> I am using vtkGlobeSource, not only for an actor, but also for the static
> function vtkGlobeSource::ComputeGlobePoint. My GIS data is in lat,lon
> coordinates so this function is priceless. Most of my atmospheric data is in
> meters from a central point so it fits in perfectly with my scene.
>
> I am not sure what the best approach for the new functionality would be
> since my state and county line data is not associated with the
> vtkGlobeSource actor at all. It appears that the vtkHorizonClippedGeoView
> would be the best approach although it would not have been my first choice
> to use. I would be in favor of a static vtkGlobeSource function that would
> calculate the horizon clip plane origin and normal based on parameters
> passed to it.
>
> Thanks guys.
>
> -----Original Message-----
> From: Jim Peterson [mailto:jimcp at cox.net] 
> Sent: Saturday, November 20, 2010 7:55 PM
> To: Aashish Chaudhary
> Cc: Donny; David Gobbi; Sebastien Jourdain; vtkusers at vtk.org
> Subject: Re: [vtkusers] How to use backface culling with polylines
>
> Aashish,
> I think I would support having some GeoView Clip Horizon function. I 
> don't really know how we feel about endless subclassing. I believe if we 
> extend the function of vtkGeoView we would need an attribute to control 
> whether to clip horizon or not, an attribute for the clipping plane, a 
> modified callback on the vtkCamera to recompute the clipping plane on 
> camera movement.
>
> If we make a vtkHorizonClippedGeoView subclass, we would not need the 
> control attribute, use of the class would mean the behavior was desired.
>
> Donny, what would be more useful to you? are you currently using 
> vtkGeoView?
>
> Jim
>
> Aashish Chaudhary wrote:
>   
>> Jim, Donny, Gobbi 
>>
>> This is nice! I think we can put this inside the geovis as vtkGeoClip 
>> or something along the lines? I will talk to Jeff about it. Would you 
>> be interested in making this addition? 
>>
>> Thanks, 
>>
>>
>> On Sat, Nov 20, 2010 at 1:31 PM, Jim Peterson <jimcp at cox.net 
>> <mailto:jimcp at cox.net>> wrote:
>>
>>     Donny, just to be sure we have a true normalized vector for the
>>     rest of the calcs, I think I would make the clop position an
>>     array, and then use vtkMath::Normalize(clipPos); to be sure we
>>     have a normal that has a length 1. soSo I think the normal
>>     calculation should probably be change from:
>>
>>
>>            double dx = earthcenter[0] - camerapos [0];
>>           double dy = earthcenter[1] - camerapos [1];
>>           double dz = earthcenter[2] - camerapos [2];        
>>           double distance = sqrt(dx*dx + dy*dy + dz*dz);
>>
>>           double nx = -(dx/distance);
>>           double ny = -(dy/distance);
>>           double nz = -(dz/distance);        
>>
>>     to something like this so that all of the point locations and
>>     vectors keep their parts together:
>>
>>            double dv[] = {0.,0.,0.,}
>>            dv[0] = camerapos[0] - earthcenter[0]; // subtract
>>     earthcenter from camera pos
>>           dv[1] = camerapos[1] - earthcenter[1];
>>           dv[2] = camerapos[2] - earthcenter[2];        
>>           double distance = sqrt(dv[0]*dv[0] + dv[1]*dv[1] + dv[2]*dv[2]);
>>            
>>            double nv[] = {0.,0.,0.,};
>>           nv[0] = (dv[0]/distance); // no inversion with the above
>>     subtract
>>           nv[1] = (dv[1]/distance);
>>           nv[2] = (dv[2]/distance);        vtkMath::Normalize(nv);  //
>>     assert normalize to unit length      
>>     Also, if Altitude is greater than earth radius, we would just use
>>     the earth center as the clip plane location.
>>
>>     Glad I could help.
>>     Jim
>>
>>
>>     Donny wrote:
>>
>>         THANKS JIM!!! That worked. I had to change one more bug, the
>>         element number
>>         of earthcenter was element 0 for each dimension. Here is what
>>         I have now:
>>
>>                double altitude = distance -
>>         vtkGeoMath::EarthRadiusMeters();
>>                double clipdist = vtkGeoMath::EarthRadiusMeters() -
>>         altitude;
>>                double pox = earthcenter[0]+(clipdist*nx);
>>                double poy = earthcenter[1]+(clipdist*ny);
>>                double poz = earthcenter[2]+(clipdist*nz);
>>
>>         You are correct in that the dolly out zoom in affect was happening
>>         previously. It just appeared at first glance that it was inverse.
>>
>>         It is amazing how precise the horizon clips now. It is right
>>         on the money.
>>         You made my day. I can't thank all of you enough for your help.
>>
>>         Maybe this could be incorporated into vtk. I just don't know
>>         where.
>>
>>         Thanks.
>>
>>         -----Original Message-----
>>         From: Jim Peterson [mailto:jimcp at cox.net
>>         <mailto:jimcp at cox.net>] Sent: Saturday, November 20, 2010 11:18 AM
>>         To: Donny
>>         Cc: 'David Gobbi'; 'Aashish Chaudhary'; 'Sebastien Jourdain';
>>         vtkusers at vtk.org <mailto:vtkusers at vtk.org>
>>         Subject: Re: [vtkusers] How to use backface culling with polylines
>>
>>         Sorry, I did say untested.... this
>>
>>                double pox = earthcenter[0]+(clipdist*nx);
>>                double poy = earthcenter[0]+(altitude*ny);
>>                double poz = earthcenter[0]+(altitude*nz);
>>
>>
>>         should have been:
>>
>>                double pox = earthcenter[0]+(clipdist*nx);
>>                double poy = earthcenter[0]+(clipdist*ny);
>>                double poz = earthcenter[0]+(clipdist*nz);
>>
>>         I am not sure I understand going higher shortens the horizon.
>>         This is contrary to the real geometry like
>>         http://en.wikipedia.org/wiki/Horizon#Approximate_formulas
>>         explains the calculations for the real world. It sounds like
>>         you want to change the camera viewangle in proportion to the
>>         altitude to "zoom in" in the target feature as you move away.
>>         I think I would call that a dolly-out-zoom-in video effect.
>>         Camera angle would not affect the visible horizon distance,
>>         just how much of it is in the field of view, in my opinion.
>>
>>         Hope that helped,
>>         Jim
>>
>>         Donny wrote:
>>          
>>
>>             Ok, I am close. The plane is acting just opposite of what
>>             I want though.
>>                
>>
>>         The
>>          
>>
>>             higher up on the horizon I go the less of the horizon I
>>             see, and the lower
>>             on the horizon I go the more I see (including past the
>>             horizon).
>>
>>             Here is the code:
>>
>>                    double dx = earthcenter[0] - camerapos [0];
>>                    double dy = earthcenter[1] - camerapos [1];
>>                    double dz = earthcenter[2] - camerapos [2];        
>>                    double distance = sqrt(dx*dx + dy*dy + dz*dz);
>>
>>                    double nx = -(dx/distance);
>>                    double ny = -(dy/distance);
>>                    double nz = -(dz/distance);                      
>>              double altitude = distance - vtkGeoMath::EarthRadiusMeters();
>>                    double clipdist = vtkGeoMath::EarthRadiusMeters() -
>>             altitude;
>>                    double pox = earthcenter[0]+(clipdist*nx);
>>                    double poy = earthcenter[0]+(altitude*ny);
>>                    double poz = earthcenter[0]+(altitude*nz);
>>                                   m_horizonplane->SetOrigin(pox,poy,poz);
>>                    m_horizonplane->SetNormal(nx,ny,nz);
>>
>>             Thanks.
>>
>>             -----Original Message-----
>>             From: Jim Peterson [mailto:jimcp at cox.net
>>             <mailto:jimcp at cox.net>] Sent: Saturday, November 20, 2010
>>             10:52 AM
>>             To: Donny
>>             Cc: 'David Gobbi'; 'Aashish Chaudhary'; 'Sebastien Jourdain';
>>             vtkusers at vtk.org <mailto:vtkusers at vtk.org>
>>             Subject: Re: [vtkusers] How to use backface culling with
>>             polylines
>>
>>             Donny,
>>             assuming all your coordinates are in meters,
>>             What I was trying to say was project the altitude of the
>>             camera into the earth sphere to locate the clipping plane.
>>             so with the normal calculation you have :
>>
>>             altitude = distance - vtkGeoMath::EarthRadiusMeters();
>>             clipdist = vtkGeoEarth::EarthRadiusMeters() - altitude;
>>             pox = earthcenter[0]+(clipdist*nx);
>>             poy = earthcenter[0]+(altitude*ny);
>>             poz = earthcenter[0]+(altitude*nz);
>>
>>             Untested of course....
>>
>>             Jim
>>
>>             Donny wrote:
>>                  
>>
>>                 Does this look correct to calculate the horizon
>>                 clipping plane?
>>
>>                          double dx = earthcenter[0] - camerapos[0];
>>                        double dy = earthcenter[1] - camerapos[1];
>>                        double dz = earthcenter[2] - camerapos[2];        
>>                        double distance = sqrt(dx*dx + dy*dy + dz*dz);
>>
>>                        double nx = -(dx/distance);
>>                        double ny = -(dy/distance);
>>                        double nz = -(dz/distance);
>>
>>                        //(2 (abs(camera position - globeposition)
>>                 minus globe radius))
>>                        double pox = 2.0 * (abs(camerapos [0] -
>>                 earthcenter [0]) -
>>                 vtkGeoMath::EarthRadiusMeters());
>>
>>                        double poy = 2.0 * (abs(camerapos [1] -
>>                 earthcenter [1]) -
>>                 vtkGeoMath::EarthRadiusMeters());
>>
>>                        double poz = 2.0 * (abs(camerapos [2] -
>>                 earthcenter [2]) -
>>                 vtkGeoMath::EarthRadiusMeters());
>>
>>                        m_horizonplane->SetOrigin(pox,poy,poz);
>>                        m_horizonplane->SetNormal(nx,ny,nz);
>>
>>                 I am not getting the results I expected (the clipping
>>                 plane is way off).
>>
>>                 -----Original Message-----
>>                 From: Jim Peterson [mailto:jimcp at cox.net
>>                 <mailto:jimcp at cox.net>] Sent: Saturday, November 20,
>>                 2010 9:03 AM
>>                 To: Donny
>>                 Cc: 'David Gobbi'; 'Aashish Chaudhary';
>>                 vtkusers at vtk.org <mailto:vtkusers at vtk.org>
>>                 Subject: Re: [vtkusers] How to use backface culling
>>                 with polylines
>>
>>                 Donny,
>>
>>                 I haven't really tried to get this thought into code,
>>                 but in a soid geometry kind of sense, the horizon from
>>                 a point of view is generally described by a clip
>>                 somewhere between the observer and the center of the
>>                 sphere, depending on the altitude. the direction of
>>                 view should not be a factor, and how close the clip
>>                 plane is to the center of the globe depends on the
>>                 altitude. if the observer is at a height of 100' the
>>                 horizon (Excluding other terrain elevation) is 12.25
>>                 miles along the surface of the sphere. the clip
>>                 throught the center of the sphere would make the
>>                 horizon at about 6000 miles.
>>
>>                 I would expect the clip normal to be the normalized
>>                 difference between the camera position and the globe
>>                 position, and the approximate clip plane position to
>>                 be the point that is (2 (abs(camera position - globe
>>                 position) minus globe radius)) from the camera toward
>>                 the globe position.
>>
>>                 If the globe happens to be at 0,0,0 that would
>>                 simplify the calculation to just the globe radius and
>>                 the camera position, but Copernicus changed all that....
>>
>>                 I haven't really studied the GEOVIS classes, but I
>>                 would have thought visible horizon clipping would be
>>                 one of the tools. Maybe this should evolve into a
>>                 contribution.
>>
>>                 Sounds like an interesting project.
>>
>>                 Jim
>>
>>                 Donny wrote:
>>                            
>>
>>                     Hello again. I decided to try David's approach
>>                     with clipping planes.
>>                                      
>>
>>                 Mainly
>>                            
>>
>>                     because I will have quite a few lines when
>>                     including the county lines in
>>                     addition to the state lines and I did not want to
>>                     create that many
>>                     triangles. I was afraid it would slow down the
>>                     performance.
>>
>>                     I have centered the clipping plane at the center
>>                     of the earth and the
>>                                      
>>
>>                 normal
>>                            
>>
>>                     is always the view normal. This works great when
>>                     the focus point is on
>>                                  
>>
>>             the
>>                  
>>
>>                     surface of the earth and I rotate around it. The
>>                     problem occurs when I
>>                                      
>>
>>                 pan.
>>                            
>>
>>                     This moves the camera focal point and when it is
>>                     no longer on the
>>                            
>>
>>         surface
>>          
>>
>>                                      
>>
>>                 of
>>                            
>>
>>                     the earth the clipping plane will show some
>>                     details on the other side of
>>                                      
>>
>>                 the
>>                            
>>
>>                     horizon. How can I force a pan operation to pan
>>                     the focal point on the
>>                     surface of the earth?
>>                     Here is the pan code, I am using .NET delegates
>>                     because of the static
>>                     function pointer limitation for AddObserver:
>>
>>                     void OnVtkMiddleMouseDown(unsigned long eventId,
>>                     System::Object^
>>                                      
>>
>>                 clientData)
>>                            
>>
>>                            {                              
>>                     this->m_interactorstyle->StartPan();
>>                            }
>>
>>                     void OnVtkMiddleMouseUp(unsigned long eventId,
>>                     System::Object^
>>                                  
>>
>>             clientData)
>>                  
>>
>>                            {                      
>>                     this->m_interactorstyle->EndPan();
>>                            }
>>
>>                     void OnVtkMouseMove(unsigned long eventId,
>>                     System::Object^ clientData)
>>                            {                               switch
>>                     (this->m_interactorstyle->GetState())
>>                                            {
>>                                                    case 1:  //VTKIS_ROTATE
>>                                                    this->Rotate();
>>                                                            break;
>>
>>                                                    case 2:  //VTKIS_PAN
>>                                                            this->Pan();
>>                                                            break;
>>
>>                                                    case 4:  //VTKIS_DOLLY
>>                                                            this->Dolly();
>>                                                            break;    
>>                                                                  }
>>                            }
>>
>>                     void Pan()
>>                            {
>>                                  // Get the vector of motion          
>>                                
>>
>>                                  double focalPoint[3];
>>                                  double v[3];
>>                                  double p1[4];
>>                                  double p2[4];
>>
>>
>>                                  double* pos = m_camera->GetPosition();
>>                                  double* fp = m_camera->GetFocalPoint();
>>
>>
>>     
> vtkInteractorStyleUser::ComputeWorldToDisplay(m_backgroundrenderer,
>   
>>                     fp[0], fp[1], fp[2], focalPoint);
>>
>>
>>     
> vtkInteractorStyleUser::ComputeDisplayToWorld(m_backgroundrenderer,
>   
>>                     m_iren->GetEventPosition()[0],
>>                     m_iren->GetEventPosition()[1],
>>                     focalPoint[2],  p1);
>>
>>
>>     
> vtkInteractorStyleUser::ComputeDisplayToWorld(m_backgroundrenderer,
>   
>>                     m_iren->GetLastEventPosition()[0],
>>                     m_iren->GetLastEventPosition()[1],
>>                     focalPoint[2], p2);
>>
>>                                  double npos[3];
>>                                  double nfp[3];
>>
>>                                  for (int i = 0; i < 3; i++)
>>                                    {
>>                                    v[i] = p2[i] - p1[i];
>>                                    npos[i] = pos[i] + v[i];
>>                                    nfp[i] = fp[i] + v[i];
>>                                    }                      
>>
>>                                  m_camera->SetPosition(npos);
>>                                  m_camera->SetFocalPoint(nfp);
>>                                   this->m_iren->Render();
>>
>>                       }
>>
>>                     Thanks.
>>
>>                     -----Original Message-----
>>                     From: David Gobbi [mailto:david.gobbi at gmail.com
>>                     <mailto:david.gobbi at gmail.com>] Sent: Thursday,
>>                     November 18, 2010 9:07 PM
>>                     To: Donny
>>                     Cc: vtkusers at vtk.org <mailto:vtkusers at vtk.org>
>>                     Subject: Re: [vtkusers] How to use backface
>>                     culling with polylines
>>
>>                     You could also add a clipping plane to your vtk
>>                     mapper that cuts the
>>                     globe in half, back to front.  By adding this
>>                     plane only to the mapper
>>                     that renders the lines, you can remove any lines
>>                     that are past the
>>                     horizon.
>>
>>                      David
>>
>>
>>                     On Thu, Nov 18, 2010 at 7:13 PM, Jim Peterson
>>                     <jimcp at cox.net <mailto:jimcp at cox.net>> wrote:
>>                                        
>>
>>                         Donny,
>>                         I think I would run the state lines through a
>>                         ribbon filter making them
>>                                                    
>>
>>                     into
>>                                        
>>
>>                         a triangle strip of some width. the strip
>>                         would have a backface.
>>
>>                         Jim
>>
>>                         Donny wrote:
>>                                                    
>>
>>                             Thanks guys for the feedback. I have
>>                             attached two images to visualize
>>                                                                
>>
>>                     what
>>                                        
>>
>>                             follows. I hope I can explain this clearly.
>>
>>                             I have three renderers that I am adding to
>>                             the render window.
>>
>>                             The first is to contain a textured
>>                             vtkGlobeSource actor and is called
>>                                                          
>>
>>                 the
>>                            
>>
>>                             background renderer.
>>
>>                             The second contains several vtkPolyData
>>                             actors and are lines (State
>>                                        
>>
>>         and
>>          
>>
>>                             county boundaries, roads, rivers…), this
>>                             is called the map renderer.
>>
>>                             The Third contains an actor visualizing a
>>                             weather radar volume, this
>>                                        
>>
>>         is
>>          
>>
>>                             called the radar renderer.
>>
>>                             The background renderer is always set as
>>                             layer 0 and so is always
>>                                                                
>>
>>                     rendered
>>                                        
>>
>>                             first.
>>
>>                             The map renderer and radar renderer will
>>                             alternate between the 1^st
>>                                        
>>
>>         and
>>          
>>
>>                             2^nd layers depending on the view angle of
>>                             the camera.
>>
>>                             If the camera is more than 45 degrees
>>                             above the horizon then the radar
>>                             renderer is layer 1 and the map renderer
>>                             is layer 2 so that the user
>>                                                  
>>
>>             can
>>                  
>>
>>                                                                
>>
>>                     see
>>                                        
>>
>>                             the features below the radar volume.
>>
>>                             If the camera is less than or equal to 45
>>                             degrees above the horizon
>>                                                  
>>
>>             then
>>                  
>>
>>                             the map renderer is layer 1 and the radar
>>                             renderer is layer 2 so that
>>                                                          
>>
>>                 the
>>                            
>>
>>                             radar volume is always in front of the map
>>                             features.
>>
>>                             This works fine until I draw all state
>>                             lines for the entire US.
>>                                        
>>
>>         Because
>>          
>>
>>                             the vtkGlobeSource simulates the curvature
>>                             of the earth I see the
>>                                                                
>>
>>                     backside
>>                                        
>>
>>                             of the state lines where they are over the
>>                             view horizon.
>>
>>                             Is there a way I can put the map features
>>                             and radar volume on the same
>>                             renderer and accomplish the same thing?
>>
>>                             Thanks.
>>
>>                             -----Original Message-----
>>                             *From:* Aashish Chaudhary
>>                             [mailto:aashish.chaudhary at kitware.com
>>                             <mailto:aashish.chaudhary at kitware.com>]
>>                             *Sent:* Thursday, November 18, 2010 8:37 AM
>>                             *To:* David Gobbi
>>                             *Cc:* vtkusers at vtk.org
>>                             <mailto:vtkusers at vtk.org>; Donny
>>                             *Subject:* Re: [vtkusers] How to use
>>                             backface culling with polylines
>>
>>                             Donny,
>>
>>                             Were you talking about hidden lines
>>                             removal may be?
>>
>>                             Thanks,
>>
>>                             On Thu, Nov 18, 2010 at 9:03 AM, David
>>                             Gobbi <david.gobbi at gmail.com
>>                             <mailto:david.gobbi at gmail.com>
>>                             <mailto:david.gobbi at gmail.com
>>                             <mailto:david.gobbi at gmail.com>>> wrote:
>>
>>                             Jerome is correct, OpenGL culls faces
>>                             according to the polygon
>>                             winding. So wireframe polygons can be
>>                             culled, but polylines cannot,
>>                             even if they have normals assigned to
>>                             them. There are some details in
>>                             the OpenGL FAQ:
>>
>>     
> http://www.opengl.org/resources/faq/technical/clipping.htm
>   
>>                             David
>>
>>
>>                             On Wed, Nov 17, 2010 at 11:47 PM, Jérôme
>>                             <jerome.velut at gmail.com
>>                             <mailto:jerome.velut at gmail.com>
>>                             <mailto:jerome.velut at gmail.com
>>                             <mailto:jerome.velut at gmail.com>>> wrote:
>>                                                                
>>
>>                                 Hi Donny,
>>
>>                                 My feeling is that backface culling
>>                                 should not work with polylines
>>                                 because they
>>                                 have actually no face.
>>
>>                                 Jerome
>>
>>                                 2010/11/18 Donny <donnyz at charter.net
>>                                 <mailto:donnyz at charter.net>
>>                                 <mailto:donnyz at charter.net
>>                                 <mailto:donnyz at charter.net>>>:
>>                                                                      
>>                                      
>>
>>                                     I am drawing polylines using
>>                                     vtkPolyData and cannot get backface
>>                                     culling to
>>                                     work with them.
>>
>>
>>
>>                                     I ran into this subject
>>
>>                                                    
>>
>>
>>     
> http://public.kitware.com/pipermail/vtkusers/2003-January/065023.html
>   
>>          
>>
>>                                                                      
>>                                                      
>>
>>                     ,
>>                                        
>>
>>                                     but
>>                                     did not help.
>>
>>
>>
>>                                     Any solutions?
>>
>>
>>
>>                                     Donny Zimmerman
>>
>>                                     donnyz at charter.net
>>                                     <mailto:donnyz at charter.net>
>>                                     <mailto:donnyz at charter.net
>>                                     <mailto:donnyz at charter.net>>
>>
>>                                     308-227-1756
>>                                                                      
>>                                                      
>>
>>
>>     
> _______________________________________________
>   
>>                             Powered by www.kitware.com
>>                             <http://www.kitware.com>
>>                             <http://www.kitware.com>
>>
>>                             Visit other Kitware open-source projects at
>>
>>     
> http://www.kitware.com/opensource/opensource.html
>   
>>                             Please keep messages on-topic and check
>>                             the VTK FAQ at:
>>                             http://www.vtk.org/Wiki/VTK_FAQ
>>
>>                             Follow this link to subscribe/unsubscribe:
>>                             http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>>
>>
>>                             --
>>                             | Aashish Chaudhary
>>                             | R&D Engineer
>>                             | Kitware Inc.
>>                             | www.kitware.com <http://www.kitware.com>
>>                             <http://www.kitware.com>
>>
>>
>>                                                  
>>
>>
>>     
> ------------------------------------------------------------------------
>   
>>                  
>>
>>
>>     
> _______________________________________________
>   
>>                             Powered by www.kitware.com
>>                             <http://www.kitware.com>
>>
>>                             Visit other Kitware open-source projects at
>>
>>     
> http://www.kitware.com/opensource/opensource.html
>   
>>                             Please keep messages on-topic and check
>>                             the VTK FAQ at:
>>                             http://www.vtk.org/Wiki/VTK_FAQ
>>
>>                             Follow this link to subscribe/unsubscribe:
>>                             http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>                                                                
>>
>>                                                    
>>
>>                                        
>>
>>                            
>>
>>                  
>>
>>
>>
>>          
>>
>>
>>
>>
>>
>> -- 
>> | Aashish Chaudhary
>> | R&D Engineer        
>> | Kitware Inc.           
>> | www.kitware.com <http://www.kitware.com>   
>>     
>
>
>   




More information about the vtkusers mailing list