查看: 1712|回复: 5

模型无法显示在纹理背景前的问题(附新代码)

[复制链接]

该用户从未签到

发表于 2011-3-7 16:35:16 | 显示全部楼层 |阅读模式
在viewer中渲染了一个图像作为窗口的纹理背景,想在背景前方显示一个ive模型,利用了两个camera来实现,代码如下:
  1. -(osg::Node *) create2DBGTexture
  2. {
  3.         // 图像材质
  4.         unsigned int w = SCREEN_WIDTH;
  5.         unsigned int h = SCREEN_HEIGHT;
  6.        
  7.         float vx = (float)w;
  8.         float vy = (float)h;
  9.        
  10.         osg::ref_ptr<osg::Geometry> rectBG_geom = new osg::Geometry;
  11.        
  12.         // 顶点坐标
  13.         osg::Vec3Array * vertices = new osg::Vec3Array;
  14.         vertices->push_back(osg::Vec3(0.0, 0.0, 0.0));
  15.     vertices->push_back(osg::Vec3(0.0, vy, 0.0));
  16.     vertices->push_back(osg::Vec3(vx, vy, 0.0));
  17.     vertices->push_back(osg::Vec3(vx, 0.0, 0.0));
  18.     rectBG_geom->setVertexArray(vertices);
  19.    
  20.         // 材质坐标
  21.     osg::Vec2Array * texcoords = new osg::Vec2Array;
  22.     texcoords->push_back(osg::Vec2(1.0, 0.0625));
  23.     texcoords->push_back(osg::Vec2(1.0, 0.9375));
  24.     texcoords->push_back(osg::Vec2(0.0, 0.9375));
  25.     texcoords->push_back(osg::Vec2(0.0, 0.0625));
  26.     rectBG_geom->setTexCoordArray(0,texcoords);
  27.        
  28.         // 法线
  29.     osg::Vec3Array * normals = new osg::Vec3Array;
  30.     normals->push_back(osg::Vec3(0.0f,0.0f,1.0f));
  31.     rectBG_geom->setNormalArray(normals);
  32.     rectBG_geom->setNormalBinding(osg::Geometry::BIND_OVERALL);

  33.         rectBG_geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,4));
  34.                
  35.         // 材质实例
  36.     osg::ref_ptr<osg::Texture2D> BG_texture = new osg::Texture2D;
  37.     BG_texture->setDataVariance(osg::Object::DYNAMIC);
  38.         BG_texture->setImage(osgDB::readImageFile("BackGround.png"));
  39.         BG_texture->setResizeNonPowerOfTwoHint(false);
  40.         BG_texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST);
  41.         BG_texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST);
  42.                
  43.         // 叶节点
  44.         osg::Geode * BG_geode = new osg::Geode;
  45.         BG_geode->setDataVariance(osg::Object::DYNAMIC);
  46.         BG_geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED);       
  47.         BG_geode->getOrCreateStateSet()->setTextureAttributeAndModes(0,BG_texture,osg::StateAttribute::ON);
  48.     BG_geode->addDrawable(rectBG_geom);

  49.         return BG_geode;
  50. }

  51. -(osg::Group*) createVideoBackground
  52. {
  53.         osg::ref_ptr<osg::Camera> Camera = new osg::Camera;
  54.         Camera->setProjectionMatrixAsOrtho2D(0,SCREEN_WIDTH,0,SCREEN_HEIGHT);
  55.         Camera->setViewMatrix(osg::Matrix::identity());
  56.         Camera->setRenderOrder(osg::Camera::NESTED_RENDER);
  57.         Camera->setClearMask(GL_DEPTH_BUFFER_BIT);
  58.         Camera->getOrCreateStateSet()->setMode(GL_LIGHTING, GL_FALSE);
  59.         Camera->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, GL_FALSE);
  60.         Camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  61.                
  62.         Camera->addChild([self create2DBGTexture]);
  63.        
  64.         return Camera;
  65. }

  66. // 初始化osg组织
  67. -(int)        initOsgTree
  68. {
  69.         int dwError = 0;
  70.        
  71.         // 提示信息?
  72.         osg::setNotifyLevel(osg::DEBUG_INFO);
  73.                
  74.         // 模型相关参数(模型数据、变换矩阵)
  75.         osg::ref_ptr<osg:: MatrixTransform> ModelMatrix = new osg::MatrixTransform();
  76.         ModelMatrix->setMatrix(osg::Matrix::identity());
  77.         osg::ref_ptr<osg::Node> model = (osgDB::readNodeFile("myModel.IVE"));
  78.         ModelMatrix->addChild(model);
  79.         ModelMatrix->getOrCreateStateSet()->setRenderBinDetails(100, "RenderBin");
  80.         // 设置背景
  81.         osg::ref_ptr<osg::Group> videoBackground = [self createVideoBackground];
  82.         videoBackground->getOrCreateStateSet()->setRenderBinDetails(-1, "RenderBin");
  83.        
  84.         // 设置camera
  85.         osg::Matrix projectMatrix;
  86.         projectMatrix.set(myProjectMateix);
  87.         osg::ref_ptr<osg::Camera> cam = new osg::Camera();
  88.         cam->setRenderOrder(osg::Camera::NESTED_RENDER);
  89.         cam->setProjectionMatrix(projectMatrix);
  90.         cam->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  91.         cam->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
  92.        
  93.         cam->addChild(ModelMatrix.get());  // 模型
  94.         cam->addChild(videoBackground.get()); // 背景
  95.        
  96.         // 根节点
  97.         osg::ref_ptr<osg::Group> MARRoot = new osg::Group;
  98.         MARRoot->addChild(cam.get());
  99.                
  100.         // viewer
  101.         osg::ref_ptr<osg:: Viewer> MARViewer = new osgViewer::Viewer();
  102.         MARViewer->setSceneData(MARRoot.get());
  103.        
  104.         MARViewer->realize();
  105.         MARViewer->frame();
  106.        
  107.         osg::setNotifyLevel(osg::INFO);
  108.        
  109.         return dwError;
  110. }
复制代码
这段代码是参考osgART写的,感觉并无什么问题,可是一运行,就死机了,
我跟踪了一下代码,发现是折在“MARViewer->setSceneData(MARRoot.get())”,
跟踪进OSG的源码,最后追到view.cpp中的
        // now make sure the scene graph is set up with the correct DataVariance to protect the dynamic elements of
        // the scene graph from being run in parallel.
        osgUtil::Optimizer::StaticObjectDetectionVisitor sodv;
        getSceneData()->accept(sodv);
这块就跟不下去了,死机了。看注释,好像是我的参数设置的有问题。
能否高人帮我看看我的问题出在哪里,谢谢!!

该用户从未签到

发表于 2011-3-7 17:14:58 | 显示全部楼层
您给出的程序中看不出什么不妥,请检查您的伪代码部分所对应的内容

该用户从未签到

 楼主| 发表于 2011-3-7 17:56:07 | 显示全部楼层
惨,给出的代码就是我的源码了,并无伪代码,其他部分也就是怎么求投影矩阵了,把”cam->setProjectionMatrix(projectMatrix)“注释掉,还是执行不了,难道是RP出现了问题!!!!

该用户从未签到

发表于 2011-3-8 13:44:38 | 显示全部楼层
  1. -(osg::Group*) createVideoBackground
复制代码
既然这样,请告诉我诸如这样的语句都是什么意思。这其中有些决定了您的程序是否能够正常执行。

通过对您的程序中一些不清楚和明显错误的地方进行了修正之后,我现在可以顺利地实现您所说的效果

该用户从未签到

发表于 2011-3-8 18:56:03 | 显示全部楼层
105行 貌似打错了osg::ref_ptr<osg:: Viewer> MARViewer = new osgViewer::Viewer();

该用户从未签到

 楼主| 发表于 2011-3-9 16:25:08 | 显示全部楼层
搞定了,是指针使用的问题,谢谢各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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