Updates for Rainer, and with a few changes by Robert.

This commit is contained in:
Robert Osfield 2004-10-28 09:38:03 +00:00
parent ce73909033
commit e97364899b

View File

@ -7,6 +7,10 @@
#include <osg/Geode> #include <osg/Geode>
#include <osg/ShapeDrawable> #include <osg/ShapeDrawable>
#include <osg/Texture2D> #include <osg/Texture2D>
#include <osg/Material>
#include <osg/Light>
#include <osg/LightSource>
#include <osg/LightModel>
#include <osgUtil/Optimizer> #include <osgUtil/Optimizer>
@ -21,6 +25,32 @@
#include <osgProducer/Viewer> #include <osgProducer/Viewer>
static osg::Vec3 defaultPos( 0.0f, 0.0f, 0.0f );
static osg::Vec3 centerScope(0.0f, 0.0f, 0.0f);
osg::Group* createSunLight()
{
osg::Group* lightNode = new osg::Group;
osg::Light* sunLight = new osg::Light;
sunLight->setPosition( osg::Vec4( 0.0f, 0.0f, 0.0f, 1.0f ) );
sunLight->setAmbient( osg::Vec4( 0.0f, 0.0f, 0.0f, 1.0f ) );
osg::LightSource* sunLightSource = new osg::LightSource;
sunLightSource->setLight( sunLight );
lightNode->addChild( sunLightSource );
osg::LightModel* lightModel = new osg::LightModel;
lightModel->setAmbientIntensity(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
lightNode->getOrCreateStateSet()->setAttribute(lightModel);
return lightNode;
}// end createSunLight
osg::AnimationPath* createAnimationPath(const osg::Vec3& center,float radius,double looptime) osg::AnimationPath* createAnimationPath(const osg::Vec3& center,float radius,double looptime)
{ {
// set up the animation path // set up the animation path
@ -88,6 +118,34 @@ osg::MatrixTransform* createMoonTranslation( double RorbitMoon )
}// end createMoonTranslation }// end createMoonTranslation
osg::Geode* createSpace( double radius, const std::string& name, const std::string& textureName )
{
osg::Sphere *spaceSphere = new osg::Sphere( osg::Vec3( 0.0, 0.0, 0.0 ), radius );
osg::ShapeDrawable *sSpaceSphere = new osg::ShapeDrawable( spaceSphere );
if( !textureName.empty() )
{
osg::Image* image = osgDB::readImageFile( textureName );
if ( image )
{
sSpaceSphere->getOrCreateStateSet()->setTextureAttributeAndModes( 0, new osg::Texture2D( image ), osg::StateAttribute::ON );
// reset the object color to white to allow the texture to set the colour.
sSpaceSphere->setColor( osg::Vec4(1.0f,1.0f,1.0f,1.0f) );
}
}
osg::Geode* geodeSpace = new osg::Geode();
geodeSpace->setName( name );
geodeSpace->addDrawable( sSpaceSphere );
return( geodeSpace );
}// end createSpace
osg::Geode* createPlanet( double radius, const std::string& name, const osg::Vec4& color , const std::string& textureName ) osg::Geode* createPlanet( double radius, const std::string& name, const osg::Vec4& color , const std::string& textureName )
{ {
// create a cube shape // create a cube shape
@ -120,9 +178,9 @@ osg::Geode* createPlanet( double radius, const std::string& name, const osg::Vec
geodePlanet->addDrawable( sPlanetSphere ); geodePlanet->addDrawable( sPlanetSphere );
return( geodePlanet ); return( geodePlanet );
}// end createPlanet }// end createPlanet
//--radiusSun 5.0 --radiusEarth 2.0 --RorbitEarth 10.0 --RorbitMoon 2.0 --radiusMoon 0.5 --tiltEarth 18.0 --rotateSpeedEarth 1.0
//--rotateSpeedMoon 1.0 --rotateSpeedEarthAndMoon 1.0
class SolarSystem class SolarSystem
{ {
@ -137,6 +195,7 @@ public:
double _radiusMoon; double _radiusMoon;
double _RorbitMoon; double _RorbitMoon;
double _rotateSpeedMoon; double _rotateSpeedMoon;
double _radiusSpace;
SolarSystem() SolarSystem()
{ {
@ -149,20 +208,30 @@ public:
_radiusMoon = 0.5; _radiusMoon = 0.5;
_RorbitMoon = 2.0; _RorbitMoon = 2.0;
_rotateSpeedMoon = 1.0; _rotateSpeedMoon = 1.0;
_radiusSpace = 300.0;
} }
osg::Group* built() osg::Group* built()
{ {
osg::Group* thisSystem = new osg::Group; osg::Group* thisSystem = new osg::Group;
osg::StateSet* sunStateSet = new osg::StateSet;
osg::Material* material = new osg::Material;
material->setEmission( osg::Material::FRONT_AND_BACK, osg::Vec4( 1.0f, 1.0f, 0.0f, 0.0f ) );
sunStateSet->setAttributeAndModes( material, osg::StateAttribute::ON );
// create the sun // create the sun
osg::Node* sun = createPlanet( _radiusSun, "Sun", osg::Vec4( 1.0f, 1.0f, 0.5f, 1.0f), "" ); osg::Node* sun = createPlanet( _radiusSun, "Sun", osg::Vec4( 0, 0, 0, 1.0f), "" );
sun->setStateSet( sunStateSet );
// stick sun right under root, no transformations for the sun // stick sun right under root, no transformations for the sun
thisSystem->addChild( sun ); thisSystem->addChild( sun );
// create light source in the sun
osg::Group* sunLight = createSunLight();
//creating right side of the graph with earth and moon and the rotations above it //creating right side of the graph with earth and moon and the rotations above it
@ -196,8 +265,16 @@ public:
earthPosition->addChild( earthMoonGroup ); earthPosition->addChild( earthMoonGroup );
aroundSunRotation->addChild( earthPosition ); aroundSunRotation->addChild( earthPosition );
sunLight->addChild( aroundSunRotation );
thisSystem->addChild( aroundSunRotation ); thisSystem->addChild( sunLight );
#if 0
// add space, but don't light it, as its not illuminated by our sun
osg::Node* space = createSpace( _radiusSpace, "Space", "Images/spacemap1.jpg" );
space->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
thisSystem->addChild( space );
#endif
return( thisSystem ); return( thisSystem );
} }
@ -213,6 +290,8 @@ public:
std::cout << "radiusMoon\t= " << _radiusMoon << std::endl; std::cout << "radiusMoon\t= " << _radiusMoon << std::endl;
std::cout << "RorbitMoon\t= " << _RorbitMoon << std::endl; std::cout << "RorbitMoon\t= " << _RorbitMoon << std::endl;
std::cout << "rotateSpeedMoon\t= " << _rotateSpeedMoon << std::endl; std::cout << "rotateSpeedMoon\t= " << _rotateSpeedMoon << std::endl;
std::cout << "radiusSpace\t= " << _radiusSpace << std::endl;
} }
}; // end SolarSystem }; // end SolarSystem
@ -248,6 +327,8 @@ int main( int argc, char **argv )
while (arguments.read("--radiusMoon",solarSystem._radiusMoon)) { } while (arguments.read("--radiusMoon",solarSystem._radiusMoon)) { }
while (arguments.read("--RorbitMoon",solarSystem._RorbitMoon)) { } while (arguments.read("--RorbitMoon",solarSystem._RorbitMoon)) { }
while (arguments.read("--rotateSpeedMoon",solarSystem._rotateSpeedMoon)) { } while (arguments.read("--rotateSpeedMoon",solarSystem._rotateSpeedMoon)) { }
while (arguments.read("--radiusSpace",solarSystem._radiusSpace)) { }
solarSystem.printParameters(); solarSystem.printParameters();
@ -264,6 +345,8 @@ int main( int argc, char **argv )
std::cout << "--radiusMoon: double" << std::endl; std::cout << "--radiusMoon: double" << std::endl;
std::cout << "--RorbitMoon: double" << std::endl; std::cout << "--RorbitMoon: double" << std::endl;
std::cout << "--rotateSpeedMoon: double" << std::endl; std::cout << "--rotateSpeedMoon: double" << std::endl;
std::cout << "--radiusSpace: double" << std::endl;
return 1; return 1;
} }
@ -297,6 +380,13 @@ int main( int argc, char **argv )
// create the windows and run the threads. // create the windows and run the threads.
viewer.realize(); viewer.realize();
osg::Matrix lookAt;
lookAt.makeLookAt( osg::Vec3(0.0f, -80.0f, 0.0f), centerScope, osg::Vec3(0.0f, 0.0f, 1.0f ) );
viewer.setView( lookAt );
viewer.setClearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
while( !viewer.done() ) while( !viewer.done() )
{ {