[osg-users] Text Intersecting Earth

Jeffrey M Short jshort8 at csc.com
Tue Oct 16 15:38:37 PDT 2007


Hi,

First off I'm using OSG 1.0.

I am creating an application that has globe viewing features.  The user can
add an location object at a given Latitude, Longitude and Altitude.  Then a
3d model and a text label is placed at that location.  Both the model node
and the text geode are placed under a MatrixTransform with the matrix set
using the
osg::EllipsoidModel->computeLocalToWorldTransformFromLatLongHeight.  The
text uses SCREEN_COORDS as the CharacterSizeMode and uses SCREEN as the
AxisAlignment.

The problem is that the text is intersects the earth when viewed from
certain viewpoints.  I would like to draw the earth first, then draw all
the text, but only draw any particular text geode if and only if the
location is not clipped by the Earth.


My first attempt was as follow:
     I set the text geode depth test to osg::Depth::ALWAYS.

     I added a custom osg::Drawable::CullCallback to the text geodes.  In
the callback's virtual bool cull(osg::NodeVisitor* nv, osg::Drawable*
drawable, osg::State*) const function I got the eye location and the text
location in Earth Centered Cartesian Coordinates.  Then if the dot product
of these 2 position vectors is < 0, return true so the text is culled.


One problem I encountered here was getting the eye location from
CullVisitor::getEyePoint().  This function seems to return the EyePoint in
local coordinates.  I tried using the
osg::computeLocalToWorld(nv->getNodePath()) matrix to transform the
EyePoint to Earth Centered coordinates but that didn't work.  I had
transform osg::Vec4(EyePoint, 1) by the inverse of
osg::EllipoidModel::computeLocalToWorldTransformFromXYZ to get the job
done.

This method works but only when the camera is targeted at the center of the
earth and it only works for locations with 0 altitude (imagine a location
on the "other side" of the Earth from where you are viewing.  If the
location has a large enough altitude you could still see it).

Any suggestions on a better way to accomplish this?

Thanks
     Jeff



Computer Sciences Corporation
Registered Office: 2100 East Grand Avenue, El Segundo California 90245, USA
Registered in USA No: C-489-59

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

This is a PRIVATE message. If you are not the intended recipient, please
delete without copying and kindly advise us by e-mail of the mistake in
delivery.
NOTE: Regardless of content, this e-mail shall not operate to bind CSC to
any order or other contract unless pursuant to explicit written agreement
or government initiative expressly permitting the use of e-mail for such
purpose.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





More information about the osg-users mailing list