查看: 1620|回复: 3

【求助】编程指南书中的一个例子

[复制链接]

该用户从未签到

发表于 2010-5-22 16:34:16 | 显示全部楼层 |阅读模式
编程指南书中5.2.14立方图纹理示例的例子,编译成功,运行的时候出错:
skybox.exe 中的 0x005cf567 (msvcp90d.dll) 处未处理的异常: 0xC00000FD: Stack overflow

这是什么问题啊?

该用户从未签到

 楼主| 发表于 2010-5-22 16:35:03 | 显示全部楼层

  1. osg::ref_ptr<osg::TextureCubeMap>readCubeMap()
  2. {
  3.         osg::ref_ptr<osg::TextureCubeMap>cubemap = new osg::TextureCubeMap;

  4.         osg::ref_ptr<osg::Image>imagePosX = osgDB::readImageFile("Cubemap_snow/posx.jpg");
  5.         osg::ref_ptr<osg::Image>imageNegX = osgDB::readImageFile("Cubemap_snow/negx.jpg");
  6.         osg::ref_ptr<osg::Image>imagePosY = osgDB::readImageFile("Cubemap_snow/posy.jpg");
  7.         osg::ref_ptr<osg::Image>imageNegY = osgDB::readImageFile("Cubemap_snow/negy.jpg");
  8.         osg::ref_ptr<osg::Image>imagePosZ = osgDB::readImageFile("Cubemap_snow/posz.jpg");
  9.         osg::ref_ptr<osg::Image>imageNegZ = osgDB::readImageFile("Cubemap_snow/negz.jpg");

  10.         if(imagePosX.get()&&imageNegX.get()&&imagePosY.get()&&imageNegY.get()&&imagePosZ.get()&&imageNegZ.get())
  11.         {
  12.                 cubemap->setImage(osg::TextureCubeMap:OSITIVE_X,imagePosX.get());
  13.                 cubemap->setImage(osg::TextureCubeMap::NEGATIVE_X,imageNegX.get());
  14.                 cubemap->setImage(osg::TextureCubeMap:OSITIVE_Y,imagePosY.get());
  15.                 cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Y,imageNegY.get());
  16.                 cubemap->setImage(osg::TextureCubeMap:OSITIVE_Z,imagePosZ.get());
  17.                 cubemap->setImage(osg::TextureCubeMap::NEGATIVE_Z,imageNegZ.get());

  18.                 cubemap->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE);
  19.                 cubemap->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE);
  20.                 cubemap->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_EDGE);

  21.                 cubemap->setFilter(osg::Texture::MIN_FILTER,osg::Texture:INEAR_MIPMAP_LINEAR);
  22.                 cubemap->setFilter(osg::Texture::MAG_FILTER,osg::Texture:INEAR);
  23.         }
  24.         return cubemap.get();
  25. }

  26. struct TexMatCallback:public osg::NodeCallback
  27. {
  28. public:
  29.         TexMatCallback(osg::TexMat& tm):
  30.           _texMat(tm)
  31.           {
  32.           }
  33.           virtual void operator()(osg::Node* node,osg::NodeVisitor* nv)
  34.           {
  35.                   osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
  36.                   if(cv)
  37.                   {
  38.                           const osg::Matrix& MV = *(cv->getModelViewMatrix());
  39.                           const osg::Matrix R = osg::Matrix::rotate(osg:egreesToRadians(112.0f),0.0f,0.0f,1.0f)*
  40.                                                        osg::Matrix::rotate(osg:egreesToRadians(90.0f),1.0f,0.0f,0.0f);
  41.                           osg:uat q = MV.getRotate();
  42.                           const osg::Matrix C = osg::Matrix::rotate(q.inverse());
  43.                           _texMat.setMatrix(C*R);
  44.                   }
  45.                   traverse(node,nv);
  46.           }
  47.           osg::TexMat& _texMat;
  48. };

  49. class MoveEarthSkyWithEyePointTransform:public osg::Transform
  50. {
  51. public:
  52.         virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv)const
  53.         {
  54.                 osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
  55.                 if(cv)
  56.                 {
  57.                         osg::Vec3 eyePointLocal = cv->getEyeLocal();
  58.                         matrix.preMult(osg::Matrix::translate(eyePointLocal));
  59.                 }
  60.                 return true;
  61.         }
  62.         virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv)const
  63.         {
  64.                 osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
  65.                 if(cv)
  66.                 {
  67.                         osg::Vec3 eyePointLocal = cv->getEyeLocal();
  68.                         matrix.preMult(osg::Matrix::translate(-eyePointLocal));
  69.                 }
  70.                 return true;
  71.         }
  72. };

  73. osg::ref_ptr<osg::Node>createSkyBox()
  74. {
  75.         osg::ref_ptr<osg::StateSet>stateset = new osg::StateSet();
  76.         osg::ref_ptr<osg::TexEnv>te = new osg::TexEnv;
  77.         te->setMode(osg::TexEnv::REPLACE);
  78.         stateset->setTextureAttributeAndModes(0,te.get(),osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);

  79.         osg::ref_ptr<osg::TexGen>tg = new osg::TexGen;
  80.         tg->setMode(osg::TexGen::NORMAL_MAP);
  81.         stateset->setTextureAttributeAndModes(0,tg.get(),osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);

  82.         osg::ref_ptr<osg::TexMat>tm = new osg::TexMat;
  83.         stateset->setTextureAttribute(0,tm.get());
  84.   
  85.         osg::ref_ptr<osg::TextureCubeMap>skymap = readCubeMap();
  86.         stateset->setTextureAttributeAndModes(0,skymap.get(),osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  87.         stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
  88.         stateset->setMode(GL_CULL_FACE,osg::StateAttribute::OFF);

  89.         osg::ref_ptr<osg:epth>depth = new osg:epth;
  90.         
  91.         depth->setFunction(osg:epth::ALWAYS);
  92.         depth->setRange(1.0,1.0);
  93.         stateset->setAttributeAndModes(depth,osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE);
  94.         stateset->setRenderBinDetails(-1,"RenderBin");

  95.         osg::ref_ptr<osg:rawable>drawable = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),1));

  96.         osg::ref_ptr<osg::Geode>geode = new osg::Geode;
  97.         geode->setCullingActive(false);
  98.         geode->setStateSet(stateset.get());
  99.         geode->addDrawable(drawable.get());

  100.         osg::ref_ptr<osg::Transform>transform = new MoveEarthSkyWithEyePointTransform();
  101.         transform->setCullingActive(false);
  102.         transform->addChild(transform.get());

  103.         osg::ref_ptr<osg::ClearNode> clearNode = new osg::ClearNode;
  104.         clearNode->setCullCallback(new TexMatCallback(*tm));
  105.         clearNode->addChild(transform.get());

  106.         return clearNode.get();
  107. }

  108. int main()
  109. {
  110.         osg::ref_ptr<osgViewer::Viewer>viewer = new osgViewer::Viewer();

  111.         osg::ref_ptr<osg::Group>rootnode = new osg::Group();

  112.         rootnode->addChild(createSkyBox());

  113.         osgUtil::Optimizer optimizer;
  114.         optimizer.optimize(rootnode.get());
  115.         viewer->setSceneData(rootnode.get());
  116.         viewer->realize();
  117.         viewer->run();
  118.         return 0;
  119. }
复制代码

该用户从未签到

发表于 2010-5-22 22:10:27 | 显示全部楼层
程序没有任何问题,,可能是您的环境有问题~~~~~你可以设置断点,一步一步调试,,或者是库的问题~~~~~

该用户从未签到

发表于 2010-5-23 08:32:13 | 显示全部楼层

  1. //transform->addChild(transform.get());
复制代码

  1. transform->addChild(geode.get());
复制代码
早上起来又细看了一下代码,不知道您的程序是从哪里抄的,书中肯定不是这样写的~~~~~··
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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