// Convenience function to calculate the translation base on a time and // direction parameter. OSG::Vec3f calcTranslation(OSG::Real32 t, OSG::Vec3f dir) { // The 'dir' vector encodes direction and velocity OSG::Real32 v = dir.length(); OSG::Real32 s = v * t; return(dir * s); }
bool ModelData::update() { // -- Update bone parameters -- bool anythingChanged = false; for ( BoneParamsVector::iterator b = bones.begin(), bEnd = bones.end() - 1; b < bEnd; ++b ) { const CalQuaternion& rotation = b->bone->getRotationBoneSpace(); const CalVector& translation = b->bone->getTranslationBoneSpace(); const CalMatrix& rm = b->bone->getTransformMatrix(); const osg::Matrix3 r( rm.dxdx, rm.dydx, rm.dzdx, rm.dxdy, rm.dydy, rm.dzdy, rm.dxdz, rm.dydz, rm.dzdz ); const osg::Vec3f t( translation.x, translation.y, translation.z ); // -- Check for deformed -- b->deformed = // cal3d reports nonzero translations for non-animated models // and non zero quaternions (seems like some FP round-off error). // So we must check for deformations using some epsilon value. // Problem: // * It is cal3d that must return correct values, no epsilons // But nevertheless we use this to reduce CPU load. t.length() > /*boundingBox.radius() **/ 1e-5 // usually 1e-6 .. 1e-7 || osg::Vec3d( rotation.x, rotation.y, rotation.z ).length() > 1e-6 // usually 1e-7 .. 1e-8 ; // -- Check for changes -- float s = 0; for ( int j = 0; j < 9; j++ ) { s += square( r[j] - b->rotation[j] ); } s += ( t - b->translation ).length2(); if ( s < 1e-7 ) // usually 1e-11..1e-12 { b->changed = false; } else { b->changed = true; anythingChanged = true; b->rotation = r; b->translation = t; } // std::cout << "bone: " << b->bone->getCoreBone()->getName() << std::endl // << "quaternion: " // << rotation.x << ' ' // << rotation.y << ' ' // << rotation.z << ' ' // << rotation.w << std::endl // << "translation: " // << t.x() << ' ' << t.y() << ' ' << t.z() // << "; len = " << t.length() // << "; s = " << s // << std::endl // << "; changed = " << b->changed // << std::endl // << "; deformed = " << b->deformed // << std::endl // // << "len / bbox.radius = " << translation.length() / boundingBox.radius() // << std::endl; } return anythingChanged; }
void Node::set_local_end(const osg::Vec3f& local_end) { this->local_end = local_end; length = local_end.length(); length2 = length * length; }
// 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(); return 0; }
void init(std::vector<std::string> &filenames) { size_t i; OSG::DirectionalLightUnrecPtr dl; OSG::Real32 x,y,z; OSG::BoxVolume volume; OSG::Vec3f min,max; OSG::Vec3f size; glEnable( GL_DEPTH_TEST ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); // GLint twoSide = 1; // glLightModeliv(GL_LIGHT_MODEL_TWO_SIDE,&twoSide); glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // create the graph // beacon for camera and light OSG::NodeUnrecPtr b1n = OSG::Node::create(); OSG::GroupUnrecPtr b1 = OSG::Group::create(); b1n->setCore( b1 ); // transformation OSG::NodeUnrecPtr t1n = OSG::Node::create(); OSG::TransformUnrecPtr t1 = OSG::Transform::create(); t1n->setCore( t1 ); t1n->addChild( b1n ); cam_trans = t1; // light OSG::NodeUnrecPtr dlight = OSG::Node::create(); dl = OSG::DirectionalLight::create(); dlight->setCore( dl ); dl->setAmbient( .3f, .3f, .3f, 1 ); dl->setDiffuse( 1, 1, 1, 1 ); dl->setDirection(0,0,1); dl->setBeacon( b1n); // root root = OSG::Node::create(); OSG::GroupUnrecPtr gr1 = OSG::Group::create(); root->setCore( gr1 ); root->addChild( t1n ); root->addChild( dlight ); // Load the file OSG::NodeUnrecPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); OSG::NodeUnrecPtr file; for(i=0;i<filenames.size();i++) { file = OSG::SceneFileHandler::the()->read(filenames[i].c_str(),0); if(file != NULL) scene->addChild(file); else std::cerr << "Couldn't load file, ignoring " << filenames[i] << std::endl; } if ( filenames.size()==0 ) { file = OSG::makeTorus( .5, 2, 16, 16 ); scene->addChild(file); // scene->addChild(makeBox(.6,.6,.6,5,5,5)); } prepareSceneGraph(scene); OSG::Thread::getCurrentChangeList()->commitChanges(); scene->invalidateVolume(); scene->updateVolume(); volume=scene->getVolume(); volume.getBounds(min,max); size = max-min; if(ca>0) { if(cb==-1) cb=ca; if(cc==-1) cc=cb; OSG::NodeUnrecPtr node; OSG::NodeUnrecPtr geoNode; OSG::TransformUnrecPtr trans; for(x=-ca/2.0 ; x<ca/2.0 ; x++) for(y=-cb/2.0 ; y<cb/2.0 ; y++) for(z=-cc/2.0 ; z<cc/2.0 ; z++) { trans=OSG::Transform::create(); node=OSG::Node::create(); node->setCore(trans); trans->editMatrix().setTranslate( x*size[0]*1.1, y*size[1]*1.1, z*size[2]*1.1); geoNode = OSG::cloneTree(scene); geoNode->editSFVolume()->getValue() = scene->getSFVolume()->getValue(); geoNode->editVolume(false).setValid(true); node->addChild( geoNode ); dlight->addChild(node); } } else { dlight->addChild(scene); } if(ca>0) { sum_geometries*=OSG::UInt32(ca*cb*cc); sum_triangles *=OSG::UInt32(ca*cb*cc); sum_positions *=OSG::UInt32(ca*cb*cc); } OSG::Thread::getCurrentChangeList()->commitChanges(); // dlight->invalidateVolume(); printf("update Volume\n"); dlight->updateVolume(); printf("update Volume OK\n"); // should check first. ok for now. const OSG::BoxVolume &vol = dlight->getVolume(); OSG::Pnt3f center; vol.getBounds(min, max); vol.getCenter(center); size = max - min; std::cout << "Volume: from " << min << " to " << max << std::endl; std::cout << "Center: " << center << std::endl; // Camera OSG::PerspectiveCameraUnrecPtr cam = OSG::PerspectiveCamera::create(); cam->setBeacon( b1n ); cam->setFov( OSG::osgDegree2Rad( 60 ) ); cam->setNear( 10 ); cam->setFar( 50000 ); // Solid Background bkgnd = OSG::SolidBackground::create(); bkgnd->setColor( OSG::Color3f(0,0,0) ); // bkgnd->setColor( OSG::Color3f(.1,.1,.6) ); // bkgnd->setColor( OSG::Color3f(1,1,1) ); // Viewport OSG::ViewportUnrecPtr vp1; OSG::ViewportUnrecPtr vp2; if(stereoMode == 0) { vp1 = OSG::Viewport::create(); vp1->setCamera ( cam ); vp1->setBackground( bkgnd ); vp1->setRoot ( root ); vp1->setSize ( 0,0, 1,1 ); if(multiport) { vp2 = OSG::Viewport::create(); vp2->setCamera ( cam ); vp2->setBackground( bkgnd ); vp2->setRoot ( root ); vp2->setSize ( .1f, .55f, .7f,.95f ); } } else if(stereoMode == 1) { OSG::ShearedStereoCameraDecoratorUnrecPtr deco; // left deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(true); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); vp1 = OSG::Viewport::create(); vp1->setCamera ( deco ); vp1->setBackground( bkgnd ); vp1->setRoot ( root ); vp1->setSize ( 0,0, .5,1 ); // right deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(false); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); vp2 = OSG::Viewport::create(); vp2->setCamera ( deco ); vp2->setBackground( bkgnd ); vp2->setRoot ( root ); vp2->setSize ( .5,0,1,1 ); } else if(stereoMode == 2) { OSG::ShearedStereoCameraDecoratorUnrecPtr deco; // left deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(true); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); OSG::ColorBufferViewportUnrecPtr cvp1 = OSG::ColorBufferViewport::create(); cvp1->setCamera ( deco ); cvp1->setBackground( bkgnd ); cvp1->setRoot ( root ); cvp1->setSize ( 0,0, 1,1 ); cvp1->setRed(GL_FALSE); cvp1->setGreen(GL_TRUE); cvp1->setBlue(GL_TRUE); cvp1->setAlpha(GL_TRUE); vp1 = cvp1; // right deco=OSG::ShearedStereoCameraDecorator::create(); deco->setLeftEye(false); deco->setEyeSeparation(eyedistance); deco->setDecoratee(cam); deco->setZeroParallaxDistance(zeroparallax); OSG::ColorBufferViewportUnrecPtr cvp2 = OSG::ColorBufferViewport::create(); cvp2->setCamera ( deco ); cvp2->setBackground( bkgnd ); cvp2->setRoot ( root ); cvp2->setSize ( 0,0,1,1 ); cvp2->setRed(GL_TRUE); cvp2->setGreen(GL_FALSE); cvp2->setBlue(GL_FALSE); cvp2->setAlpha(GL_FALSE); vp2 = cvp2; } GLint glvp[4]; glGetIntegerv( GL_VIEWPORT, glvp ); if(serverx>0 && servery>0) clusterWindow->setSize( serverx, servery ); else clusterWindow->setSize( glvp[2], glvp[3] ); clusterWindow->addPort( vp1 ); if(multiport || stereoMode > 0) clusterWindow->addPort( vp2 ); if(serviceInterfaceValid == true) { clusterWindow->setServiceInterface(serviceInterface); fprintf(stderr, "tcclient use if %s\n", serviceInterface.c_str()); } if(serviceAddressValid == true) { clusterWindow->setServiceAddress(serviceAddress); fprintf(stderr, "tcclient use ba %s\n", serviceAddress.c_str()); } // tball OSG::Vec3f pos(min[0] + ((max[0] - min[0]) * 0.5), min[1] + ((max[1] - min[1]) * 0.5), max[2] + ( max[2] - min[2] ) * 1.5 ); float scale = (max[2] - min[2] + max[1] - min[1] + max[0] - min[0]) / 6; tball.setMode( OSG::Trackball::OSGObject ); tball.setStartPosition( pos, true ); tball.setSum( true ); tball.setTranslationMode( OSG::Trackball::OSGFree ); tball.setTranslationScale(scale); tball.setRotationCenter(center); tball.setTranslationGen(OSG::Trackball::OSGAbsoluteTranslation); // run... std::cout << size.length() << std::endl; cam->setFar (size.length() * 100.0); cam->setNear(size.length() * 100.0 / 100000.0); }