osg::Node* createModel(bool overlay, osgSim::OverlayNode::OverlayTechnique technique) { osg::Vec3 center(0.0f,0.0f,0.0f); float radius = 100.0f; osg::Group* root = new osg::Group; float baseHeight = center.z()-radius*0.5; osg::Node* baseModel = createBase(osg::Vec3(center.x(), center.y(), baseHeight),radius); osg::Node* movingModel = createMovingModel(center,radius*0.8f); if (overlay) { osgSim::OverlayNode* overlayNode = new osgSim::OverlayNode(technique); overlayNode->setContinuousUpdate(true); overlayNode->setOverlaySubgraph(movingModel); overlayNode->setOverlayBaseHeight(baseHeight-0.01); overlayNode->addChild(baseModel); root->addChild(overlayNode); } else { root->addChild(baseModel); } root->addChild(movingModel); return root; }
osg::Node* createModel() { osg::Vec3 center(0.0f,0.0f,0.0f); float radius = 100.0f; osg::Group* root = new osg::Group; root->addChild(createMovingModel(center,radius*0.8f)); root->addChild(createBase(center-osg::Vec3(0.0f,0.0f,radius*0.5),radius)); return root; }
osg::Node* createModel(osg::ArgumentParser& /*arguments*/) { osg::Vec3 center(0.0f,0.0f,0.0f); float radius = 100.0f; // the shadower model osg::Node* shadower = createMovingModel(center,radius*0.5f); shadower->setNodeMask(CastsShadowTraversalMask); // the shadowed model osg::Node* shadowed = createBase(center-osg::Vec3(0.0f,0.0f,radius*0.25),radius); shadowed->setNodeMask(ReceivesShadowTraversalMask); osg::Group* group = new osg::Group; group->addChild(shadowed); group->addChild(shadower); return group; }
osg::Node* createModel() { osg::Vec3 center(0.0f,0.0f,0.0f); float radius = 100.0f; // the shadower model osg::Node* shadower = createMovingModel(center,radius*0.5f); // the shadowed model osg::Node* shadowed = createBase(center-osg::Vec3(0.0f,0.0f,radius*0.1),radius); // combine the models together to create one which has the shadower and the shadowed with the required callback. osg::Group* root = new osg::Group; root->setStateSet(createSpotLightDecoratorState(0,1)); root->addChild(shadower); root->addChild(shadowed); return root; }
void build_world(osg::Group *root) { osg::Geode* terrainGeode = new osg::Geode; // create terrain { osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet(); osg::ref_ptr<osg::Image> image = osgDB::readRefImageFile("Images/lz.rgb"); if (image) { osg::Texture2D* texture = new osg::Texture2D; texture->setImage(image); stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON); } terrainGeode->setStateSet( stateset ); float size = 1000; // 10km; float scale = size/39.0f; // 10km; float z_scale = scale*3.0f; osg::HeightField* grid = new osg::HeightField; grid->allocate(38,39); grid->setXInterval(scale); grid->setYInterval(scale); for(unsigned int r=0; r<39; ++r) { for(unsigned int c=0; c<38; ++c) { grid->setHeight(c,r,z_scale*vertex[r+c*39][2]); } } terrainGeode->addDrawable(new osg::ShapeDrawable(grid)); root->addChild(terrainGeode); } // create particle effects { osg::Vec3 position = computeTerrainIntersection(terrainGeode,100.0f,100.0f); osgParticle::ExplosionEffect* explosion = new osgParticle::ExplosionEffect(position, 10.0f); osgParticle::ExplosionDebrisEffect* explosionDebri = new osgParticle::ExplosionDebrisEffect(position, 10.0f); osgParticle::SmokeEffect* smoke = new osgParticle::SmokeEffect(position, 10.0f); osgParticle::FireEffect* fire = new osgParticle::FireEffect(position, 10.0f); explosion->setWind(wind); explosionDebri->setWind(wind); smoke->setWind(wind); fire->setWind(wind); root->addChild(explosion); root->addChild(explosionDebri); root->addChild(smoke); root->addChild(fire); } // create particle effects { osg::Vec3 position = computeTerrainIntersection(terrainGeode,200.0f,100.0f); osgParticle::ExplosionEffect* explosion = new osgParticle::ExplosionEffect(position, 1.0f); osgParticle::ExplosionDebrisEffect* explosionDebri = new osgParticle::ExplosionDebrisEffect(position, 1.0f); osgParticle::SmokeEffect* smoke = new osgParticle::SmokeEffect(position, 1.0f); osgParticle::FireEffect* fire = new osgParticle::FireEffect(position, 1.0f); explosion->setWind(wind); explosionDebri->setWind(wind); smoke->setWind(wind); fire->setWind(wind); root->addChild(explosion); root->addChild(explosionDebri); root->addChild(smoke); root->addChild(fire); } // create the moving models. { root->addChild(createMovingModel(osg::Vec3(500.0f,500.0f,500.0f),300.0f)); } }