[vtkusers] How to use backface culling with polylines
Donny
donnyz at charter.net
Sat Nov 20 12:06:51 EST 2010
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