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
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org