查看: 1934|回复: 5

如何在已有的OPENGL代码中使用osgViewer显示一三维物体(txp文件)?

[复制链接]

该用户从未签到

发表于 2010-4-26 12:42:27 | 显示全部楼层 |阅读模式
如何在已有的OPENGL代码中使用osgViewer显示一三维物体(txp文件格式)?

目前我可以:使用英文网站中的常见问题答案列表40/100,能实现在OPENGL代码中使用osgUtil::SceneView读取并显示flt格式;但不支持txp格式。
希望得到帮助,最好给个示例代码。

该用户从未签到

发表于 2010-4-26 13:39:47 | 显示全部楼层
OSG以插件形式提供了对txp格式的支持,对它的读入没有什么特殊的

该用户从未签到

 楼主| 发表于 2010-4-26 17:18:50 | 显示全部楼层
本帖最后由 lxz100 于 2010-4-26 17:19 编辑

//
//下述代码展示如何在opengl环境下(例如原有工程在MFC框架下的直接使用opengl代码的环境),使用OSG支持调入OSG支持的模型文件;
//第一种方法,使用osgUtil::SceneView,支持*.osg; *.flt;不支持*.txp
//第二种方法,使用osgViewer::Viewer ,支持*.osg; *.flt;和*.txp
//"lz.osg"在osg的数据目录下有,可从网站上获得;

//第一种方法,完全是照抄网站示例代码
osg::ref_ptr< osgUtil::SceneView > osgviewer;
osg::ref_ptr< osg::FrameStamp > frameStamp;
void UserOSGInit(void)
{
// load the scene.
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("lz.osg");

// create the view of the scene.
if(false) //如果用户发现调入的模型不可见,可能是位置不对;本段可实现将模型摆在坐标原点附近
{
  const osg::BoundingSphere &bbox = loadedModel->getBound();
  osg::ref_ptr<osg::MatrixTransform> mtf = new osg::MatrixTransform();
  osg::Matrix mtx;
  mtx.makeTranslate(-bbox.center());
  mtf->setMatrix(mtx);
  mtf->addChild(loadedModel.get());
  root->addChild(mtf.get());
}
else
  root->addChild(loadedModel.get());
//-----------------------------------------------------
frameNumber = 0;
timer;
start_tick = timer.tick();
  osgviewer = new osgUtil::SceneView();
frameStamp = new osg::FrameStamp();
osgviewer->setDefaults();
osgviewer->setComputeNearFarMode( osgUtil::CullVisitor:O_NOT_COMPUTE_NEAR_FAR );
osgviewer->setSceneData(root.get());
//选择光照模式
osgviewer->setLightingMode( osgUtil::SceneView::NO_LIGHT  );
//osgviewer->setLightingMode( osgUtil::SceneView::SKY_LIGHT  );
//osgviewer->setLightingMode( osgUtil::SceneView::HEADLIGHT );
}
void UserOSGUpdate(void)
{
//保存opengl状态---------------------------------------------------------------
glPushAttrib( GL_ALL_ATTRIB_BITS );
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glMatrixMode( GL_TEXTURE );
glPushMatrix();
glMatrixMode( GL_MODELVIEW );
glPushMatrix();

glDisable(GL_LIGHTING);
//从opengl照搬各种矩阵-------------------------------------------------------
GLint viewParams[4];
glGetIntegerv( GL_VIEWPORT, viewParams );
osgviewer->setViewport( viewParams[0], viewParams[1], viewParams[2], viewParams[3]);
GLfloat glMat[16];
osg::Matrix osgMat;
glGetFloatv( GL_PROJECTION_MATRIX, glMat);
osgMat.set( glMat );
osgviewer->getProjectionMatrix().set( osgMat );
glGetFloatv( GL_MODELVIEW_MATRIX, glMat );
osgMat.set( glMat );
osgviewer->getViewMatrix().set( osgMat );
// update and render the scene graph
double time_since_start = timer.delta_s( start_tick, timer.tick() );
frameStamp->setReferenceTime( time_since_start);
frameStamp->setFrameNumber( frameNumber++ );
osgviewer->setFrameStamp( frameStamp.get());
//
// Lastly, you need to make the actual calls to the SceneView object:
//
osgviewer->update ();
osgviewer->cull ();
osgviewer->draw ();
//恢复opengl状态-----------------------------------------------------------------
glMatrixMode( GL_TEXTURE );
glPopMatrix();
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
glPopAttrib();
}

//第二种方法,学习第一种方法,并从osgviewerGLUT例子中蒙了一个函数setUpViewerAsEmbeddedInWindow();
osg::ref_ptr< osgViewer::Viewer > osgviewer;
osg:bserver_ptr<osgViewer::GraphicsWindow> osgwindow;
void UserOSGInit(void)
{
// load the scene.
osg::ref_ptr<osg::Group> root = new osg::Group;
osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("lz.osg");
// create the view of the scene.
if(false) //如果用户发现调入的模型不可见,可能是位置不对;本段可实现将模型摆在坐标原点附近
{
  const osg::BoundingSphere &bbox = loadedModel->getBound();
  osg::ref_ptr<osg::MatrixTransform> mtf = new osg::MatrixTransform();
  osg::Matrix mtx;
  mtx.makeTranslate(-bbox.center());
  mtf->setMatrix(mtx);
  mtf->addChild(loadedModel.get());
  root->addChild(mtf.get());
}
else
  root->addChild(loadedModel.get());

osgviewer = new osgViewer::Viewer();

//----------------------------------------------------------------
GLint viewParams[4];
glGetIntegerv( GL_VIEWPORT, viewParams );
osgwindow = osgviewer->setUpViewerAsEmbeddedInWindow(viewParams[0], viewParams[1], viewParams[2], viewParams[2]);
// Set the Scene Data
osgviewer->setSceneData(root.get());
// Realize the Viewer
osgviewer->realize();
osgviewer->setLightingMode( osgViewer::Viewer::NO_LIGHT  );
//osgviewer->setLightingMode( osgViewer::Viewer::SKY_LIGHT  );
//osgviewer->setLightingMode( osgViewer::Viewer::HEADLIGHT );
}
void UserOSGUpdate(void)
{
//保存opengl状态----------------------------------------------------------------
glPushAttrib( GL_ALL_ATTRIB_BITS );
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glMatrixMode( GL_TEXTURE );
glPushMatrix();
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glDisable(GL_LIGHTING);
//从opengl照搬各种矩阵------------------------------------------------------------
GLint viewParams[4];
glGetIntegerv( GL_VIEWPORT, viewParams );
osgviewer->getCamera()->setViewport( viewParams[0], viewParams[1], viewParams[2], viewParams[3]);
GLfloat glMat[16];
osg::Matrix osgMat;
glGetFloatv( GL_PROJECTION_MATRIX, glMat);
osgMat.set( glMat );
osgviewer->getCamera()->getProjectionMatrix().set( osgMat );
glGetFloatv( GL_MODELVIEW_MATRIX, glMat );
osgMat.set( glMat );
osgviewer->getCamera()->getViewMatrix().set( osgMat );
//
//调用单帧
osgviewer->frame();
//恢复opengl状态--------------------------------------------------------------
glMatrixMode( GL_TEXTURE );
glPopMatrix();
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
glPopAttrib();
}

该用户从未签到

 楼主| 发表于 2010-4-26 17:22:39 | 显示全部楼层
很荣幸,array能回答。

该用户从未签到

发表于 2010-4-27 00:53:05 | 显示全部楼层
3# lxz100

array,用第二种方法能用osg提供的漫游器吗?

该用户从未签到

发表于 2010-4-27 08:20:59 | 显示全部楼层
我只能判断是您的渲染方案中没有实现osgViewer的某些功能,而这些功能是txp插件所必需的;您可以自行研究一下~~

另一个很简单的可能性是您的模型和您自己设置的观察/投影矩阵不匹配,导致它不能显示在视口中。要注意此时漫游器已经失去作用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表