[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