本文整理汇总了C++中osg::NodeRefPtr::addChild方法的典型用法代码示例。如果您正苦于以下问题:C++ NodeRefPtr::addChild方法的具体用法?C++ NodeRefPtr::addChild怎么用?C++ NodeRefPtr::addChild使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类osg::NodeRefPtr
的用法示例。
在下文中一共展示了NodeRefPtr::addChild方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createLabeledTorus
OSG::NodeTransitPtr createLabeledTorus(OSG::Vec3f trans, int idx)
{
OSG::NodeTransitPtr node = OSG::Node::create();
OSG::TransformRefPtr xform = OSG::Transform::create();
OSG::Matrix mat;
// --- setup transform ------------------
mat.setIdentity();
mat.setTranslate(trans);
xform->setMatrix(mat);
node->setCore(xform);
// --- setup label ----------------------
OSG::NodeRefPtr labelNode = OSG::Node::create();
OSG::LabelRefPtr label =
(idx) ? createTextLabel(idx) : createIconLabel();
updateLabelParams(label, idx);
labelNode->setCore(label);
// --- add torus ------------------------
labelNode->addChild(OSG::makeTorus(.5, 2, 16, 16));
node->addChild(labelNode);
return node;
}
示例2: main
int main(int argc, char* argv[])
{
std::cerr << argv[0] << ". Press 'h' for keys" << std::endl;
// Init OSG and glut.
OSG::osgInit(argc,argv);
{
int winid = setupGLUT(&argc, argv);
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
printFontFamilies();
// load the scene
OSG::NodeRefPtr scene = OSG::Node::create();
scene->setCore(OSG::Group::create());
// Setup text sample
gTextStuff = new TextStuff();
gTextStuff->initialize();
gTextStuff->updateFace();
gTextStuff->updateScene();
scene->addChild(gTextStuff->mRootNode);
mgr = new OSG::SimpleSceneManager;
// Tell the manager about the window and scene
mgr->setWindow(gwin );
mgr->setRoot(scene);
// Start it up
mgr->showAll();
}
glutMainLoop();
return 0;
}
示例3: main
//.........这里部分代码省略.........
OSG::GeoUInt32PropertyRefPtr ind2 = OSG::GeoUInt32Property::create();
// fill first index (will be used for positions)
ind1->push_back(0); // polygon
ind1->push_back(1);
ind1->push_back(2);
ind1->push_back(3);
ind1->push_back(7); // triangle 1
ind1->push_back(4);
ind1->push_back(8);
ind1->push_back(5); // triangle 2
ind1->push_back(6);
ind1->push_back(9);
ind1->push_back(1); // quad 1
ind1->push_back(2);
ind1->push_back(6);
ind1->push_back(5);
ind1->push_back(3); // quad 2
ind1->push_back(0);
ind1->push_back(4);
ind1->push_back(7);
// fill second index (will be used for colors/normals)
ind2->push_back(3); // polygon
ind2->push_back(3);
ind2->push_back(3);
ind2->push_back(3);
ind2->push_back(4); // triangle 1
ind2->push_back(4);
ind2->push_back(4);
ind2->push_back(5); // triangle 2
ind2->push_back(5);
ind2->push_back(5);
ind2->push_back(5); // quad 1
ind2->push_back(5);
ind2->push_back(5);
ind2->push_back(5);
ind2->push_back(4); // quad 2
ind2->push_back(4);
ind2->push_back(4);
ind2->push_back(4);
/*
Put it all together into a Geometry NodeCore.
*/
OSG::GeometryRefPtr geo = OSG::Geometry::create();
geo->setTypes (type);
geo->setLengths (lens);
/*
Set the properties and indices used to index them.
Calling geo->setProperty(pnts, Geometry::PositionsIndex) is the
same as calling geo->setPositions(pnts), but this way it is
more obvious which properties and indices go together.
*/
geo->setProperty(pnts, OSG::Geometry::PositionsIndex);
geo->setIndex (ind1, OSG::Geometry::PositionsIndex);
geo->setProperty(norms, OSG::Geometry::NormalsIndex );
geo->setIndex (ind2, OSG::Geometry::NormalsIndex );
geo->setProperty(colors, OSG::Geometry::ColorsIndex );
geo->setIndex (ind2, OSG::Geometry::ColorsIndex );
geo->setMaterial (OSG::getDefaultMaterial());
// put the geometry core into a node
OSG::NodeRefPtr n = OSG::Node::create();
n->setCore(geo);
// add a transformation to make it move
OSG::NodeRefPtr scene = OSG::Node::create();
trans = OSG::Transform::create();
scene->setCore(trans);
scene->addChild(n);
OSG::commitChanges();
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
// tell the manager what to manage
mgr->setWindow(gwin );
mgr->setRoot (scene);
// show the whole scene
mgr->showAll();
}
// GLUT main loop
glutMainLoop();
return 0;
}
示例4: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
_scene = OSG::makeCoredNode<OSG::Group>();
// create four lights sharing the same beacon.
OSG::TransformRefPtr light_trans;
OSG::NodeRefPtr light_beacon =
OSG::makeCoredNode<OSG::Transform>(&light_trans);
light_trans->editMatrix().setTranslate(0.0, 0.0, 10.0);
// red light.
OSG::PointLightRefPtr light1_core;
OSG::NodeRefPtr light1 =
OSG::makeCoredNode<OSG::PointLight>(&light1_core);
light1_core->setAmbient(0.0,0.0,0.0,1);
light1_core->setDiffuse(1.0,0.0,0.0,1);
light1_core->setSpecular(0.8f,0.8f,0.8f,1);
light1_core->setBeacon(light_beacon);
light1_core->setOn(true);
// green light.
OSG::PointLightRefPtr light2_core;
OSG::NodeRefPtr light2 =
OSG::makeCoredNode<OSG::PointLight>(&light2_core);
light2_core->setAmbient(0.0,0.0,0.0,1);
light2_core->setDiffuse(0.0,1.0,0.0,1);
light2_core->setSpecular(0.8f,0.8f,0.8f,1);
light2_core->setBeacon(light_beacon);
light2_core->setOn(true);
// blue light.
OSG::PointLightRefPtr light3_core;
OSG::NodeRefPtr light3 =
OSG::makeCoredNode<OSG::PointLight>(&light3_core);
light3_core->setAmbient(0.0,0.0,0.0,1);
light3_core->setDiffuse(0.0,0.0,1.0,1);
light3_core->setSpecular(0.8f,0.8f,0.8f,1);
light3_core->setBeacon(light_beacon);
light3_core->setOn(true);
// white light.
OSG::PointLightRefPtr light4_core;
OSG::NodeRefPtr light4 =
OSG::makeCoredNode<OSG::PointLight>(&light4_core);
light4_core->setAmbient(0.0,0.0,0.0,1);
light4_core->setDiffuse(1.0,1.0,1.0,1);
light4_core->setSpecular(0.0,0.0,0.0,1);
light4_core->setBeacon(light_beacon);
light4_core->setOn(true);
OSG::NodeRefPtr bottom = OSG::makePlane(25.0, 25.0, 128, 128);
// create three spheres.
OSG::NodeRefPtr sphere1 = OSG::makeLatLongSphere(50, 50, 1.0);
OSG::TransformRefPtr sphere1_trans_core;
OSG::NodeRefPtr sphere1_trans =
OSG::makeCoredNode<OSG::Transform>(&sphere1_trans_core);
sphere1_trans_core->editMatrix().setTranslate(-5.0, 0.0, 5.0);
sphere1_trans->addChild(sphere1);
OSG::NodeRefPtr sphere2 = OSG::makeLatLongSphere(50, 50, 1.0);
OSG::TransformRefPtr sphere2_trans_core;
OSG::NodeRefPtr sphere2_trans =
OSG::makeCoredNode<OSG::Transform>(&sphere2_trans_core);
sphere2_trans_core->editMatrix().setTranslate(0.0, 0.0, 5.0);
sphere2_trans->addChild(sphere2);
OSG::NodeRefPtr sphere3 = OSG::makeLatLongSphere(50, 50, 1.0);
OSG::TransformRefPtr sphere3_trans_core;
OSG::NodeRefPtr sphere3_trans =
OSG::makeCoredNode<OSG::Transform>(&sphere3_trans_core);
sphere3_trans_core->editMatrix().setTranslate(5.0, 0.0, 5.0);
sphere3_trans->addChild(sphere3);
light1->addChild(sphere1_trans);
light2->addChild(sphere2_trans);
light3->addChild(sphere3_trans);
light4->addChild(bottom);
_scene->addChild(light_beacon);
_scene->addChild(light1);
_scene->addChild(light2);
_scene->addChild(light3);
//.........这里部分代码省略.........
示例5: main
//
// Initialize GLUT & OpenSG and set up the scene
//
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
mgr->setWindow(gwin);
// create a pretty simple graph: a Group with two Transforms as children,
// each of which carries a single Geometry.
// The scene
OSG::NodeRefPtr scene = OSG::Node::create();
// The cylinder and its transformation
OSG::NodeRefPtr cyl = OSG::Node::create();
OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 24,
true, true, true );
cyl->setCore(cylgeo);
cyltrans = OSG::Transform::create();
OSG::NodeRefPtr cyltransnode = OSG::Node::create();
cyltransnode->setCore (cyltrans);
cyltransnode->addChild(cyl );
// add it to the scene
scene->addChild(cyltransnode);
// The torus and its transformation
OSG::NodeRefPtr torus = OSG::Node::create();
OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 24, 36 );
torus->setCore(torusgeo);
tortrans = OSG::Transform::create();
OSG::NodeRefPtr tortransnode = OSG::Node::create();
tortransnode->setCore (tortrans);
tortransnode->addChild(torus );
// add it to the scene
scene->addChild(tortransnode);
//
// create the shader program
//
OSG::ShaderProgramChunkRefPtr prog_chunk = OSG::ShaderProgramChunk::create();
OSG::ShaderProgramRefPtr vertShader = OSG::ShaderProgram::createVertexShader();
OSG::ShaderProgramRefPtr fragShader = OSG::ShaderProgram::createFragmentShader();
vertShader->setProgram(get_vp_program());
fragShader->setProgram(get_fp_program());
//
// binding the unifrom block to a buffer binding point can be performed
// either by calling the shaders's addUniformBlock method or by
// adding a 'uniform block' variable to a ShaderProgramVariableChunk.
// In the following we use both variants for illustration.
//
fragShader->addUniformBlock("Materials", 1); // block binding point
fragShader->addUniformBlock("Lights", 2); // block binding point
//
// The following is replaced by adding ShaderProgramVariableChunk objects
// to the chunk material. See below...
//
// fragShader->addUniformBlock("GeomState", 3); // block binding point
prog_chunk->addShader(vertShader);
prog_chunk->addShader(fragShader);
//
// create uniform buffer objects and corresponding materials
//
OSG::UniformBufferObjChunkRefPtr ubo_material_database = create_material_database_state(materials);
ubo_light_state = create_light_state(lights);
OSG::PolygonChunkRefPtr polygon_chunk = OSG::PolygonChunk::create();
polygon_chunk->setFrontMode(GL_FILL);
polygon_chunk->setBackMode(GL_FILL);
polygon_chunk->setCullFace(GL_NONE);
//.........这里部分代码省略.........
示例6: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
OSG::preloadSharedObject("OSGFileIO");
OSG::preloadSharedObject("OSGTBFileIO");
OSG::preloadSharedObject("OSGImageFileIO");
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
// create a pretty simple graph: a Group with two Transforms as children,
// each of which carries a single Geometry.
// The scene group
OSG::NodeRefPtr scene = OSG::Node::create();
OSG::GroupRefPtr g = OSG::Group::create();
scene->setCore(g);
// The cylinder and its transformation
OSG::NodeRefPtr cyl = OSG::Node::create();
OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 64,
true, true, true );
cyl->setCore(cylgeo);
cyltrans = OSG::Transform::create();
OSG::NodeRefPtr cyltransnode = OSG::Node::create();
cyltransnode->setCore (cyltrans);
cyltransnode->addChild(cyl );
// add it to the scene
scene->addChild(cyltransnode);
// The torus and its transformation
OSG::NodeRefPtr torus = OSG::Node::create();
OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 32, 64 );
torus->setCore(torusgeo);
tortrans = OSG::Transform::create();
OSG::NodeRefPtr tortransnode = OSG::Node::create();
tortransnode->setCore (tortrans);
tortransnode->addChild(torus );
// add it to the scene
scene->addChild(tortransnode);
// create the materials: Here, just using cgfx materials.
OSG::CgFXMaterialRefPtr mat1 = OSG::CgFXMaterial::create();
if(argc > 1)
{
mat1->setEffectFile(argv[1]);
}
// assign the material to the geometry
cylgeo->setMaterial(mat1);
// assign the material to the geometry
torusgeo->setMaterial(mat1);
OSG::commitChanges();
// create the SimpleSceneManager helper
mgr = new OSG::SimpleSceneManager;
// tell the manager what to manage
mgr->setWindow(gwin );
// file io
OSG::FCFileType::FCPtrStore Containers;
Containers.insert(scene);
//Use an empty Ignore types vector
OSG::FCFileType::FCTypeVector IgnoreTypes;
//IgnoreTypes.push_back(Node::getClassType().getId());
//Write the Field Containers to a xml file
OSG::FCFileHandler::the()->write(Containers,OSG::BoostPath("C:/Users/danielg/Desktop/test.xml"),IgnoreTypes);
//Read FieldContainers from an XML file
//.........这里部分代码省略.........
示例7: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the scene
// this time, create just the core of the geometry
OSG::GeometryRefPtr torus = OSG::makeTorusGeo( .5, 2, 8, 12 );
// create the scene
// the scene has a single group with ncopies transformations below,
// each of these carries a Node that shares the geometry
/*
The Switch NodeCore very similar to the Group, but it has the additional
capability to only show one or none of its children.
This is controlled by the choice Field, and is used below in the keys
function.
*/
// create the root Switch node
OSG::NodeRefPtr scene = OSG::Node::create();
sw = OSG::Switch::create();
sw->setChoice(OSG::Switch::ALL);
scene->setCore(sw);
// create the copied geometry nodes and their transformations
for(OSG::UInt16 i = 0; i<ncopies; ++i)
{
// create the nodes for the shared Geometry core
OSG::NodeRefPtr geonode = OSG::Node::create();
// assign the Core to the Node
geonode->setCore(torus);
// add a transformation for every Geometry
OSG::NodeRefPtr transnode = OSG::Node::create();
trans[i] = OSG::Transform::create();
transnode->setCore (trans[i]);
transnode->addChild(geonode );
scene->addChild(transnode);
}
OSG::commitChanges();
// create the SimpleSceneManager helper
mgr = new OSG::SimpleSceneManager;
// tell the manager what to manage
mgr->setWindow(gwin );
mgr->setRoot (scene);
// show the whole scene
mgr->showAll();
}
// GLUT main loop
glutMainLoop();
return 0;
}
示例8: main
//
// Initialize GLUT & OpenSG and set up the scene
//
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
mgr->setWindow(gwin);
// create a pretty simple graph: a Group with two Transforms as children,
// each of which carries a single Geometry.
// The scene
OSG::NodeRefPtr scene = OSG::Node::create();
// The cylinder and its transformation
OSG::NodeRefPtr cyl = OSG::Node::create();
OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 24,
true, true, true );
cyl->setCore(cylgeo);
cyltrans = OSG::Transform::create();
OSG::NodeRefPtr cyltransnode = OSG::Node::create();
cyltransnode->setCore (cyltrans);
cyltransnode->addChild(cyl );
// add it to the scene
scene->addChild(cyltransnode);
// The torus and its transformation
OSG::NodeRefPtr torus = OSG::Node::create();
OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 24, 36 );
torus->setCore(torusgeo);
tortrans = OSG::Transform::create();
OSG::NodeRefPtr tortransnode = OSG::Node::create();
tortransnode->setCore (tortrans);
tortransnode->addChild(torus );
// add it to the scene
scene->addChild(tortransnode);
//
// create the shader program
//
OSG::ShaderProgramChunkRefPtr prog_chunk = OSG::ShaderProgramChunk::create();
OSG::ShaderProgramRefPtr vertShader = OSG::ShaderProgram::createVertexShader();
OSG::ShaderProgramRefPtr fragShader = OSG::ShaderProgram::createFragmentShader();
vertShader->setProgram(get_vp_program());
fragShader->setProgram(get_fp_program());
//
// binding the shader storage block to a buffer binding point can be performed
// either by calling the shaders's addShaderStorageBlock method or by
// adding a 'buffer block' variable to a ShaderProgramVariableChunk.
// In the following we use both variants for illustration.
//
fragShader->addShaderStorageBlock("ExampleBlock", 1); // block binding point
prog_chunk->addShader(vertShader);
prog_chunk->addShader(fragShader);
//
// create shader storage buffer object for block 'ExampleBlock'
//
OSG::MultiPropertySSBOChunkRefPtr ssbo_example_block = create_example_block_state();
OSG::PolygonChunkRefPtr polygon_chunk = OSG::PolygonChunk::create();
polygon_chunk->setFrontMode(GL_FILL);
polygon_chunk->setBackMode(GL_FILL);
polygon_chunk->setCullFace(GL_NONE);
OSG::DepthChunkRefPtr depth_chunk = OSG::DepthChunk::create();
depth_chunk->setEnable(true);
OSG::ChunkMaterialRefPtr prog_state = OSG::ChunkMaterial::create();
prog_state->addChunk(ssbo_example_block, 1); // buffer binding point 1
prog_state->addChunk(prog_chunk);
prog_state->addChunk(polygon_chunk);
//.........这里部分代码省略.........
示例9: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
printf("Press key '1' or '2' to switch between one and two light sources.\n");
// OSG init
OSG::osgInit(argc,argv);
globals = new GlobalObjects;
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// GLUT init
int winid = setupGLUT(&argc, argv);
globals->gwin = OSG::GLUTWindow::create();
/*
Construct a scene with a ground plane, some objects and two lights.
Nothing very interesting at this point.
See further down for the part relevant to shadows.
*/
globals->rootNode = OSG::makeCoredNode<OSG::Group>();
OSG::NodeRefPtr scene = OSG::makeCoredNode<OSG::Group>();
// create lights
OSG::TransformRefPtr point1_trans;
OSG::NodeRefPtr point1 = OSG::makeCoredNode<OSG::PointLight>(&globals->point1_core);
OSG::NodeRefPtr point1_beacon = OSG::makeCoredNode<OSG::Transform >(&point1_trans);
point1_trans->editMatrix().setTranslate(0.0, 0.0, 15.0);
globals->point1_core->setAmbient(0.15f,0.15f,0.15f,1);
globals->point1_core->setDiffuse(0.4f,0.4f,0.4f,1);
globals->point1_core->setSpecular(0.0f,0.0f,0.0f,1);
globals->point1_core->setBeacon(point1_beacon);
globals->point1_core->setOn(true);
OSG::TransformRefPtr point2_trans;
OSG::NodeRefPtr point2 = OSG::makeCoredNode<OSG::PointLight>(&globals->point2_core);
OSG::NodeRefPtr point2_beacon = OSG::makeCoredNode<OSG::Transform >(&point2_trans);
point2_trans->editMatrix().setTranslate(2.5, 2.5, 15.0);
globals->point2_core->setAmbient(0.15f,0.15f,0.15f,1);
globals->point2_core->setDiffuse(0.4f,0.4f,0.4f,1);
globals->point2_core->setSpecular(0.0f,0.0f,0.0f,1);
globals->point2_core->setBeacon(point2_beacon);
globals->point2_core->setOn(true);
point1->addChild(point2);
point2->addChild(scene );
// create scene
// bottom
OSG::NodeRefPtr plane = OSG::makePlane(25.0, 25.0, 128, 128);
OSG::UChar8 imgdata[] =
{ 255,0,0, 0,255,0, 0,0,255, 255,255,0 };
OSG::ImageRefPtr plane_img = OSG::Image::create();
plane_img->set(OSG::Image::OSG_RGB_PF, 2, 2, 1, 1, 1, 0, imgdata);
OSG::TextureObjChunkRefPtr plane_tex = OSG::TextureObjChunk::create();
plane_tex->setImage(plane_img);
plane_tex->setMinFilter(GL_LINEAR);
plane_tex->setMagFilter(GL_LINEAR);
plane_tex->setWrapS(GL_REPEAT);
plane_tex->setWrapT(GL_REPEAT);
OSG::TextureEnvChunkRefPtr plane_tex_env = OSG::TextureEnvChunk::create();
plane_tex_env->setEnvMode(GL_MODULATE);
OSG::SimpleMaterialRefPtr plane_mat = OSG::SimpleMaterial::create();
plane_mat->setAmbient(OSG::Color3f(0.3f,0.3f,0.3f));
plane_mat->setDiffuse(OSG::Color3f(1.0f,1.0f,1.0f));
plane_mat->addChunk(plane_tex);
plane_mat->addChunk(plane_tex_env);
OSG::GeometryRefPtr plane_geo = dynamic_cast<OSG::Geometry *>(plane->getCore());
plane_geo->setMaterial(plane_mat);
// box
OSG::NodeRefPtr box_trans_node = OSG::makeCoredNode<OSG::Transform>(&globals->box_trans);
globals->box_trans->editMatrix().setTranslate(0.0, 0.0, 2.0);
OSG::NodeRefPtr box = OSG::makeBox(8.0f, 8.0f, 0.8f, 10, 10 , 10);
box_trans_node->addChild(box);
OSG::SimpleMaterialRefPtr box_mat = OSG::SimpleMaterial::create();
box_mat->setAmbient(OSG::Color3f(0.0f,0.0f,0.0f));
box_mat->setDiffuse(OSG::Color3f(0.0f,0.0f,1.0f));
OSG::GeometryRefPtr box_geo = dynamic_cast<OSG::Geometry *>(box->getCore());
box_geo->setMaterial(box_mat);
// cylinder1
OSG::NodeRefPtr cylinder1_trans_node = OSG::makeCoredNode<OSG::Transform>(&globals->cylinder1_trans);
globals->cylinder1_trans->editMatrix().setTranslate(0.0, 0.0, 5.0);
//.........这里部分代码省略.........
示例10: main
int main(int argc, char **argv)
{
// we need to load some relative images and geometry files.
// to make this work reliable (e.g. starting the tutorial via link)
// we use the argv[0] parameter.
#ifdef WIN32
std::string sep("\\");
#else
std::string sep("/");
#endif
std::string path = argv[0];
// remove app name
std::string::size_type i = path.rfind(sep);
if(i != std::string::npos)
path = path.substr(0, i);
// set the current dir to the application dir.
OSG::Directory::setCurrent(path.c_str());
// OSG init
OSG::osgInit(argc, argv);
/* Initialize GLUT state - glut will take any command line arguments that pertain to it or
X Windows - look at its documentation at http://reality.sgi.com/mjk/spec3/spec3.html */
glutInit(&argc, argv);
/* Select type of Display mode:
Double buffer
RGBA color
Alpha components supported (use GLUT_ALPHA)
Depth buffer */
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
/* get a 640 x 480 window */
//glutInitWindowSize(640, 480);
glutInitWindowSize(Width, Height);
/* the window starts at the upper left corner of the screen */
glutInitWindowPosition(300, 0);
/* Open a window */
window = glutCreateWindow("Oz, Mouse Control");
if (m_bFullscreen)
glutFullScreen();
glutSetCursor(GLUT_CURSOR_NONE);
glutDisplayFunc(&DrawGLScene);
// register all GLUT callback functions
glutIdleFunc(idleFunc);
/* Register the function called when our window is resized. */
glutReshapeFunc(ReSizeGLScene);
/* Register the function called when the keyboard is pressed. */
glutKeyboardFunc(keyPressed);
/* Register the function called when special keys (arrows, page down, etc) are pressed. */
//glutSpecialFunc(&specialKeyPressed);
glutMouseFunc(mouseFunc);
glutMotionFunc(motionFunc);
glutPassiveMotionFunc(motionFunc);
/* Initialize our window. */
InitGL(640, 480);
pwin = OSG::PassiveWindow::create();
pwin->init();
/*
All scene file loading is handled via the SceneFileHandler.
*/
world = OSG::SceneFileHandler::the()->read("Data/tie.wrl");
// create the main scene transformation node
// 1. create the Node
scene =OSG:: Node::create();
// 2. create the core
trans = OSG::Transform::create();
// 3. associate the core with the node
scene->setCore(trans);
scene->addChild(world); // add the world as a child
// create the SimpleSceneManager helper - it will be only partially used
mgr = new OSG::SimpleSceneManager;
// tell the manager what to manage
mgr->setWindow(pwin );
mgr->setRoot (scene);
if (pwin->getMFPort()->size() != 0)
{
OSG::PassiveBackgroundRefPtr bg = OSG::PassiveBackground::create();
vp = pwin->getPort(0);
cam = dynamic_cast<OSG::PerspectiveCamera *>(vp->getCamera());
newcam = OSG::MatrixCamera::create(); // the MatrixCamera will only be a slave to the OpenGL matrices
//.........这里部分代码省略.........
示例11: keyboard
//
// react to keys
//
void keyboard(unsigned char k, int, int)
{
static OSG::Real32 val0 = 0.f;
static OSG::Real32 val1 = 0.f;
static OSG::Real32 x1 = 0.f;
static OSG::Real32 y1 = 0.f;
static OSG::Real32 z1 = 0.f;
static OSG::Real32 x2 = 0.f;
static OSG::Real32 y2 = 0.f;
static OSG::Real32 z2 = 0.f;
switch(k)
{
case ' ':
{
OSG::SceneGraphPrinter sgp(mgr->getRoot());
sgp.printDownTree(std::cout);
}
break;
case '1': // enable/disable clip plane 0
{
vecClipPlaneData[0]._enabled = !vecClipPlaneData[0]._enabled;
updateClipPlanes(vecClipPlaneData);
}
break;
case '2': // enable/disable clip plane 1
{
vecClipPlaneData[1]._enabled = !vecClipPlaneData[1]._enabled;
updateClipPlanes(vecClipPlaneData);
}
break;
case '3': // enable/disable box geometry
{
if(vecGeometries[0] == NULL)
{
OSG::Matrix matrix;
OSG::Vec3f v(10.f, 0.f, 15.f);
matrix.setTranslate(v);
OSG::GeometryRefPtr boxGeo =
OSG::makeBoxGeo(15, 15, 15, 1, 1, 1);
OSG::NodeRefPtr boxTree = buildGeoTree(scene,
boxGeo,
matrix);
vecGeometries[0] = boxTree;
scene->addChild(boxTree);
}
else
{
scene->subChild(vecGeometries[0]);
vecGeometries[0] = NULL;
}
// mgr->showAll();
// mgr->redraw();
}
break;
case '4': // enable/disable torus geometry
{
if (vecGeometries[1] == NULL)
{
OSG::Matrix matrix;
OSG::Vec3f v( 0.f, 10.f, 0.f);
matrix.setTranslate(v);
OSG::GeometryRefPtr torusGeo = OSG::makeTorusGeo(2, 6, 8, 16);
OSG::NodeRefPtr torusTree = buildGeoTree(scene,
torusGeo, matrix);
vecGeometries[1] = torusTree;
scene->addChild(torusTree);
}
else
{
scene->subChild(vecGeometries[1]);
vecGeometries[1] = NULL;
}
// mgr->showAll();
// mgr->redraw();
}
break;
case '5':
{
OSG::SceneFileHandler::the()->write(mgr->getRoot(),
"clipplane_model.osb", true);
}
break;
case 'n': // move clip plane 0 opposite to the normal direction of the plane
{
val0 -= 0.2;
//.........这里部分代码省略.........
示例12: buildGeoTree
//
// build geometry scenegraph Tree
//
//
// We need 3 material groups for the clip plane capping trick:
//
// scene
// |
// +--------------------+--------------------+
// | | |
// group1 (mat1) group2 (mat2) group3 (mat3)
// | | |
// geometry (geo1) geometry (geo2) geometry (geo1)
//
// geo1 : actual geometry to draw
// geo2 : plane geometry coincident with the clip plane
//
// mat1 : has a stencil chunk that clears the stencil buffer first, than
// does the inversion, and has a clip plane chunk that enables one
// clip plane. Sort key 2*i + 0 with i idx of a clip plane.
// mat2 : has a stencil chunk and settings for drawing the clip plane
// geometry. All clip planes but the one coincident with the plane
// are activated. Sort key 2*i + 0 with i idx of a clip plane.
// mat3 : the material used for the actual geometry. All clip planes are
// activated. Sort key none.
//
// For each active clip plane copies of the left two branches need to be
// added.
//
OSG::NodeTransitPtr buildGeoTree( OSG::Node *scene,
OSG::Geometry *geo1,
const OSG::Matrix &matrix)
{
//
// Parent nodes for the left two branches
//
VecNodesT vecMaterialNodes1;
VecNodesT vecMaterialNodes2;
for(int i = 0; i < iNumClipPlanes; ++i) // foreach clip plane
{
//
// Branch 1: Imprint the geometry clip plane intersection into the
// stencil buffer.
//
OSG::NodeRefPtr geomNode = OSG::Node::create();
geomNode->setCore(geo1);
OSG::NodeRefPtr materialNode1 = OSG::Node::create();
//
// Create stencil material core
//
OSG::StencilChunkRefPtr stencilChunk1 = OSG::StencilChunk::create();
stencilChunk1->setClearBuffer(1);
stencilChunk1->setStencilFunc(GL_NEVER);
stencilChunk1->setStencilValue(1);
stencilChunk1->setStencilMask(1);
stencilChunk1->setStencilOpFail(GL_INVERT);
stencilChunk1->setStencilOpZFail(GL_INVERT);
stencilChunk1->setStencilOpZPass(GL_INVERT);
OSG::ChunkMaterialRefPtr mat1 = OSG::ChunkMaterial::create();
mat1->addChunk(stencilChunk1);
mat1->addChunk(vecClipPlaneDetails[i]._clipPlaneChunk);
mat1->setSortKey(2 * i + 0);
OSG::MaterialGroupRefPtr mgrp1 = OSG::MaterialGroup::create();
mgrp1->setMaterial(mat1);
materialNode1->setCore(mgrp1);
materialNode1->addChild(geomNode); // the primary geometry
vecMaterialNodes1.push_back(materialNode1);
//
// Branch 2: Draw plane at places were the stencil buffer is set
//
OSG::NodeRefPtr materialNode2 = OSG::Node ::create();
OSG::StencilChunkRefPtr stencilChunk2 = OSG::StencilChunk::create();
stencilChunk2->setStencilFunc(GL_EQUAL);
stencilChunk2->setStencilValue(1);
stencilChunk2->setStencilMask(1);
stencilChunk2->setStencilOpFail(GL_KEEP);
stencilChunk2->setStencilOpZFail(GL_ZERO);
stencilChunk2->setStencilOpZPass(GL_ZERO);
OSG::SimpleMaterialRefPtr mat2 = OSG::SimpleMaterial::create();
mat2->setDiffuse(vecClipPlaneDetails[i]._planeColor);
mat2->setSpecular(OSG::Color3f(1,1,1));
mat2->setLit(true);
//
// Do clip the plane with all clip planes but the one coincident
// with the plane.
//
for(int j = 0; j < iNumClipPlanes; ++j)
{
if(i != j)
{
//.........这里部分代码省略.........
示例13: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// The scene group
OSG::NodeRefPtr scene = OSG::Node::create();
OSG::GroupRefPtr g = OSG::Group::create();
scene->setCore(g);
if(argc < 2)
{
FWARNING(("No file given!\n"));
FWARNING(("Supported file formats:\n"));
std::list<const char*> suffixes;
OSG::SceneFileHandler::the()->getSuffixList(suffixes);
for(std::list<const char*>::iterator it = suffixes.begin();
it != suffixes.end();
++it)
{
FWARNING(("%s\n", *it));
}
fileroot = OSG::makeTorus(.5, 2, 16, 16);
}
else
{
fileroot = OSG::SceneFileHandler::the()->read(argv[1]);
/*
All scene file loading is handled via the SceneFileHandler.
*/
}
scene->addChild(fileroot);
// Create a small geometry to show the ray and what was hit
// Contains a line and a single triangle.
// The line shows the ray, the triangle whatever was hit.
OSG::SimpleMaterialRefPtr red = OSG::SimpleMaterial::create();
red->setDiffuse (OSG::Color3f( 1,0,0 ));
red->setTransparency(0.5);
red->setLit (false);
isectPoints = OSG::GeoPnt3fProperty::create();
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
isectPoints->addValue(OSG::Pnt3f(0,0,0));
OSG::GeoUInt32PropertyRefPtr index = OSG::GeoUInt32Property::create();
index->addValue(0);
index->addValue(1);
index->addValue(2);
index->addValue(3);
index->addValue(4);
OSG::GeoUInt32PropertyRefPtr lens = OSG::GeoUInt32Property::create();
lens->addValue(2);
lens->addValue(3);
OSG::GeoUInt8PropertyRefPtr type = OSG::GeoUInt8Property::create();
type->addValue(GL_LINES);
type->addValue(GL_TRIANGLES);
testgeocore = OSG::Geometry::create();
testgeocore->setPositions(isectPoints);
testgeocore->setIndices(index);
testgeocore->setLengths(lens);
testgeocore->setTypes(type);
testgeocore->setMaterial(red);
OSG::NodeRefPtr testgeo = OSG::Node::create();
testgeo->setCore(testgeocore);
scene->addChild(testgeo);
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
// tell the manager what to manage
//.........这里部分代码省略.........
示例14: main
// Initialize GLUT & OpenSG and set up the scene
int main(int argc, char **argv)
{
// OSG init
OSG::osgInit(argc,argv);
// GLUT init
int winid = setupGLUT(&argc, argv);
// open a new scope, because the pointers below should go out of scope
// before entering glutMainLoop.
// Otherwise OpenSG will complain about objects being alive after shutdown.
{
// the connection between GLUT and OpenSG
OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create();
gwin->setGlutId(winid);
gwin->init();
// load the scene
OSG::NodeRefPtr scene;
if(argc < 2)
{
FWARNING(("No file given!\n"));
FWARNING(("Supported file formats:\n"));
std::list<const char*> suffixes;
OSG::SceneFileHandler::the()->getSuffixList(suffixes, OSG::SceneFileType::OSG_READ_SUPPORTED);
for(std::list<const char*>::iterator it = suffixes.begin();
it != suffixes.end();
++it)
{
FWARNING(("%s\n", *it));
}
scene = OSG::makeTorus(.5, 2, 16, 16);
}
else
{
/*
All scene file loading is handled via the SceneFileHandler.
*/
scene = OSG::SceneFileHandler::the()->read(argv[1]);
}
OSG::commitChanges();
// calc size of the scene
OSG::Vec3f min, max;
OSG::BoxVolume vol;
scene->getWorldVolume(vol);
vol.getBounds(min, max);
OSG::Vec3f d = max - min;
OSG::Real32 offset = d.length() / 2.0f;
// now create a deep clone
OSG::NodeRefPtr sceneClone = OSG::deepCloneTree(scene);
// this clones all nodes but the cores of type Material and Transform are shared.
//NodePtr sceneClone = deepCloneTree(scene, "Material, Transform");
// now change all geometries from the cloned scene just to show
// that it is a real deep copy.
traverse(sceneClone, &changeGeo);
// create a small scene graph with two transformation nodes.
OSG::NodeRefPtr root = OSG::makeCoredNode<OSG::Group>();
OSG::ComponentTransformRefPtr t1;
OSG::NodeRefPtr tn1 =
OSG::makeCoredNode<OSG::ComponentTransform>(&t1);
OSG::ComponentTransformRefPtr t2;
OSG::NodeRefPtr tn2 =
OSG::makeCoredNode<OSG::ComponentTransform>(&t2);
t1->setTranslation(OSG::Vec3f(- offset, 0.0f, 0.0f));
t2->setTranslation(OSG::Vec3f(offset, 0.0f, 0.0f));
tn1->addChild(scene);
tn2->addChild(sceneClone);
root->addChild(tn1);
root->addChild(tn2);
OSG::commitChanges();
// create the SimpleSceneManager helper
mgr = new OSG::SimpleSceneManager;
// tell the manager what to manage
mgr->setWindow(gwin );
mgr->setRoot (root);
// show the whole scene
mgr->showAll();
}
// GLUT main loop
glutMainLoop();
//.........这里部分代码省略.........
示例15: main
//.........这里部分代码省略.........
light_core = l;
}
break;
/*
The SpotLight adds a direction to the PointLight and a
spotCutOff angle to define the area that's lit. To define the
light intensity fallof within that area the spotExponent field
is used.
Spot lights are very expensive to compute, use them sparingly.
*/
case 2:
{
OSG::SpotLightRefPtr l = OSG::SpotLight::create();
l->setPosition (OSG::Pnt3f(0, 0, 0));
l->setDirection (OSG::Vec3f(0, -1, 0));
l->setSpotExponent (2);
l->setSpotCutOff (OSG::osgDegree2Rad(45));
l->setConstantAttenuation (1);
l->setLinearAttenuation (0);
l->setQuadraticAttenuation (3);
// a little cone to show where the light is
geo_node = OSG::makeCone(.2f, .2f, 8, true, true);
OSG::GeometryRefPtr geo =
dynamic_cast<OSG::Geometry *>(geo_node->getCore());
OSG::SimpleMaterialRefPtr sm =
OSG::SimpleMaterial::create();
sm->setLit(false);
sm->setDiffuse(OSG::Color3f( colors[i][0],
colors[i][1],
colors[i][2] ));
geo->setMaterial(sm);
light_core = l;
}
break;
}
// create the beacon and attach it to the scene
OSG::NodeRefPtr beacon = OSG::Node::create();
OSG::TransformRefPtr beacon_core = OSG::Transform::create();
lightBeacons[i] = beacon_core;
beacon->setCore(beacon_core);
beacon->addChild(geo_node);
scene->addChild(beacon);
light_core->setAmbient (colors[i][0] / scale,
colors[i][1] / scale,
colors[i][2] / scale,
1);
light_core->setDiffuse (colors[i][0] / scale,
colors[i][1] / scale,
colors[i][2] / scale,
1);
light_core->setSpecular(1 / scale,
1 / scale,
1 / scale,
1);
light_core->setBeacon (beacon);
light->setCore(light_core);
light->addChild(lastnode);
lights[i] = light_core;
lastnode = light;
}
scene->addChild(lastnode);
OSG::commitChanges();
// create the SimpleSceneManager helper
mgr = OSG::SimpleSceneManager::create();
// tell the manager what to manage
mgr->setWindow(gwin );
mgr->setRoot (scene);
// switch the headlight off, we have enough lights as is
mgr->setHeadlight(false);
// show the whole scene
mgr->showAll();
}
// GLUT main loop
glutMainLoop();
return 0;
}