Hi, Here is a simplified version of the code with all of the motion tracking and camera movement taken out. As the code is right now, my program crashes when calling viewer >done() the first time. If I comment out viewer->realize(), the program crashes on the first call to viewer->frame(). If I comment out viewer->realize() and viewer->frame() the the program runs indefinitely.
Code: #include <osg/Geode> #include <osg/Group> #include <osg/MatrixTransform> #include <osg/NodeVisitor> #include <osg/Notify> #include <osg/PositionAttitudeTransform> #include <osg/Quat> #include <osg/TexGen> #include <osgDB/DatabasePager> #include <osgDB/ReadFile> #include <osgDB/Registry> #include <osgUtil/IntersectVisitor> #include <osgUtil/Optimizer> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <gl/gl.h> #include <GL/glu.h> #include <GL/glut.h> #include <stdlib.h> #include <iostream> using namespace std; using namespace osg; #define PI 3.1415926535 float SCREEN_HEIGHT = .03409;//.03409;//7.75; //unit: feet - because near plane was converted from 1.0 to 0.01 float SCREEN_WIDTH = SCREEN_HEIGHT*1.25; //unit: feet float CENTER_HEIGHT = SCREEN_HEIGHT / 2.0; //unit: feet float eye_height = 0.0; //eye height will read from a network shared file at the beginning. float METERS2FEET = 3.28084; //ratio of 1 metre and 1 feet int exptCondition = 0; osgViewer::Viewer *viewer; int main( int argc, char **argv ) { initTracker(); // initialize the viewer. osg::ArgumentParser arguments(&argc,argv); viewer = new osgViewer::Viewer(); /*************************************** ELEVATORS Start of Elevator Scene Graph Code ***************************************/ osg::Group* elevatorRoot = new osg::Group(); //create nodes: later for full tower, consider arrays of nodes osg::Node* elevatorNode = NULL; osg::Node* elevatorShaftNode = NULL; osg::Node* floorNode = NULL; osg::Node* glassNode = NULL; osg::Node* pillarNode = NULL; //create transformers = new osg::Group(); osg::PositionAttitudeTransform* rootPATXform = new osg::PositionAttitudeTransform(); osg::PositionAttitudeTransform* elevatorXform = new osg::PositionAttitudeTransform(); osg::PositionAttitudeTransform* elevatorShaftXform = new osg::PositionAttitudeTransform(); osg::PositionAttitudeTransform* floorXform = new osg::PositionAttitudeTransform(); osg::PositionAttitudeTransform* glassXform = new osg::PositionAttitudeTransform(); osg::PositionAttitudeTransform* pillarXform = new osg::PositionAttitudeTransform(); //create textures osg::Texture2D* elevatorTexture = new osg::Texture2D; osg::Texture2D* elevatorShaftTexture = new osg::Texture2D; osg::Texture2D* floorTexture = new osg::Texture2D; osg::Texture2D* glassTexture = new osg::Texture2D; osg::Texture2D* pillarTexture = new osg::Texture2D; elevatorTexture->setDataVariance(osg::Object::DYNAMIC); elevatorShaftTexture->setDataVariance(osg::Object::DYNAMIC); floorTexture->setDataVariance(osg::Object::DYNAMIC); glassTexture->setDataVariance(osg::Object::DYNAMIC); pillarTexture->setDataVariance(osg::Object::DYNAMIC); //load models elevatorNode = osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Elevators.obj"); elevatorShaftNode = osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorShafts.obj"); floorNode = osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Floor.obj"); glassNode = osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Glass.obj"); pillarNode = osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Pillars.obj"); //add transformers to root //rootnode->addChild(rootPAT); elevatorRoot->addChild(elevatorXform); elevatorRoot->addChild(elevatorShaftXform); elevatorRoot->addChild(floorXform); elevatorRoot->addChild(glassXform); elevatorRoot->addChild(pillarXform); //add models to graph rootPATXform->addChild(elevatorRoot); elevatorXform->addChild(elevatorNode); elevatorShaftXform->addChild(elevatorShaftNode); floorXform->addChild(floorNode); glassXform->addChild(glassNode); pillarXform->addChild(pillarNode); //scale and position elements float rotate = 3.1415926/2.0; Vec3d axis = Vec3d(0,0,1); Vec3d position = Vec3d(-2.0,-1.4,-11.00); Vec3d farPos = Vec3d(5.30,0.0,.00); //Scale and position the floor osg::Quat rootElevatorQuat = floorXform->getAttitude(); rootElevatorQuat.makeRotate(rotate,axis); floorXform->setAttitude(rootElevatorQuat); floorXform->setPosition(position); //Scale and position the elevators rootElevatorQuat = elevatorXform->getAttitude(); rootElevatorQuat.makeRotate(rotate,axis); elevatorXform->setAttitude(rootElevatorQuat); elevatorXform->setPosition(position); //Scale and position the elevator Shafts rootElevatorQuat = elevatorShaftXform->getAttitude(); rootElevatorQuat.makeRotate(rotate,axis); elevatorShaftXform->setAttitude(rootElevatorQuat); elevatorShaftXform->setPosition(position); //Scale and position the glass rootElevatorQuat = glassXform->getAttitude(); rootElevatorQuat.makeRotate(rotate,axis); glassXform->setAttitude(rootElevatorQuat); glassXform->setPosition(position); //scale and position the pillars rootElevatorQuat = pillarXform->getAttitude(); rootElevatorQuat.makeRotate(rotate,axis); pillarXform->setAttitude(rootElevatorQuat); pillarXform->setPosition(position); //load Textures osg::Image* elevatorTextureImage = osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorTexture.jpg"); if (!elevatorTextureImage) { std::cout << " couldn't find elevator texture." << std::endl; } else{ elevatorTexture->setImage(elevatorTextureImage); elevatorNode->getOrCreateStateSet()->setTextureAttributeAndModes( 0, elevatorTexture, osg::StateAttribute::ON); } osg::Image* elevatorShaftTextureImage = osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorShaftTexture.jpg"); if (!elevatorShaftTextureImage) { std::cout << " couldn't find elevator shaft texture." << std::endl; } else{ elevatorShaftTexture->setImage(elevatorShaftTextureImage); elevatorShaftNode->getOrCreateStateSet()->setTextureAttributeAndModes( 0, elevatorShaftTexture, osg::StateAttribute::ON); } osg::Image* floorTextureImage = osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/FloorTexture.jpg"); if (!floorTextureImage) { std::cout << " couldn't find chamber texture." << std::endl; } else{ floorTexture->setImage(floorTextureImage); floorNode->getOrCreateStateSet()->setTextureAttributeAndModes( 0, floorTexture, osg::StateAttribute::ON); } osg::Image* glassTextureImage = osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/GlassTexture.jpg"); if (!glassTextureImage) { std::cout << " couldn't find glass texture." << std::endl; } else{ glassTexture->setImage(glassTextureImage); glassNode->getOrCreateStateSet()->setTextureAttributeAndModes( 0, glassTexture, osg::StateAttribute::ON); } osg::Image* pillarTextureImage = osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/PillarTexture.jpg"); if (!pillarTextureImage) { std::cout << " couldn't find pillar texture." << std::endl; } else{ pillarTexture->setImage(pillarTextureImage); pillarNode->getOrCreateStateSet()->setTextureAttributeAndModes( 0, pillarTexture, osg::StateAttribute::ON); } /*************************************** ELEVATORS End of Elevator Scene Graph Code ***************************************/ viewer->setSceneData(elevatorRoot); osgViewer::Viewer::Windows windows; printf("Reached after user cursor null\n"); osg::ref_ptr<osg::Camera> pcamera = viewer->getCamera(); osg::Matrixd viewMatrix; /********************************************************************** Create two slave cameras ***********************************************************************/ int xoffset = 0; int yoffset = 0; // left window + left slave camera { osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = xoffset + 0; traits->y = yoffset + 0; traits->width = 1280; traits->height = 1040; traits->windowDecoration = false; traits->doubleBuffer = true; traits->sharedContext = 0; osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); osg::ref_ptr<osg::Camera> camera = new osg::Camera; camera->setGraphicsContext(gc.get()); camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height)); GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT; camera->setDrawBuffer(buffer); camera->setReadBuffer(buffer); camera->setNearFarRatio(.00000001); // add this slave camera to the viewer, with a shift left of the projection matrix viewer->addSlave(camera.get(), osg::Matrixd::translate(-0.030,0.0,0.0), osg::Matrixd::rotate(-.13962625, osg::Vec3d(0,1,0))); //0.2268928 } // right window + right slave camera { osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = xoffset + 1280; traits->y = yoffset + 0; traits->width = 1280; traits->height = 1040; traits->windowDecoration = false; traits->doubleBuffer = true; traits->sharedContext = 0; osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); osg::ref_ptr<osg::Camera> camera = new osg::Camera; camera->setGraphicsContext(gc.get()); camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height)); GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT; camera->setDrawBuffer(buffer); camera->setReadBuffer(buffer); camera->setNearFarRatio(.00000001); // add this slave camera to the viewer, with a shift right of the projection matrix viewer->addSlave(camera.get(), osg::Matrixd::translate(-0.030,0.0,0.0), osg::Matrixd::rotate(.13962625, osg::Vec3d(0,1,0))); //0.2268928 } /******************************************************************* ERRORS- Here is where the trouble happens. As the code is right now, my program crashes when calling viewer->done() the first time. If I comment out viewer->realize(), the program crashes on the first call to viewer->frame(). If I comment out viewer->realize() and viewer->frame() the the program runs indefinitely. *******************************************************************/ viewer->realize(); int iter = 0; while( !viewer->done() ) { cout<<"iter: "<<iter<<endl; iter++; viewer->frame(); } return 0; } Thank you! Cheers, Robert[/code] ------------------ Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=39415#39415 _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org