[vtkusers] How to use backface culling with polylines
Jim Peterson
jimcp at cox.net
Sat Nov 20 13:31:18 EST 2010
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]
> Sent: Saturday, November 20, 2010 11:18 AM
> To: Donny
> Cc: 'David Gobbi'; 'Aashish Chaudhary'; 'Sebastien Jourdain';
> 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]
>> Sent: Saturday, November 20, 2010 10:52 AM
>> To: Donny
>> Cc: 'David Gobbi'; 'Aashish Chaudhary'; 'Sebastien Jourdain';
>> 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]
>>> Sent: Saturday, November 20, 2010 9:03 AM
>>> To: Donny
>>> Cc: 'David Gobbi'; 'Aashish Chaudhary'; 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]
>>>> Sent: Thursday, November 18, 2010 9:07 PM
>>>> To: Donny
>>>> Cc: 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> 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]
>>>>>> *Sent:* Thursday, November 18, 2010 8:37 AM
>>>>>> *To:* David Gobbi
>>>>>> *Cc:* 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>> 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>> 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>>:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> 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>
>>>>>>>>
>>>>>>>> 308-227-1756
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>> _______________________________________________
>>>>>> 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>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>> ------------------------------------------------------------------------
>>
>>
>>>>>> _______________________________________________
>>>>>> Powered by 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
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>
>
>
More information about the vtkusers
mailing list