|
小弟初学osg遇到一问题,请各位大侠出手相助,小弟不胜感激~~
我用书上的示例合成了一个程序,我想让视图三中的摄影机作为姿态摄影机,在飞机的侧上方显示飞机的实时姿态,但摄影机不是不随动,就是不显示,应该如何修改?源代码如下:
#include<osgViewer/Viewer>
#include<osgViewer/ViewerEventHandlers>
#include<osgViewer/CompositeViewer>
#include<osg/Node>
#include<osg/Geode>
#include<osg/Geometry>
#include<osg/Group>
#include<osg/Math>
#include<osg/AnimationPath>
#include<osg/PositionAttitudeTransform>
#include<osg/MatrixTransform>
#include<osg/Camera>
#include<osgGA/TrackballManipulator>
#include<osgDB/ReadFile>
#include<osgDB/WriteFile>
#include<osgUtil/Optimizer>
#include<iostream>
osg::ref_ptr<osg::AnimationPath>createAnimationPath(osg::Vec3¢er,float radius,float looptime)
{
osg::ref_ptr<osg::AnimationPath>animationPath=new osg::AnimationPath();
animationPath->setLoopMode(osg::AnimationPath:OOP);
int numPoint=60;
float yaw=0.0f;
float yaw_delta=2.0f*osg:I/((float)(numPoint-1.0f));
float roll=osg::inDegrees(45.0f);
float time=0.0f;
float time_delta=looptime/((float)numPoint);
for(int i=0;i<numPoint;i++)
{
osg::Vec3 position(center+osg::Vec3(sinf(yaw)*radius,cosf(yaw)*radius,0.0f));
osg:uat rotation(osg::Quat(roll,osg::Vec3(0.0,1.0,0.0))*osg::Quat(-(yaw+osg::inDegrees(90.0f)),osg::Vec3(0.0,0.0,1.0)));
animationPath->insert(time,osg::AnimationPath::ControlPoint(position,rotation));
yaw+=yaw_delta;
time+=time_delta;
}
return animationPath.get();
}
int main()
{
osg::ref_ptr<osg::Group>root=new osg::Group();
osg::ref_ptr<osg::Node>ss=osgDB::readNodeFile("cessna.osg");
osg::ref_ptr<osg::Node>node=osgDB::readNodeFile("lz.osg");
const osg::BoundingSphere&nk=node->getBound();
const osg::BoundingSphere&bs=ss->getBound();
osg::Vec3 position=bs.center()+osg::Vec3(0.0f,0.0f,200.0f);
float size=100.0f/bs.radius()*0.3f;
osg::ref_ptr<osg::AnimationPath>animationPath=new osg::AnimationPath();
animationPath=createAnimationPath(position,200.0f,10.0f);
std::string fileName("animation.path");
std:fstream out(fileName.c_str());
animationPath->write(out);
osg::ref_ptr<osg::MatrixTransform>mt=new osg::MatrixTransform();
mt->setDataVariance(osg::Object::STATIC);
mt->setMatrix(osg::Matrix::translate(-bs.center())*osg::Matrix::scale(size,size,size)*osg::Matrix::rotate(osg::inDegrees(-180.0f),(0.0f),0.0f,1.0f));
mt->addChild(ss.get());
osg::ref_ptr<osg::PositionAttitudeTransform>pat=new osg::PositionAttitudeTransform();
pat->setUpdateCallback(new osg::AnimationPathCallback(animationPath,0.0f,1.0f));
pat->addChild(mt);
const osg::BoundingSphere&ps=pat->getBound();
root->addChild(pat.get());
root->addChild(node.get());
osgUtil::Optimizer op;
op.optimize(root.get());
op.optimize(pat.get());
osg::ref_ptr<osgViewer::CompositeViewer>viewer=new osgViewer::CompositeViewer();
osg::ref_ptr<osg::GraphicsContext::Traits>ts=new osg::GraphicsContext::Traits();
ts->x=100;
ts->y=100;
ts->width=900;
ts->height=700;
ts->windowDecoration=true;
ts->doubleBuffer=true;
ts->sharedContext=0;
osg::ref_ptr<osg::GraphicsContext>gc=osg::GraphicsContext::createGraphicsContext(ts.get());
if(gc->valid())
{
osg::notify(osg::INFO)<<"GraphicsWindow has been createa successfully."<<std::endl;
gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f));
gc->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}
else
{
osg::notify(osg::INFO)<<"GraphicsWindow has not been createa successfully."<<std::endl;
}
//视图一
{
osg::ref_ptr<osgViewer::View>view=new osgViewer::View;
viewer->addView(view.get());
view->setSceneData(root.get());
double fovy,aspectRatio,zNear,zFar;
view->getCamera()->getProjectionMatrixAsPerspective(fovy,aspectRatio,zNear,zFar);
double newAspectRatio=double(ts->width*2/3)/double(ts->height);
double aspectRatioChange=newAspectRatio/aspectRatio;
if(aspectRatioChange!=1.0)
{
view->getCamera()->getProjectionMatrix()*=osg::Matrix::scale(1./aspectRatioChange,1.0,1.0);
}
view->getCamera()->setViewport(new osg::Viewport(0,0,ts->width*2/3,ts->height));
view->getCamera()->setGraphicsContext(gc.get());
view->setCameraManipulator(new osgGA::TrackballManipulator);
view->addEventHandler(new osgViewer::StatsHandler);
view->addEventHandler(new osgViewer::WindowSizeHandler);
view->addEventHandler(new osgViewer::ThreadingHandler);
view->addEventHandler(new osgViewer::RecordCameraPathHandler);
}
//视图二
{
osg::ref_ptr<osgViewer::View>view=new osgViewer::View;
viewer->addView(view.get());
osg::ref_ptr<osg::Camera>camera=new osg::Camera();
camera->setViewMatrixAsLookAt(nk.center()+osg::Vec3f(400.0,0.0,0.0),nk.center(),osg::Vec3f(0.0,0.0,-1.0));
camera->addChild(root.get());
view->setSceneData(camera);
double fovy,aspectRatio,zNear,zFar;
view->getCamera()->getProjectionMatrixAsPerspective(fovy,aspectRatio,zNear,zFar);
double newAspectRatio=double(ts->width/3)/double(ts->height/2);
double aspectRatioChange=newAspectRatio/aspectRatio;
if(aspectRatioChange!=1.0)
{
view->getCamera()->getProjectionMatrix()*=osg::Matrix::scale(1./aspectRatioChange,1.0,1.0);
}
view->getCamera()->setViewport(new osg::Viewport(ts->width*2/3,ts->height/2,ts->width/3,ts->height/2));
view->getCamera()->setGraphicsContext(gc.get());
view->setCameraManipulator(new osgGA::TrackballManipulator);
}
//视图三
{
osg::ref_ptr<osgViewer::View>view=new osgViewer::View;
viewer->addView(view.get());
osg::ref_ptr<osg::Camera>camera=new osg::Camera();
camera->setViewMatrixAsLookAt(bs.center()+osg::Vec3f(0.0,0.0,2*bs.radius()),bs.center(),osg::Vec3f(0.0,1.0,0.0));
camera->setProjectionMatrixAsOrtho(-bs.radius(),bs.radius(),-bs.radius(),bs.radius(),2*bs.radius(),300);
camera->addChild(root.get());
view->setSceneData(camera);
double fovy,aspectRatio,zNear,zFar;
view->getCamera()->getProjectionMatrixAsPerspective(fovy,aspectRatio,zNear,zFar);
double newAspectRatio=double(ts->width/3)/double(ts->height/2);
double aspectRatioChange=newAspectRatio/aspectRatio;
if(aspectRatioChange!=1.0)
{
view->getCamera()->getProjectionMatrix()*=osg::Matrix::scale(1./aspectRatioChange,1.0,1.0);
}
view->getCamera()->setViewport(new osg::Viewport(ts->width*2/3,0,ts->width/3,ts->height/2));
view->getCamera()->setGraphicsContext(gc.get());
view->setCameraManipulator(new osgGA::TrackballManipulator);
}
viewer->realize();
viewer->run();
return 0;
} |
|