[osg-users] [vpb] geographic to geocentric coordinate transformation

Christian Schulte christian.schulte at onera.fr
Thu Jun 18 00:19:11 PDT 2015


Hello Elias,

since you have created your terrain using --geocentric in osgdem the 
terrain is indeed in ECEF coordinates, but there is no reason that your 
cessna model is. Looking at your code, the cessna is at the earth centre 
(0.0,0.0,0.0). If you want to have your cessna on your terrain you 
should load your cessna on a PositionAttitudeTransform and move it 
correctly onto earth surface, using the ellipsoid xyzFromLatLonEle. You 
should try to place your camera also using this and decomposing your 
matrix in order to find where is the problem( 
cam->setViewMatrix(translation * toYup * rotation);)
Also you should use as much as possible the osg functionalities in order 
to use the same math constants (osg::PI_2 instead of _M_PI_2).

Regards,

Christian

Le 17/06/2015 10:39, Elias Tarasov a écrit :
> Hello!
> It seems i have a problem Deniz had faced previously.
> My generated terrain viewed from osgviewer is here:
> https://drive.google.com/file/d/0ByDDImhSolf6Szh5YW81MDdqV2M/view?usp=sharing
>
> My gdalinfo for dem file used to generate terrain is here:
>
> Driver: GTiff/GeoTIFF
> Files: n30_w086_1arc_v3_conv.tif
>         n30_w086_1arc_v3_conv.tif.aux.xml
> Size is 58, 50
> Coordinate System is:
> GEOGCS["WGS 84",
>      DATUM["WGS_1984",
>          SPHEROID["WGS 84",6378137,298.257223563,
>              AUTHORITY["EPSG","7030"]],
>          AUTHORITY["EPSG","6326"]],
>      PRIMEM["Greenwich",0],
>      UNIT["degree",0.0174532925199433],
>      AUTHORITY["EPSG","4326"]]
> Origin = (-85.495972222222221,30.536250000000003)
> Pixel Size = (0.000277777777778,-0.000277777777778)
> Metadata:
>    AREA_OR_POINT=Point
>    DTED_CompilationDate=0002
>    DTED_DataEdition=02
>    DTED_DigitizingSystem=SRTM
>    DTED_HorizontalAccuracy=0013
>    DTED_HorizontalDatum=WGS84
>    DTED_MaintenanceDate=0000
>    DTED_MaintenanceDescription=0000
>    DTED_MatchMergeDate=0000
>    DTED_MatchMergeVersion=A
>    DTED_NimaDesignator=DTED2
>    DTED_OriginLatitude=0300000N
>    DTED_OriginLongitude=0860000W
>    DTED_Producer=USCNIMA
>    DTED_RelHorizontalAccuracy=NA
>    DTED_RelVerticalAccuracy=0004
>    DTED_SecurityCode_DSI=U
>    DTED_SecurityCode_UHL=U
>    DTED_UniqueRef_DSI=H24 084
>    DTED_UniqueRef_UHL=H24 084
>    DTED_VerticalAccuracy_ACC=0005
>    DTED_VerticalAccuracy_UHL=0005
>    DTED_VerticalDatum=E96
> Image Structure Metadata:
>    INTERLEAVE=BAND
> Corner Coordinates:
> Upper Left  ( -85.4959722,  30.5362500) ( 85d29'45.50"W, 30d32'10.50"N)
> Lower Left  ( -85.4959722,  30.5223611) ( 85d29'45.50"W, 30d31'20.50"N)
> Upper Right ( -85.4798611,  30.5362500) ( 85d28'47.50"W, 30d32'10.50"N)
> Lower Right ( -85.4798611,  30.5223611) ( 85d28'47.50"W, 30d31'20.50"N)
> Center      ( -85.4879167,  30.5293056) ( 85d29'16.50"W, 30d31'45.50"N)
> Band 1 Block=58x50 Type=Int16, ColorInterp=Gray
>    Min=31.000 Max=61.000
>    Minimum=31.000, Maximum=61.000, Mean=49.202, StdDev=6.253
>    NoData Value=0
>    Unit Type: m
>    Metadata:
>      STATISTICS_MAXIMUM=61
>      STATISTICS_MEAN=49.202413793103
>      STATISTICS_MINIMUM=31
>      STATISTICS_STDDEV=6.2528388891449
> 		
> Here, center of my terrain is:
> Center      ( -85.4879167,  30.5293056) ( 85d29'16.50"W, 30d31'45.50"N)
>
> Now i want to place a camera in the center of that terrain to use it from an app:
>
> const double M_PI_2 = 1.57079632679489661923;
>
> int main( int argc, char** argv ) {
>
> 	osg::ref_ptr<osg::Group> root = new osg::Group;
> 	osg::ref_ptr<osg::Node> cessna = osgDB::readNodeFile("c:/OpenSceneGraph/data/cessnafire.osg");
> 	osg::ref_ptr<osg::Node> map = osgDB::readNodeFile("c:/Terrain/FromUSGS/output/out.osgb");
> 	root->addChild( cessna.get() );
> 	root->addChild( map.get() );
> 			
> 	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
> 	viewer->setSceneData( root.get() );
>
> 	osg::Matrixd vm;
> 	osg::EllipsoidModel ellipsoid;
> 	ellipsoid.computeLocalToWorldTransformFromLatLongHeight(osg::DegreesToRadians(-85.4877762), osg::DegreesToRadians(30.5292506), 100, vm);
> 	vm.invert(vm);
>
> 	osg::Matrixd rotation2YUp;
> 	rotation2YUp.makeRotate(-M_PI_2, osg::Vec3f(1.0, 0.0, 0.0));
> 	vm *= rotation2YUp;
> 	viewer->getCamera()->setViewMatrix(vm);
>
> 	return viewer->run();
> }
>
> But i don't see anything. Just empty screen.
> Well, since terrain had been built in geocentric mode, i think app somehow moved terrain and cessna to the correct position in ECEF.
> So, i just need to move a camera to that position.
>
> I guess camera's position is wrong, but i don't know how to fix it.
>
> Thank you!
>
> Cheers,
> Elias
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=64106#64106
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>


-- 
SCHULTE Christian
Ingénieur Recherche
Responsable du Laboratoire de Simulation
ONERA - DCSD/PSEV
Département Commande des Systèmes et Dynamique du Vol
ONERA - Centre de Salon de Provence
BA 701
13661 SALON AIR Cedex - France
Tel :04.90.17.01.45




More information about the osg-users mailing list